Yii: Групповые операции в CGridView
Добавляем стандартному Yii виджету CGridView способность делать групповые операции с элементами. Создадим свой класс GridView, который унаследуем от CGridView. Создаю его в application/components/widgets/GridView.php
Добавим в первый столбец колонку с чекбоксами. А внизу под таблицу выведем поле с выпадающим списком, в который будем передавать список групповых операций.
<?php
//Yii::import('zii.widgets.grid.CGridView');
Yii::import('application.extensions.alphapager.ApGridView'); // так как я использую ещё фильтрацию по первой букве имени, то расширять буду не CGridView, а ApGridView (стороннее расширение alphapager)
class GridView extends ApGridView {
public $groupActions = array();
public function init()
{
array_unshift($this->columns, array(
'id'=>'autoId',
'class'=>'CCheckBoxColumn',
'selectableRows'=>2,
'checkBoxHtmlOptions'=>array(
'name'=>'autoId[]',
),
'htmlOptions'=>array(
'class'=>'group-checkbox-column',
),
));
return parent::init();
}
public function renderPager()
{
echo "<div class='pre-header' style='float:left'>";
if(count($this->groupActions)) {
echo CHtml::dropDownList('group-actions', null, array(null=>'Выберите действие:')+$this->groupActions, array());
}
echo CHtml::button('submit', array(
'id'=>'group-operation-submit',
'onclick'=>'groupOperation()',
));
echo "</div>";
$actionLinks = array();
foreach($this->groupActions as $k=>$v) {
$actionLinks[$k] = Yii::app()->controller->createUrl($k);
}
$actionLinks = json_encode($actionLinks);
Yii::app()->clientScript->registerScript('go', "
var actionLinks = $actionLinks;
function groupOperation(){
var select = $('#group-actions');
var action = select.val();
var submit = $('#group-operation-submit');
submit.attr('disabled', 'disabled');
$.ajax({
url: actionLinks[action],
type: 'POST',
data: $('.group-checkbox-column input').serializeArray(),
complete: function(){
submit.removeAttr('disabled');
},
success: function(){
jQuery('#{$this->id}').yiiGridView('update');
}
});
}
", CClientScript::POS_HEAD);
parent::renderPager();
}
}
Далее, как видно, добавлен в вывод ява-скрипт-обработчик и пару элементов управления.
Все, теперь можем использовать:
<?php $this->widget('application.components.widgets.GridView', array(
'template'=>"{alphapager}\n{summary}\n{items}\n{pager}",
'alphaPager'=>array(
'showNumPage'=>'true',
'header'=>'Имена на букву: ' // <=====Setting different header text
),
'id'=>'mailerbase-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'groupActions'=>array(
'restore'=>'Сформировать заявки',
'blacklist'=>'Отправить в чёрный список',
),
'columns'=>array(
'id',
array(
'name'=>'category_id',
'value'=>'($data->category->parent_id ? $data->getCategoryList($data->category->parent_id) . " / " : "") . $data->category->name',
'headerHtmlOptions'=>array('width'=>'0px'),
'filter'=>MailerBaseCategories::getCategoriesList(),
),
array(
'name'=>'email',
'value'=>'$data->email . ($data->blacklist ? "<img title=\"" . $data->blacklist->name . "\" src=\"/themes/default/images/blacklist.png\">" : "")',
'type'=>'raw',
),
'surname',
'name',
'middle_name',
'company',
...
array(
'class'=>'CButtonColumn',
'template'=>'{view}{update}{blacklist}{delete}',
'headerHtmlOptions'=>array('width'=>'80px'),
'buttons'=>array
(
...
),
),
),
)); ?>
При нажатии на кнопку submit данные (id выбранных элементов) отправятся на соовтествующий, указанный в конфиге компонента экшен текущего компонента, тут - actionRestore или actionBlacklist (можете так же указывать и имя нужного контролера через слеш)
То есть, при выборе действия "Сформировать заявки" данные будут отправлены в текущий контроллер на действие actionRestore.
public function actionRestore()
{
$autoIdAll = $_POST['autoId'];
if(count($autoIdAll)>0)
{
foreach($autoIdAll as $autoId)
{
...// здесь действие с каждой из выбранных записей
}
}
$this->redirect(array('admin'));
}
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)