CGridView, relations, сортировка

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
minibikini
Сообщения: 51
Зарегистрирован: 2010.04.21, 21:27

CGridView, relations, сортировка

Сообщение minibikini »

Не работает сортировка по колонке, которая построена по релейшену. Что не так?
Виджет:

Код: Выделить всё

    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'post-grid',
    'dataProvider'=>$posts,
    'columns'=>array(
        'title',
        'author.name', // эту колонку не хочет сортировать :-(
    ),
    )); ?>
Датапровайдер:

Код: Выделить всё

$posts=new CActiveDataProvider('Post', array(
            'criteria'=>array('with'=> 'author'),
            )
        );
 
И название колонки, кстати, выводит как Author Name, хотя в модели Author лейбл Name другой.
Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: CGridView, relations, сортировка

Сообщение TrustNik »

minibikini писал(а):         'author.name', // эту колонку не хочет сортировать :-(
При таком способе (через точку) нельзя использовать фильтр, и видимо сортировать не получится тоже. Решение есть на англоязычном форуме:
http://www.yiiframework.com/forum/index ... entry35853
minibikini
Сообщения: 51
Зарегистрирован: 2010.04.21, 21:27

Re: CGridView, relations, сортировка

Сообщение minibikini »

Не помогло :-(
Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: CGridView, relations, сортировка

Сообщение TrustNik »

Выложите сюда код модели, контроллера, представления.
minibikini
Сообщения: 51
Зарегистрирован: 2010.04.21, 21:27

Re: CGridView, relations, сортировка

Сообщение minibikini »

Представление и контроллер в первом посте.

В модели все по умолчанию + релейшен.

Еще раз напишу что даннные воводятся по релейшену, но сортировки по этой колонке нет :-(

Видимо как-то нужно настроить критерию в контроллере...
Аватара пользователя
TrustNik
Сообщения: 65
Зарегистрирован: 2009.10.25, 14:21
Откуда: Воронеж

Re: CGridView, relations, сортировка

Сообщение TrustNik »

Гм. Я вроде ссылку не для красоты давал. Ладно. Решение:
В views/post/admin.php:

Код: Выделить всё

$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider'=>$model->search(),
        'filter'=>$model,
        'columns'=>array(

            ...

             array(
                        'name'=>'authorName',
                        'type'=>'raw',
                        'value'=>'$data->author->name',
                ),

          ....

        ),
)); 
В models/Post.php:

Код: Выделить всё

class Post extends CActiveRecord
{
        ...
       
     public $authorName;
        ...
        public function rules()
        {
                // NOTE: you should only define rules for those attributes that
                // will receive user inputs.
                return array(
                         ....
                     array('...., authorName', 'safe', 'on'=>'search'),
                    .....
                );
        }
         
        ...

        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
                return array(
                       ....
                     [i]'authorName' => 'Author',[/i]
                );
        }

        ...

        /**
         * Retrieves the list of posts based on the current search/filter conditions.
         * @return CActiveDataProvider the data provider that can return the needed posts.
         */
        public function search()
        {
             ....
                
             $criteria->compare('author.name', $this->authorName);

                $sort = new CSort();
                $sort->attributes = array(
                        'title',
                        'status',
                        'authorName' => array(
                            'asc'=>'author.name',
                        'desc'=>'author.name DESC',
                                ),
                
                );

                $criteria->with = array('author');
                
                return new CActiveDataProvider('Post', array(
                        'criteria'=>$criteria,
                        'sort'=>$sort,
                ));
        }
}
 

Контроллер оставляем сгенерированный по умолчанию.
minibikini
Сообщения: 51
Зарегистрирован: 2010.04.21, 21:27

Re: CGridView, relations, сортировка

Сообщение minibikini »

Спасибо. Что-то я тупил. Заработало.
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: CGridView, relations, сортировка

Сообщение MOTORIST »

В критерии нужно использовать: addSearchCondition()

$criteria->addSearchCondition('message_author.from_name',
$this->message_author_from_name, true);

http://www.yiiframework.com/forum/index ... ted-table/
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: CGridView, relations, сортировка

Сообщение denis909 »

Анс
Сообщения: 1
Зарегистрирован: 2010.11.16, 15:39

Re: CGridView, relations, сортировка

Сообщение Анс »

А как грамотно сделать сортировку по relation, если он у нас STAT? Т.е. что-то вроде:

Код: Выделить всё

public function relations()
    {
        return array(
            'commentsCount'=>array(self::STAT, 'Comments', 'parent_id'),
        );
    } 
optimus
Сообщения: 2
Зарегистрирован: 2011.02.12, 13:52

Re: CGridView, relations, сортировка

