Ответ 1
Вы можете использовать сеансы/файлы cookie для хранения отмеченных значений. Я не очень уверен, как сделать файлы cookie, поэтому я расскажу вам, как это сделать с сеансами. В частности, пользовательский сеанс, созданный yii.
Теперь, чтобы использовать сеансы, нам нужно передать проверенные (и непроверенные) идентификаторы на контроллер, поэтому мы будем изменять данные, отправляемые контроллеру при каждом обновлении ajax (т.е. между разбивкой по страницам), для этого мы используем beforeAjaxUpdate
опция CGridView.
Я также использую CCheckBoxColumn вместо из следующего в вашем кода (конечно, вы можете изменить решение в соответствии с вашими потребностями):
array(
'name' => 'demo',
'type'=>'raw',
'header' => "Select",
'value' => 'CHtml::checkBox("email[]","",array("class"=>"check","value"=>$data->email_id))',
),
Изменения в GridView:
<?php $this->widget('zii.widgets.grid.CGridView', array(
// added id of grid-view for use with $.fn.yiiGridView.getChecked(containerID,columnID)
'id'=>'first-grid',
'dataProvider'=>$model->search(),
'cssFile' => Yii::app()->baseUrl . '/media/js/admin/css/admingridview.css',
// added this piece of code
'beforeAjaxUpdate'=>'function(id,options){options.data={checkedIds:$.fn.yiiGridView.getChecked("first-grid","someChecks").toString(),
uncheckedIds:getUncheckeds()};
return true;}',
'ajaxUpdate'=>true,
'enablePagination' => true,
'columns' => array(
array(
'name' => 'id',
'header' => '#',
'value' => '$this->grid->dataProvider->pagination->currentPage * $this->grid->dataProvider->pagination->pageSize + ($row+1)',
),
array(
'name' => 'fb_user_id',
'header' => 'FaceBook Id',
'value' => 'CHtml::encode($data->fb_user_id)',
),
array(
'name' => 'first_name',
'header' => 'Name',
'value' => 'CHtml::encode($data->first_name)',
),
array(
'name' => 'email_id',
'header' => 'Email',
'value' => 'CHtml::encode($data->email_id)',
),
/* replaced the following with CCheckBoxColumn
array(
'name' => 'demo',
'type'=>'raw',
'header' => "Select",
'value' =>'CHtml::checkBox("email[]","",array("class"=>"check","value"=>$data->email_id))',
),
*/
array(
'class' => 'CCheckBoxColumn',
'selectableRows' => '2',
'header'=>'Selected',
'id'=>'someChecks', // need this id for use with $.fn.yiiGridView.getChecked(containerID,columnID)
'checked'=>'Yii::app()->user->getState($data->email_id)', // we are using the user session variable to store the checked row values, also considering here that email_ids are unique for your app, it would be best to use any field that is unique in the table
),
),
));
?>
Обратите особое внимание на код beforeAjaxUpdate
и CCheckBoxColumn, в beforeAjaxUpdate мы передаем checkedIds
как строку csv всех идентификаторов (в данном случае email_ids), которые были отмечены, и uncheckedIds
в качестве строки csv из всех непроверенных идентификаторов мы получаем непроверенные поля, вызывая функцию getUncheckeds()
, которая следует вкратце. Пожалуйста, обратите внимание на то, что когда я тестировал, я использовал целое число id (моей таблицы) как уникальное поле, а не поле электронной почты.
Функция getUncheckeds()
может быть зарегистрирована в любом месте файла вида для gridview:
Yii::app()->clientScript->registerScript('getUnchecked', "
function getUncheckeds(){
var unch = [];
/*corrected typo: $('[name^=someChec]') => $('[name^=someChecks]') */
$('[name^=someChecks]').not(':checked,[name$=all]').each(function(){unch.push($(this).val());});
return unch.toString();
}
"
);
В приведенной выше функции обратите внимание на селекторы и each
и push
.
При этом нам нужно изменить контроллер/действие для этого представления.
public function actionShowGrid(){
// some code already existing
// additional code follows
if(isset($_GET['checkedIds'])){
$chkArray=explode(",", $_GET['checkedIds']);
foreach ($chkArray as $arow){
Yii::app()->user->setState($arow,1);
}
}
if(isset($_GET['uncheckedIds'])){
$unchkArray=explode(",", $_GET['uncheckedIds']);
foreach ($unchkArray as $arownon){
Yii::app()->user->setState($arownon,0);
}
}
// rest of the code namely render()
}
Чтобы это, оно должно работать сейчас.