2014-10-16 6 views
0

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

Рассмотрим таблицу (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 для создания настройки по умолчанию модель, контроллер и 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(); 
?> 

Моя цель состоит в том, чтобы получить значения ОС ALL установите флажки и выполните пакетное обновление в таблице, установив столбец ACTIVE в true или false.

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

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

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

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

Спасибо!

ответ

1

1-й. Выбираемые строки должны выглядеть следующим образом:

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

2. Вы можете передать их по своему усмотрению, так 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' 
));?> 

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

+0

Hi @ineersa! Спасибо за вашу помощь! «С помощью этого метода вы получите строку, разделенную запятой с выбранными вами строками». В этом проблема. Мне нужны ВСЕ строки, а не только выбранные:/ –

+0

ну, такого метода нет, вы можете написать его сами, но, на мой взгляд, это бесполезно. Когда вы написали 'выполнить пакетное обновление в таблице, установив столбец ACTIVE в true или false', просто установите флажки и установите для ACTIVE значение true для них, а значение по умолчанию - false. – ineersa

+0

Привет @ineersa! Ну, пример, который я дал, был всего лишь фальшивым сценарием. Реальный сценарий более сложный, и такой метод был бы полезен для меня. Но хорошо, я попробую обходное решение. Благодаря! –