Вопрос по php, ajax – Сохранить значения флажков в разбивке по сетке Yii

10

У меня есть gridview, который содержит столбец флажок, а также использует нумерацию страниц. Когда я проверяю некоторые флажки на первой странице, перехожу на вторую страницу и проверяю еще один на второй странице, опции, которые я установил на первой странице, там не сохраняются. Можно ли сохранить значения флажков во время разбивки на страницы?

Code for Gridview is

<code>$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))',
        ),
    ),
));
</code>

Edit:

Расширение для запоминания выбранных опций в gridview, проверьте эту ссылкуSelgridview

Благодаряbool.dev

@ bool.dev Я использовал CCheckBoxColumn, но это также бесполезно для этого Gopesh
@ bool.dev Я просто добавляю ccheckboxcolumn, а все остальные рабочие нормально только pblm с сохранением значения флажка. Я не нашел ни на одном из сайтов, которые развивались подобным образом Gopesh
ок .. можешь добавить версию CCheckBoxColumn к своему вопросу? добавьте только измененную часть, оставьте старый код как есть. bool.dev
Кроме того, что вы хотите сохранить состояние флажка, хорошо ли вы используете ccheckboxcolumn? я имею в виду, кроме состояния флажка, можете ли вы сделать все остальное, что вы делаете с ccheckboxcolumn? bool.dev
Ваши флажки установлены для всех строк? Я имею в виду, почему вы не пошли на CCheckBoxColumn? bool.dev

Ваш Ответ

3   ответа
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>

Вы можете сохранить временное хранилище где-нибудь

см. отредактированный соответствен Afnan Bashir
нет, не в дб Gopesh
Спасибо за твой ответ. Можешь привести пример? Gopesh
Вы отметили поле базы данных или нет? Afnan Bashir
7

. Я не очень уверен, как заставить куки работать, поэтому я расскажу вам, как сделать это с сеансами. В частности, пользовательский сеанс, который создает 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(), что следует в ближайшее время. Пожалуйста, обратите внимание, что во время тестирования я использовал поле целочисленного идентификатора (моей таблицы) в качестве уникального поля, а не поле электронной почты.

ThegetUncheckeds()ункция @ может быть зарегистрирована в любом месте файла представления для 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()
}

Вот так, должно сработать.

есть также расширение, с которым я столкнулся сегодня, что может помочь: Selgridview bool.dev
Большое спасибо .. проверим это ... спасибо за терпение, чтобы найти решение .. Gopesh
также в дополнение кisset вы также можете проверить наличиеempty bool.dev
Добро пожаловать, в следующий раз дайте награду за такие огромные вопросы :). Я сказал, я попробую, так и сделал. Во всяком случае, помните основные моменты, Сессии / печенье , BeforeAjaxUpdate иsetState() getState() функции. Вы можете хранить вещи в отдельной переменной сеанса вместо сеанса пользователя, если хотите. bool.dev
Конечно ... Спасибо за твою огромную поддержку. Gopesh
0

Также сделайте эту работу при отправке обычной формы:

Я хотел добавить это как комментарий к ответу bool.dev, но у меня пока недостаточно репутации, чтобы сделать это. Поэтому мне пришлось поместить это в отдельный ответ.

bool.dev, твой ответ отличный и работает хорошо, спасибо.

Однако, как и предполагалось, он работает только тогда, когда вызовы ajax обновляют вид сетки. Я имею gridView, формирующий часть формы, поэтому я хотел, чтобы он также работал при обычной отправке формы, иначе флажки не загружаются снова, когда в форме есть другие ошибки проверки.

Так, в дополнение к тому, что вы сделали, я добавил в форму скрытые поля, наприме

<input type="hidden" name='checkedBox1' id='checkedBox1' value=''>
<input type="hidden" name='uncheckedBox1' id='uncheckedBox1' value=''>

Затем, перед отправкой формы, моя кнопка sumbit запускает функции getChecked () и getUncheckeds () и сохраняет их результаты в скрытых полях:

if ($('#checkedBox1').length >0)   {$('[name=checkedBox1]').val(getChecked());}
if ($('#uncheckedBox1').length >0) {$('[name=uncheckedBox1]').val(getUncheckeds());}

В контроллере, кроме проверки $ _GET ['checkedIds'], вы также проверяете $ _POST ['checkedBox1'] и сохраняете его значения в сессии так же, как вы делаете для $ _GET ['checkedIds'], используя та же переменная сеанса.

Сделайте то же самое с $ _POST ['uncheckedBox1'].

Это должно сработать.

Похожие вопросы