Обновление сетки Yii2 с редактируемым полем

Я следовал за постом по настройке редактируемого поля в сетке здесь 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 в представление в редактируемом виджете, чтобы эти значения передавались в контроллер (чтобы загрузка и сохранение знали, какую запись обновлять) или существует какой-то другой способ, которым контроллер справится с этим?

1

Решение

В примере на этой странице 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;

Я никогда не использовал виджет, поэтому я могу ошибаться.

1

Другие решения

Я нашел решение с некоторыми экспериментами. Мне пришлось десериализовать значение $ 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();
...

Спасибо за совет

1

Я также искал решение для обновления таблицы с использованием редактируемой колонки. Глядя на сообщение 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;
}

Спасибо!

0
По вопросам рекламы [email protected]