Submit CGridView Checked values using a form

后端 未结 3 1587
北海茫月
北海茫月 2021-01-20 08:09

I have a CGridView wigdet with CCheckBoxColumn like this:

$this->widget(\'zii.widgets.grid.CGridView\', array(
    \'dataProvider\'=>$dataProvider,
            


        
相关标签:
3条回答
  • 2021-01-20 08:37

    If you wrap your Gridview into a simple form you can send the checkboxs selected to the value,

    An example:

    View

    <form id="frmSubmit">
    <?php
    echo CHtml::dropDownList('user_id'
            , null
            , CHtml::listData(User::model()->findAll(), 'USER_ID', 'FULLNAME')
    );
    
    echo CHtml::ajaxSubmitButton('Save'
                                , Yii::app()->createUrl('query/ajaxUpdate')
                                , array('success' => 'js:reloadGrid', )
                                , array('class' => 'btn btn-success'));
    
    $this->widget('zii.widgets.grid.CGridView', array(
        'id'=>'query-grid',
        'dataProvider'=>$model->search(),
        'filter'=>$model,
        'columns'=>array(
            array(
                'id' => 'query',
                'class'=>'CCheckBoxColumn',
                'selectableRows' => '2',
            ),
            'Contact',
            'Email',
            'Company',
        ),
    )); ?>
    </form>
    
    <script type="text/javascript">
    function reloadGrid(data) {
        $.fn.yiiGridView.update('query-grid');
    }
    </script>
    

    Controller

    public function actionAjaxUpdate()
    {
        var_dump($_POST);
    }
    
    0 讨论(0)
  • 2021-01-20 08:41

    This one works with CSRF protection and updates the GridView.

    <?php
    echo CHtml::ajaxLink('ClickMe',Yii::app()->createUrl('controller/action'),
    array(
    'type'=>'POST',
    'data'=>'js:{"ids" : $.fn.yiiGridView.getChecked("grid_view_id","check_box_id").toString(),"YII_CSRF_TOKEN" : "'.Yii::app()->request->csrfToken.'"}',
    'success'=>"$('#grid_view_id').yiiGridView.update('grid_view_id')"
    ));
    ?>
    
    0 讨论(0)
  • 2021-01-20 08:47

    You do not absolutely need another form. You can just use a link with additional javascript attached to it.

    To get the checked values, you can call the javascript function $.fn.yiiGridView.getChecked(containerID,columnID), see here, it returns an array containing the ids.

    Full example (with ajax):

    In your view:

    <?php
    $this->widget('zii.widgets.grid.CGridView', array(
       'id'=>'example-grid-view-id', // the containerID for getChecked
       'dataProvider'=>$dataProvider,
       'columns'=>array(
           array(
               'class'=>'CCheckBoxColumn',
               'id'=>'example-check-boxes' // the columnID for getChecked
           ),
           'title',
           ....
       ),
    ));
    ?>
    <div id="for-link">
    <?php
       echo CHtml::ajaxLink('SomeLink',Yii::app->createUrl('somecontroller/someaction'),
            array(
               'type'=>'POST',
               'data'=>'js:{theIds : $.fn.yiiGridView.getChecked("example-grid-view-id","example-check-boxes").toString()}'
               // pay special attention to how the data is passed here
            )
       );
    ?>
    <div>
    

    In your controller:

    ...
    public function actionSomeaction(){
        if(isset($_POST['theIds'])){
              $arra=explode(',', $_POST['theIds']);
              // now do something with the ids in $arra
              ...
        }
        ...
    }
    ...
    

    You could also use json string, instead of simple string, in the data we pass by ajax (from the view), but then instead of explode(), you would use json_decode() (in the controller). Also it would be better to validate/sanitize the ids before use.

    Check out the documentation for CHtml::ajaxLink to know more about ajax links.

    Note that the example is a little crude, since i haven't put in checks for empty array of checked ids.

    0 讨论(0)
提交回复
热议问题