【问题标题】:Yii2 grid updating with editable field带有可编辑字段的 Yii2 网格更新
【发布时间】:2014-11-29 22:35:46
【问题描述】:

我在http://webtips.krajee.com/setup-editable-column-grid-view-manipulate-records/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 字段添加到可编辑小部件中的视图中,以便将这些值传递给控制器​​(以便加载和保存知道要更新哪个记录)或者是否有其他方法控制器处理这个?

【问题讨论】:

    标签: php gridview yii2


    【解决方案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;
    

    我从来没有使用过这个小部件,所以我可能错了。

    【讨论】:

    • 感谢收看。我相信可编辑键以某种方式将键映射到记录。在 demos.krajee.com 示例中查看 firebug 并与我自己的代码进行比较,我发现它们具有 editableKey = 1 而我的代码具有 editableKey = "a:2:{s:7:"key1";i:1;s :10:"key2";i:2;}" - 不确定 yii2 是如何处理这个问题的 - 会做一些进一步的挖掘。
    • 你确定不是我说的?通过查看它们在控制器中的代码,我在其中的任何地方都看不到 editableKey 或 editableIndex。首先,我和您一样认为他们可能会使用这些字段,但我看不出他们会在哪里使用。
    【解决方案2】:

    我通过一些实验找到了解决方案。我不得不反序列化 $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();
        ...
    

    谢谢你的建议

    【讨论】:

      【解决方案3】:

      我还在寻找使用可编辑列更新表格的解决方案。查看 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-&gt;findModel($_id); 现在您可以更新多个可编辑列,只需添加这样的条件

      if (isset($posted['buy_amount'])) 
      {
        $output =  $model->buy_amount;
      }
      

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 2017-08-26
        相关资源
        最近更新 更多