Сообщение optimus »

А как грамотно сделать сортировку по relation, если он у нас STAT? Т.е. что-то вроде...
http://www.yiiframework.com/forum/index ... entry35870
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: CGridView, relations, сортировка

Сообщение rak »

либо использовать carraydataprovider
zhuk99
Сообщения: 20
Зарегистрирован: 2012.03.25, 15:00

Re: CGridView, relations, сортировка

Сообщение zhuk99 »

Добрый день! Тема немного похожа, поэтому напишу сюда.

Разобрался с фильтрами и сортировкой. Однако косяк следующий: хочу добавить свою кнопку в колонку

Код: Выделить всё

array(
                'class'=>'CButtonColumn',
                'template' => '{update}{view}{approve}',
                'buttons' => array(
                    'approve' => array (
                        'url' =>  "#",
                        'icon'=>"ok",
                        )
                    ),
            ),
 
При таком варианте все отлично получается. кнопка выводитсья но при фильтрации и сортировке alert выкидвает. Если мою кнопку убрать все отлично.

на всякий случай приведу код из модели

Код: Выделить всё

$criteria = new CDbCriteria;
                
                $criteria->condition = "t.status_id=:status";
                //$criteria->addCondition('status_id=1');
                $criteria->params=array(':status'=>1);
               
                $criteria->compare('id', $this->id);
                $criteria->compare('title', $this->title, true);
                $criteria->compare ('time_add', $this->time_add);
                $criteria->compare ('category_id', $this->category_id);
                $criteria->with = array('author'); 
                $criteria->compare('author.login', $this->author_id, true); 
                
                $criteria->with = array('category'); 
                
                $sort = new CSort();
                $sort->attributes = array(
                    'author_id' => array(
                        'asc' => $expr = 'author.login',
                        'desc' => $expr . ' DESC',
                    ),
                    'time_add' => array(
                        'asc' => $expr = 'time_add', 
                        'desc' => $expr . ' DESC',
                    ),
                     'title' => array(
                        'asc' => $expr = 'title', 
                        'desc' => $expr . ' DESC',
                    ),
                    'category_id' => array(
                        'asc' => $expr = 'category.name',
                        'desc' => $expr . ' DESC', 
                    )
                );


                return new CActiveDataProvider(get_class($this), array(
                    'criteria' => $criteria,
                    'sort' => $sort,
                    
                ));
 
2. Другая проблема. Есть элемент, у него есть категория и подкатегория. Но подкатегории может не быть и тогда у записи там NULL. Как сделать сортировку и фильтр по такому полю...

везде проатывало что-то вроде

Код: Выделить всё

if ($model->subCat!=NULL) {echo ....
а тут в value такое не засунешь =( Или я криво написал?

Мой работающий код виджета без этого столбца подкатегории

Код: Выделить всё

<?php 
  $this->widget('bootstrap.widgets.BootGridView',array(
    'id'=>'post-grid',
        'dataProvider' => $model->searchModer(),
        'filter' => $model,
        'columns' => array(
            
            array(
                'name'=>'time_add',
                'sortable' => true,
                'value' => 'date("d-m-Y", strtotime($data->time_add))',
                
            ),
            array(
                //Это и есть вывод названия меню из связанной таблицы
                'name' => 'author_id',
                //'filter' => CHtml::listData(SubmenuParts::model()->findAll(), 'id', 'part_name'),
                'value' => '$data->author->login',
                'sortable' => true,
            ),
            array(
                //Это и есть вывод названия меню из связанной таблицы
                'name' => 'title',
                //'filter' => CHtml::listData(SubmenuParts::model()->findAll(), 'id', 'part_name'),
                'value' => 'substr($data->title,0,15)."..."',
                'sortable' => true,
            ),
            array 
            (
                'name' => "category_id",
                'value' => '$data->category->name',
                'filter' => CHtml::listData(Category::model()->findAll('parent_id=0'),
                        'id', 'name'),
                'sortable' => true,
            ),
                        
            
            array(
                'class'=>'CButtonColumn',
                'template' => '{update}{view}{approve}',
                'buttons' => array(
                    'approve' => array (
                        'url' =>  "#",
                        'icon'=>"ok",
                        )
                    ),
            ),
            
        ),
    ));
 

?>
Аватара пользователя
vitalik
Сообщения: 2
Зарегистрирован: 2012.11.27, 17:55
Откуда: Оренбург
Контактная информация:

Re: CGridView, relations, сортировка

Сообщение vitalik »

TrustNik спасибо, полдня искал как реализовать. Сделал несколько иначе, но твое решение очень понравилось. Еще раз спасибо
Ответить