我按照帖子在网格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>
控制器如何知道要更新的记录,因为我只传递了“&#39;值”&#39;字段,而不是键?
我是否需要将这些key1和key2字段添加到可编辑小部件中的视图中,以便将这些值传递给控制器(以便加载和保存知道要更新的记录)或是否有其他方式控制器处理这个?
答案 0 :(得分:1)
在此页面上的示例中http://demos.krajee.com/grid-demo(您也可以看到列定义),您可以看到firebug发送了以下值:
Book[5][buy_amount] 1
_csrf MEQ0NnEzNjFhd2dBB2wBCHN0cGVCA3lfZHF1TDReRlAAcQNUPUFjBQ==
editableIndex 5
editableKey 6
hasEditable 1
我相信Book [5]中的5可能与记录的索引相匹配。
这一部分是从我看到的那样做的
$post = [];
$posted = current($_POST['Book']);
$post['Book'] = $posted;
我从未使用过小部件,所以我可能错了。
答案 1 :(得分:1)
我通过一些实验找到了解决方案。我不得不反序列化$ editableKey值并从中提取我的关键字段值。然后我打电话给“找模特”#39;加载要更新的记录。
更新的控制器代码如下:
$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();
...
感谢您的建议
答案 2 :(得分:0)
我还在寻找使用可编辑列更新表格的解决方案。看看ajax帖子,我得到了类似这样的输出:
Book[5][buy_amount] 1
_csrf MEQ0NnEzNjFhd2dBB2wBCHN0cGVCA3lfZHF1TDReRlAAcQNUPUFjBQ==
editableIndex 5
editableKey 6
hasEditable 1
这里我发现editableKey的值是表的id值。 因此,要更新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;
}
谢谢!