Я следовал за постом по настройке редактируемого поля в сетке здесь http://webtips.krajee.com/setup-editable-column-grid-view-manipulate-records/
Кажется, все работает — я нажимаю на поле, меняю его значение, и оно показывает обновленное значение в сетке. Однако — в следующий раз, когда я обновлюсь, значение вернется к исходному значению.
Я сделал небольшую отладку, и, похоже, сбой сохранения в контроллере.
В моей таблице есть два ключевых поля (key1 и key2) и поле значений. Я пытаюсь обновить это поле значения.
Мой код просмотра выглядит следующим образом:
$gridColumns = [
'AnotherField',
[
'class' => 'kartik\grid\EditableColumn',
'attribute'=>'value',
'label' => 'some value',
'editableOptions'=> [
'header' => 'profile',
'format' => Editable::FORMAT_BUTTON,
]
];
...
...
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns
]) ?>
и код контроллера выглядит следующим образом:
<snip>
//default code from gii-generated controller
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
// orig post said to use this: $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams());
// Validate if there is an editable input saved via AJAX
if (Yii::$app->request->post('hasEditable')) {
$model = new MyTable;
$post = [];
$posted = current($_POST['MyTable']);
$post['MyTable'] = $posted;
// Load model like any single model validation
if ($model->load($post)) {
// When doing $result = $model->save(); I get a return value of false
$model->save();
$out = Json::encode(['output'=>$output, 'message'=>'']);
}
// Return AJAX JSON encoded response and exit
echo $out;
return;
}
// Non-AJAX - render the grid by default
</snip>
Как контроллер узнает, какую запись обновлять, поскольку я передаю только поле «значение», а не ключи?
Нужно ли мне каким-то образом добавлять эти поля key1 и key2 в представление в редактируемом виджете, чтобы эти значения передавались в контроллер (чтобы загрузка и сохранение знали, какую запись обновлять) или существует какой-то другой способ, которым контроллер справится с этим?
В примере на этой странице http://demos.krajee.com/grid-demo (вы также можете увидеть определение столбца) вы можете увидеть с firebug, что отправляются следующие значения:
Book[5][buy_amount] 1
_csrf MEQ0NnEzNjFhd2dBB2wBCHN0cGVCA3lfZHF1TDReRlAAcQNUPUFjBQ==
editableIndex 5
editableKey 6
hasEditable 1
Я полагаю, что 5 в Книге [5], вероятно, совпадает с индексом записи.
Эта часть делает то, что я вижу
$post = [];
$posted = current($_POST['Book']);
$post['Book'] = $posted;
Я никогда не использовал виджет, поэтому я могу ошибаться.
Я нашел решение с некоторыми экспериментами. Мне пришлось десериализовать значение $ editableKey и извлечь из него значения моего ключевого поля. Затем я вызываю ‘findModel’, чтобы загрузить запись, которая будет обновлена.
Обновленный код контроллера выглядит следующим образом:
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
// Validate if there is an editable input saved via AJAX
if (Yii::$app->request->post('hasEditable')) {
$keys = unserialize(Yii::$app->request->post('editableKey'));
$model = $this->findModel($keys['key1'], $keys['key2']);
// Store a default JSON response as desired by editable
$out = Json::encode(['output'=>'', 'message'=>'']);
// Fetch the first entry in posted data (there should only be one
// entry anyway in this array for an editable submission)
$values = current($_POST['MyTable']);
// Load model like any single model validation
if ($model->key1) {
// Update the Profile with the new value passed in
$model->value = $values['value'];
$model->save();
...
Спасибо за совет
Я также искал решение для обновления таблицы с использованием редактируемой колонки. Глядя на сообщение AJAX, я получил примерно такой вывод:
Book[5][buy_amount] 1
_csrf MEQ0NnEzNjFhd2dBB2wBCHN0cGVCA3lfZHF1TDReRlAAcQNUPUFjBQ==
editableIndex 5
editableKey 6
hasEditable 1
Здесь я нашел значение editableKey это значение идентификатора таблицы.
Поэтому, чтобы обновить конкретную строку в столбце gridview, я использовал editableKey и обновлял на его основе.
В контроллере:
if (Yii::$app->request->post('hasEditable')) {
$_id=$_POST['editableKey'];
$model = $this->findModel($_id);
$post = [];
$posted = current($_POST['MyTable']);
$post['MyTable'] = $posted;
// Load model like any single model validation
if ($model->load($post)) {
// When doing $result = $model->save(); I get a return value of false
$model->save();
if (isset($posted['buy_amount']))
{
$output = $model->buy_amount;
}
$out = Json::encode(['output'=>$output, 'message'=>'']);
}
// Return AJAX JSON encoded response and exit
echo $out;
return;
}
Я просто получаю данные с помощью $_id=$_POST['editableKey'];
и установить мой $model
как $model = $this->findModel($_id);
Теперь вы можете обновить несколько редактируемых столбцов, просто добавив условие, как это
if (isset($posted['buy_amount']))
{
$output = $model->buy_amount;
}
Спасибо!