Для добавления колонки с чекбоксами необходимо в элемент columns
виджета CGridView добавить следующий код:
array( 'name' => 'check', 'id' => 'selectedIds', 'value' => '$data->id', 'class' => 'CCheckBoxColumn', 'selectableRows' => '100', ),
Длее создать выпадающий список (select
) с действиями для выбранных элементов:
<?php
echo CHtml::activeDropDownList( $model, 'attr', array(...), array('id' => 'newStatus') )
И кнопку для отправки данных в действие (action
):
<?php
echo CHtml::ajaxLink( "Применить", $this->createUrl('myController/myAction'), array( //тип передачи данных "type" => "post", //данные для передачи "data" => 'js:{theIds : $.fn.yiiGridView.getChecked("CGridView-id","selectedIds").toString(),"status":$("#newStatus").val()}', //обновление контента после успешного выполнения запроса "success" => 'js:function(data){ $.fn.yiiGridView.update("CGridView-id") }' ) );
Далее создаем действие (action
) для применения изменений. В действии мы получим строку со списком id
выбранных записей и выбранное действие в переменной $_POST['status']
. Список id
можно превратить в массив с помощью explode
:
$arr = explode(',', $_POST['theIds']);
Вместо выпадающего списка и кнопки можно создать несколько ссылок, каждая из которым будет отвечать за выбранное действие. Код такой ссылки будет выглядеть так:
echo CHtml::ajaxLink( "Сделать что-то важное с отмеченными", $this->createUrl('myController/myAction'), array( "type" => "post", "data" => 'js:{theIds : $.fn.yiiGridView.getChecked("CGridView-id","selectedIds").toString()}', "success" => 'js:function(data){ $.fn.yiiGridView.update("CGridView-id") }'), array( 'class' => 'btn btn-info' ) );
Пример
К примеру у нас есть список комментариев для которых мы хотим сделать возможность массового изменения статуса публикации.
Код для представления(view
):
<?php
//Код виджета $this->widget('zii.widgets.grid.CGridView', array( //id виджета, в дальнейшем будет использоваться для AJAX обновления данных 'id'=>'comments-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, //... 'columns'=> array( //колонка с чекбоксами (checkBoxes) array( 'name' => 'check', 'id' => 'selectedIds', 'value' => '$data->id', 'class' => 'CCheckBoxColumn', 'selectableRows' => '100', ), //остальные колонки array( 'name' => 'id', 'filter' => CHtml::activeTextField( $model, 'id', array('class' => 'form-control', 'placeholder' => 'ID') ) ), //... ) //... ));
?>
<!-- Select со списоком статусов и кнопка "Применить" --> <div class="form-inline"> <div class="form-group"> <label for="newStatus">С отмеченными: </label> <?php //select со списоком статусов echo CHtml::activeDropDownList( $model, 'status', array( '0' => 'Скрыть', '1' => 'Опубликовать' ), array( 'id' => 'newStatus', 'class' => 'form-control' ) ) ?> </div> <?php //кнопка отправки данных echo CHtml::ajaxLink( "Применить", $this->createUrl('/comments/changeStatus'), array( "type" => "post", "data" => 'js:{theIds : $.fn.yiiGridView.getChecked("comments-grid","selectedIds").toString(),"status":$("#newStatus").val()}', "success" => 'js:function(data){ $.fn.yiiGridView.update("comments-grid") }' ), array( 'class' => 'btn btn-info' ) ); ?> </div>
В контроллере (controller
) описываем действие для применения изменений:
<?php
class CommentsController extends Controller { //... public function actionChangeStatus() { $arr = explode(',', $_POST['theIds']); $criteria = new CDbCriteria; $criteria->addInCondition('id' ,$arr); $model = Comments::model()->findAll($criteria); foreach ($model as $value) { $value->status = $_POST['status']; $value->update(); } } //... }
Комментарии
А нет ли такого примера на Yii2?
Ответить