1 Востаннє редагувалося Matvik (04.05.2013 18:05:24)

Тема: Сортування колонок в CGridView (YII)

Не працює сортування колонок, хоча, наскільки я зрозумів з документації, воно повинне працювати відразу.

Наразі в мене так. В контроллері:

public function actionShowPosts()
    {
            // Прописуємо датапровайдер для передачі даних в грід
            $dataProvider=new CActiveDataProvider('Post',
                    array(
                    'criteria'=>array(
                        'order'=>'created DESC',
                        'with' => array('author'),
                    ),
                    'pagination'=>array(
                        'pageSize'=>Yii::app()->params['postsPerPage'],
                    ),
                ));
            $this->render('allPosts',array('dataProvider'=>$dataProvider));
    }

У відображенні:

<?php 
    $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns' => array(
        array(
            'name' => 'autor',
            'type' => 'raw',
            'value' => 'CHtml::encode($data->author->username)',
        ),
        
        'title',
        'url', 
        array(
            'name' => 'text',
            'type' => 'html',
            'value' => 'CHtml::encode(mb_substr($data->text, 0, 
                Yii::app()->params["postPreviewLength"],"UTF8")."...")',
        ),
        
        array(
            'name' => 'created',
            'type' => 'raw',
            'value' => 'CHtml::encode(date("d.m.Y H:i:s",$data->created))',
        ),
    ),
));
?>

як написано тут http://www.yiiframework.com/doc/api/1.1/CGridView

The minimal code needed to use CGridView is as follows:

$dataProvider=new CActiveDataProvider('Post');

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
));


The above code first creates a data provider for the Post ActiveRecord class. It then uses CGridView to display every attribute in every Post instance. The displayed table is equiped with sorting and pagination functionality.

Тобто, як я розумію, сортування має працювати по дефолту. А у мене виходить так, що трикутнички сортування, коли клікнути на відповідній колонці, відображаються, але сам грід не сортується ніфіга. При цьому пагінація працює нормально.
Де тут помилка?

UPDATED:
Тільки написав, і до мене дійшло: заважало оце

'order'=>'created DESC',

Відповідно, тепер наступне запитання: Як зробити сортування по дефолту. але щоб воно не заважало подальшому сортуванню гріда по колонках?

UPDATED 2:
І знову сам розібрався:
Треба було прописати сортування окремо. Тепер код в контроллері виглядає отак

public function actionShowPosts()
    {
            //Прописуємо сортування
            $sort = new CSort();
            $sort->defaultOrder = 'created desc';// початкове сортування по даті
            $sort->attributes=array(
                'created','autor','title','url'
            );
            
            // Прописуємо датапровайдер для передачі даних в грід
            $dataProvider=new CActiveDataProvider('Post',
                    array(
                    'criteria'=>array(
                        'with' => array('author'),
                    ),
                    'sort' => $sort,
                    'pagination'=>array(
                        'pageSize'=>Yii::app()->params['postsPerPage'],
                    ),
                ));
            $this->render('allPosts',array('dataProvider'=>$dataProvider));
    }

Таким чином заодно можна і заборонити сортування тих колонок, котрі цього не мають робити (просто не згадавши їх в переліку атрибутів), в даному випадку text.
Взяв інфу звідси yii.vingtsun-grodno.com/zii-widgets-grid-cgridview/
і звідси http://www.yiiframework.ru/forum/viewto … &t=189

Може комусь пригодиться)