【问题标题】:How I can process a checkbox column from Yii2 gridview?如何处理来自 Yii2 gridview 的复选框列?
【发布时间】:2016-09-25 05:27:52
【问题描述】:

我需要从 gridview 小部件视图中的一组复选框将行插入到表中。

我的 _add.php 代码:

$itemsQuery = Inventory::find();
$itemsQuery->andFilterWhere(['inv_status' => 1, 'inv_condition' => 2]);
$dataProvider = new ActiveDataProvider([
                                       'query' => $itemsQuery,
                                       ]);
echo GridView::widget([
    'id' => 'griditems',
    'dataProvider' => $dataProvider,
    'columns' => [
        ['attribute' => 'inv_group', 'value' => 'invGroup.inv_group'],
        ['attribute' => 'inv_class', 'value' => 'invClass.inv_class'],
        'brand',
        'model',
        'description',
        ['class' => 'yii\grid\CheckboxColumn'],
    ],
]);

我尝试过使用 JavaScript,但无法获得结果:

$('element').one('click',function() {
var keys = $('#griditems').yiiGridView('getSelectedRows');
$.post({
   url: 'picked-items/processselected', // your controller action
   dataType: 'json',
   data: {keylist: keys},
   success: function(data) {
      if (data.status === 'success') {
          alert('Total price is ' + data.total);
      }
   },
});
});

我尝试了几种可能的解决方案,但都没有结果,我阅读了文档、博客、论坛,但我做不到。

如何将来自 gridview 表中的一组复选框的数据处理到我的控制器中?

【问题讨论】:

标签: gridview checkbox yii2


【解决方案1】:

你可以不用javascript

在您的GridView 中更改['class' => 'yii\grid\CheckboxColumn'] 显示以下代码

我的 _add.php

$itemsQuery = Inventory::find();
$itemsQuery->andFilterWhere(['inv_status' => 1, 'inv_condition' => 2]);
$dataProvider = new ActiveDataProvider(['query' => $itemsQuery]);
echo GridView::widget([
   'id' => 'griditems',
   'dataProvider' => $dataProvider,
   'columns' => [
      [
         'attribute' => 'inv_group', 
         'value' => 'invGroup.inv_group'
      ],
      [
          'attribute' => 'inv_class', 
          'value' => 'invClass.inv_class'
      ],
      'brand',
      'model',
      'description',
      [
          'class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => function($model) {
                return ['value' => $model->Your_unique_id];
            },
      ],
   ],
]);

现在访问controller 中的复选框选定数据。在您的控制器中添加以下代码以访问选定的行

Yii::$app->request->post('selection');

【讨论】:

  • 非常感谢!!真的,我没有尝试过您的解决方案,但我相信这可以工作。请阅读我的自我回答以获取建议。
  • @vishub Halo,我已经尝试过这个建议,但我在尝试加载 gridview 时遇到了这样的错误 array_merge(): Argument #2 is not an array页面。
  • @Archibald 请详细说明
  • @vishub 感谢关注,您可以查看here
  • @vishuB 如何将选定的行发送到控制器?谢谢!
【解决方案2】:

这里是我的解决方案。请,cmets

在我的 _add.php 中

<?php
$itemsQuery = Inventory::find();
$itemsQuery->andFilterWhere(['inv_status' => 1, 'inv_condition' => 2]);
$dataProvider = new ActiveDataProvider([
                                       'query' => $itemsQuery,
                                       ]);
echo GridView::widget([
    'id' => 'griditems',
    'dataProvider' => $dataProvider,
    'columns' => [
        ['attribute' => 'inv_group', 'value' => 'invGroup.inv_group'],
        ['attribute' => 'inv_class', 'value' => 'invClass.inv_class'],
        'brand',
        'model',
        'description',
        ['class' => 'yii\grid\CheckboxColumn', 'checkboxOptions' => ['onclick' => 'js:addItems(this.value, this.checked)']],
    ],
]);
?>

在 JavaScript 中

function addItems(item_id, checked){
var pick_id = getUrlVars()["id"];
// alert(checked);
if(checked){
    $.ajax({
    url: 'index.php',
    method: 'get',
    dataType: 'text',
    data: {r:'picked-items/add', item:item_id, pick:pick_id}
    }).done(function(){alert('added')}).error(function(){alert('there was a problem...!')});
}
else{
    $.ajax({
    url: 'index.php',
    method: 'get',
    dataType: 'text',
    data: {r:'picked-items/deselect', item:item_id, pick:pick_id}
    }).done(function(){alert('deselected')}).error(function(){alert('there was a problem...!')});        
}}

