Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Submit CGridView Checked values using a form

Tags:

forms

php

yii

I have a CGridView wigdet with CCheckBoxColumn like this:

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'class'=>'CCheckBoxColumn',
        ),
        'title',
        ....
    ),
));

Question: how to submit to controller action the checked values? I understand that I need a form, submit button, but I need a clear explanation where to put things, so that search boxes on the top appear.

Thanks in advance.

like image 738
moriesta Avatar asked Mar 17 '26 10:03

moriesta


2 Answers

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.

like image 109
bool.dev Avatar answered Mar 20 '26 02:03

bool.dev


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')"
));
?>
like image 45
Jay_69 Avatar answered Mar 20 '26 00:03

Jay_69



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!