После тщательного написания кода от http://demos.telerik.com/php-ui/grid/foreignkeycolumn в моем TestPage.php (просто изменяя соединение с базой данных) и используя точно файл DaraSourceResult.php в демоверсии, он по-прежнему обнаружил 2 ошибки:
1) Когда сетка рендерится, она приносит данные из базы данных, но столбец ForeignKey становится пустым.
2) Если вы щелкнете по столбцу внешнего ключа, он успешно покажет CategoryNames из базы данных, но он не будет работать, когда вы выберете одну категорию, возможно, потому, что он пытается использовать текст в числовом поле.
Я приложил изображение, показывающее каждую из ошибок, описанных выше. Также ниже идет мой код, используемый в TestPage.php.
Не могли бы вы помочь мне исправить эти 2 ошибки?
Большое спасибо!
Картинка с ошибками, описанными выше
<?php
require $_SERVER['DOCUMENT_ROOT'] . '/lib/Kendo/Autoload.php';
require $_SERVER['DOCUMENT_ROOT'] . '/lib/DataSourceResult.php';
?><?php
$result = new DataSourceResult('mysql:host=localhost;dbname=db', 'user', '******'); //okif ($_SERVER['REQUEST_METHOD'] == 'POST') {
header('Content-Type: application/json');
$request = json_decode(file_get_contents('php://input'));
$type = $_GET['type'];
$columns = array('PKEntrada', 'Descricao', 'Valor', 'FKCategoriaEntrada');
switch($type) {
case 'create':
$result = $result->create('tblentradas', $columns, $request->models, 'PKEntrada');
break;
case 'read':
$result = $result->read('tblentradas', $columns, $request);
break;
case 'update':
$result = $result->update('tblentradas', $columns, $request->models, 'PKEntrada');
break;
case 'destroy':
$result = $result->destroy('tblentradas', $request->models, 'PKEntrada');
break;
}
echo json_encode($result);
exit;
}
?><!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="styles/kendo.common.min.css" />
<link href="styles/kendo.bootstrap.min.css" rel="stylesheet" /><script src="js/jquery.min.js"></script>
<script src="js/kendo.all.min.js"></script>
</head>
<body><?php
$categories = $result->read('tblcategoriasentrada', array('PKCategoriaEntrada as value', 'Categoria as text'));$transport = new \Kendo\Data\DataSourceTransport();
$create = new \Kendo\Data\DataSourceTransportCreate();
$create->url('TestPage.php?type=create')
->contentType('application/json')
->type('POST');
$read = new \Kendo\Data\DataSourceTransportRead();
$read->url('TestPage.php?type=read')
->contentType('application/json')
->type('POST');
$update = new \Kendo\Data\DataSourceTransportUpdate();
$update->url('TestPage.php?type=update')
->contentType('application/json')
->type('POST');
$destroy = new \Kendo\Data\DataSourceTransportDestroy();
$destroy->url('TestPage.php?type=destroy')
->contentType('application/json')
->type('POST');
$transport->create($create)
->read($read)
->update($update)
->destroy($destroy)
->parameterMap('function(data) {
return kendo.stringify(data);
}');
$model = new \Kendo\Data\DataSourceSchemaModel();
$productIDField = new \Kendo\Data\DataSourceSchemaModelField('PKEntrada');
$productIDField->type('number')
->editable(false)
->nullable(true);
$productNameField = new \Kendo\Data\DataSourceSchemaModelField('Descricao');
$productNameField->type('string')
->validation(array('required' => true));
$unitPriceValidation = new \Kendo\Data\DataSourceSchemaModelFieldValidation();
$unitPriceValidation->required(true)
->min(1);
$unitPriceField = new \Kendo\Data\DataSourceSchemaModelField('Valor');
$unitPriceField->type('number')
->validation($unitPriceValidation);
$categoryIDField = new \Kendo\Data\DataSourceSchemaModelField('FKCategoria');
$categoryIDField->type('number');$model->id('PKEntrada')
->addField($productIDField)
->addField($productNameField)
->addField($unitPriceField)
->addField($categoryIDField);
$schema = new \Kendo\Data\DataSourceSchema();
$schema->data('data')
->errors('errors')
->model($model)
->total('total');
$dataSource = new \Kendo\Data\DataSource();
$dataSource->transport($transport)
->batch(true)
->pageSize(30)
->schema($schema);
$grid = new \Kendo\UI\Grid('grid');
$productName = new \Kendo\UI\GridColumn();
$productName->field('Descricao')
->title('Description');
$unitPrice = new \Kendo\UI\GridColumn();
$unitPrice->field('Valor')
->format('{0:c}')
->width(200)
->title('Value');
$categoryID = new \Kendo\UI\GridColumn();
$categoryID->field('FKCategoria')
->title('FKCategory')
->values($categories['data'])
->width(200);
$command = new \Kendo\UI\GridColumn();
$command->addCommandItem('destroy')
->title(' ')
->width(150);
$grid->addColumn($productName, $categoryID, $unitPrice, $command)
->dataSource($dataSource)
->addToolbarItem(new \Kendo\UI\GridToolbarItem('create'),
new \Kendo\UI\GridToolbarItem('save'), new \Kendo\UI\GridToolbarItem('cancel'))
->height(540)
->navigatable(true)
->editable(true)
->groupable(true)
->pageable(true);
echo $grid->render();
?>
Я нашел ошибку. У меня была просто проблема с именами полей столбцов в переменных. Вместо того, чтобы использовать FKCategoriaEntrada, он пытался использовать FKCategoria.
Код работает без сбоев. Вы можете использовать его при необходимости.
Других решений пока нет …