Пакетное обновление с использованием CGridView

Я хочу выполнить пакетное обновление некоторых записей, отображаемых в CGridView и использующих CCheckBoxColumn, но это не работает!
Вот пример сценария:

Рассмотрим таблицу (MySQL):

CREATE TABLE IF NOT EXISTS `tb_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)

Добавьте несколько строк:

INSERT INTO `tb_test` (`id`, `description`, `active`) VALUES
(1, 'Test #1', 0),
(2, 'Test #2', 1),
(3, 'Test #3', 0);

Затем используйте Gii для генерации значений по умолчанию Model, Controller и CRUD, хорошо?

Что ж, после этого я сделал некоторые изменения в контроллере:

// unlock "active" and "ajaxupdate"public function accessRules()
{
...
array('allow',
'actions'=>array('active','ajaxupdate'),
'users'=>array('*'),
),
...
}

// ...other stuff

// action Active
public function actionActive()
{
$model=new Test('search');
$model->unsetAttributes();  // clear any default values
if(isset($_GET['Test']))
$model->attributes=$_GET['Test'];

$this->render('active',array(
'model'=>$model,
));
}

// action AjaxUpdate
public function actionAjaxUpdate()
{
$check_column = $_POST['check_column'];
print_r($check_column);
}

И, наконец, вот тестовый просмотр:

<?php
$form=$this->beginWidget('CActiveForm', array(
'enableAjaxValidation'=>true,
));

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'test-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'enablePagination'=>false,
'selectableRows'=>2,
'columns'=>array(
array(
'id'=>'check_column',
'class'=>'CCheckBoxColumn',
'value'=>'$data->active',
'checked'=>'$data->active',
),
'id',
'description',
array(
'class'=>'CButtonColumn',
),
),
));
?>

<script>
function reloadGrid(data) {
$.fn.yiiGridView.update('test-grid');
}
</script>

<?php
echo CHtml::ajaxSubmitButton('Update All',array('test/ajaxupdate'), array('success'=>'reloadGrid'));

$this->endWidget();
?>

Моя цель — получить значения ВСЕХ флажков и выполнить пакетное обновление таблицы, установив для столбца ACTIVE значение true или false.

Но фреймворк Yii просто отправляет Ajax отмеченные чеки.
Через Firebug я вижу результат как:

Array
(
[0] => 1
[1] => 0
)

Даже если я отмечу все 3 записи!

Есть ли способ получить значения ВСЕХ флажков?

Спасибо!

0

Решение

Первый. Выбираемые строки должны выглядеть так:

array(
'class' => 'CCheckBoxColumn',
'selectableRows' => '2',
'id'=>'check_column',
'value'=>'$data->active',
'checked'=>'$data->active',
),

Второй. Вы можете передать их самостоятельно, поэтому ajaxButton будет выглядеть так:

<?php echo CHtml::ajaxButton(Yii::t("app","grid_update"), 'test/ajaxupdate', array(
'type'=>'POST',
'data'=>'js:{ids : $.fn.yiiGridView.getChecked("grid-id-here","check_columns").toString()}',
'success' =>
'js:function (data) {
//do what you need here
}',
), array(
'id' => 'update_btn_'.rand(0,255),
'class' => 'update_btn'
));?>

С помощью этого метода вы получите строку, разделенную запятой с выбранными вами строками.

1

Другие решения

Других решений пока нет …