在我的控制器中

    public function actionDeselect()
{
    $picking_list = Yii::$app->request->get('pick');
    $item_id = Yii::$app->request->get('item');
    $deselectModel = PickedItems::find()->where(['item_id' => $item_id, 'picking_list' => $picking_list])->one();
    $itemAdded = Inventory::find()->where(['inv_id' => $item_id])->one();
    $itemAdded->inv_status = 1;
    $itemAdded->current_ot = '0';
    $deselectModel->delete();
    $itemAdded->save();
}

public function actionAdd()
{
    $picking_list = Yii::$app->request->get('pick');
    $item_id = Yii::$app->request->get('item');        
    $itemAdded = Inventory::find()->where(['inv_id' => $item_id])->one();
    $currentPicking = PickingList::find()->where(['pick_id' => $picking_list])->one();
    $currentOt = Ot::find()->where(['ot_id' => $currentPicking->ot_id])->one();
    if($itemAdded->composition === 2){
        $parentGroup = $itemAdded->parent_code;
        $otherItems = Inventory::find()->where(['parent_code' => $parentGroup])->all();
        foreach($otherItems as $item){
            $addModel = new PickedItems();
            $addModel->picking_list = $picking_list;
            $addModel->item_id = $item->inv_id;
            $addModel->save();
            $item->inv_status = 2;
            $item->current_ot = $currentOt->ot_id;
            $item->save();
        }
    }
    else{
        $addModel = new PickedItems();
        $addModel->picking_list = $picking_list;
        $addModel->item_id = $item_id;
        $addModel->save();
        $itemAdded->inv_status = 2;
        $itemAdded->current_ot = $currentOt->ot_id;
        $itemAdded->save();
    }   
}

这里解释一下:当一个项目的组成值为2时,我需要批量添加项目...,然后,我找到所有具有相同parent_code的项目并更新。

但是,我尝试在 javascript 中使用 POST 方法,但不起作用...,

形成您的帮助,谢谢!!!

【讨论】:

    【解决方案3】:

    最好使用beginForm。

    将 GridView 放入表单中。

    示例

    <?=Html::beginForm(['processselected'],'post');?>
    <?=Html::dropDownList('action','',['0'=>'a','1'=>'b'],['class'=>'dropdown',])?>
    
    <?= GridView::widget([
        'id' => 'griditems',
        'dataProvider' => $dataProvider,
        'columns' => [
            'id',
            ['attribute' => 'inv_group', 'value' => 'invGroup.inv_group'],
           //...
            ['class' => 'yii\grid\CheckboxColumn'],
        ],
    
    ]); ?>
    
    <?=Html::submitButton('Send', ['class' => 'btn btn-primary']);?>
    <?= Html::endForm();?> 
    

    在控制器中:

    public function actionProcessselected(){
        $action = Yii::$app->request->post('action'); // dropDown (array)
        $select = Yii::$app->request->post('selection'); //checkbox (array)
    
        foreach($select as $id){
            $model= Inventory::findOne((int)$id);
            #code...
        }
     }
    

    祝你好运。

    【讨论】:

    • 我已经尝试过你的方法,但它不起作用,你能看看我的question吗?
    【解决方案4】:
    <?= GridView::widget([
                         'id' => 'result_data',
                         'dataProvider' => $dataProvider,
                         'columns' => [
                                [
                                'class' => 'yii\grid\CheckboxColumn',
                                'checkboxOptions' => function($dataProvider) {
                                 return ["value" => ($dataProvider['tiIsPaid'] == 0) ? $dataProvider['iPlantEarningId'] : '', "style" => ($dataProvider['tiIsPaid'] == 0) ? '' : 'display:none'];
                                 },],
                                 ],
    
                       ]); ?>
    

    在 Javascript 中

      <script>
             function deletePost()
              {
                var selectedItems = [];
                $('input[name="selection[]"]:checked').each(function () {
                if ($(this).val() != '')
                {
                  selectedItems.push($(this).val());
                }
              });
            if (selectedItems == '')
        {
            alert('Please select atleast one record to delete.');
            return false;
        }
    
        if (confirm('Are you sure you want to pay ?'))
        {
            $.ajax({
                type: "POST",
                url: '<?php echo Yii::$app->request->baseUrl . '/user-posts/deletePost' ?>',
                data: {iPlantEarningId: selectedItems, multiple: 1},
                success: function (data)
                {
                    alert(data);
                    location.reload();
                },
                error: function (data) {
                    alert('Something went wrong. Please try again.');
                    $('#loading').modal('hide');
                    return false;
                },
            });
        }
    }
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2018-02-11
      • 2019-10-10
      • 1970-01-01
      相关资源
      最近更新 更多