11

チェックボックス列を含み、ページネーションも使用するグリッドビューがあります。最初のページでいくつかのチェックボックスをオンにして 2 番目のページに移動し、2 番目のページで別のチェックボックスをオンにすると、最初のページでオンにしたオプションが保持されません。ページネーション中にチェックボックスの値を保持することは可能ですか?

Gridviewのコードは

$widget = $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'     => $model->search(),
    'cssFile'          => Yii::app()->baseUrl . '/media/js/admin/css/admingridview.css',
    //'filter' => $model,
    'ajaxUpdate'       => true,
    'enablePagination' => true,
    'columns'          => array(
        array(
            'name'   => 'id',
            'header' => '#',
            'value'  => '$this->grid->dataProvider->pagination->currentPage * $this->grid->dataProvider->pagination->pageSize + ($row+1)',
        ),
        array(
            'class'          => 'CCheckBoxColumn',
            'selectableRows' => '2',
            'header' => 'Selected',
        ),
        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)',
        ),
        array(
            'name'   => 'demo',
            'type'   => 'raw',
            'header' => "Select",
            'value'  => 'CHtml::checkBox("email[]","",array("class"=>"check","value"=>$data->email_id))',
        ),
    ),
));

編集:

グリッドビューで選択したオプションを記憶するための拡張機能、このリンクを確認してくださいセルグリッドビュー

bool.devに感謝

4

3 に答える 3

8

セッション/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()
}

それだけです。これで動作するはずです。

于 2012-04-12T15:55:07.480 に答える
1

そのスキームを開発するには、ナビゲートしたときに何が起こるかを知る必要があります。

ページネーションページに移動するたびに、ajax呼び出しが行われ、新しいデータが受信され、CActive Recordまたはデータソースから取得されます。新しいデータは、データベース レコードまたはソース レコードに従っています。もう一度前のページに戻ると、Ajax 呼び出しが行われ、コンテンツが更新されるため、データベースと同じになります。

私が感じているのは、チェックされた項目のデータを一時的に保存し、アクションが行われた場合は永続的にする必要があるということです.

このようなことができます

<script type="text/javascript">
$("input:checkbox").click(function () {
    var thisCheck = $(this);
    if (thisCheck.is (':checked')){
        // do what you want here, the way to access the text is using the
        // $(this) selector. The following code would output pop up message with
        // the selected checkbox text
        $(this).val());
    }
});
</script>

一時的なストレージをどこかに保存できます

于 2012-04-11T07:39:07.930 に答える