使用可编辑字段更新Yii2网格

时间:2014-11-29 22:35:46

标签: php gridview 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>

控制器如何知道要更新的记录,因为我只传递了“&#39;值”&#39;字段,而不是键?

我是否需要将这些key1和key2字段添加到可编辑小部件中的视图中,以便将这些值传递给控制器​​(以便加载和保存知道要更新的记录)或是否有其他方式控制器处理这个?

3 个答案:

答案 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;
}

谢谢!