セッション/Cookieを使用して、チェックされた値を保存できます。Cookie を機能させる方法がよくわからないので、セッションでそれを行う方法を説明します。具体的には、yii が作成するユーザー セッションです。
セッションを使用するには、チェック済み (および未チェック) の ID をコントローラーに渡す必要があります。したがって、Ajax の更新ごとに (つまり、ページネーション間で) コントローラーに送信されるデータを変更します。これを行うには、 CGridViewbeforeAjaxUpdate
のオプションを利用します。 .
また、コードで次の代わりに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
のすべての ID (この場合は email_ids) の csv 文字列として渡し、チェックされていuncheckedIds
ないすべての ID の csv 文字列として、チェックされていないボックスを取得します。 function を呼び出します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()
}
それだけです。これで動作するはずです。