Yii: Групповые операции в CGridView

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'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.