Сортировка столбца в GridView

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Сортировка столбца в GridView

Сообщение newbie112 »

есть GridView, отображает 4 поля: id, name (состоит из firstname и lastname), country, city.
country, city - сортируются по нажатию на имя столбца.
но с name сортировка не происходит. как ее сделать?

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

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'address-grid',
    'dataProvider'=>$model->search(),
    'columns'=>array(
        array(
                'name'=>'id',
                'visible'=>!Yii::app()->user->isGuest,
        ),
        array(
                'name' => 'Name',
                'value'=>'$data->firstname.\' \'.$data->lastname',
            ),
        'country',
        'city',
            
            array(
            'class'=>'CButtonColumn',
            'header' => 'Actions',
            'template'=>'{delete}{update}{view}',
            'buttons'=>array(
                'delete'=>array(
                    'imageUrl'=>false,
                    'label'=>'[delete]&nbsp;',
                    'visible'=>'!Yii::app()->user->isGuest',
                ),
                'update'=>array(
                    'imageUrl'=>false,
                    'label'=>'[edit]&nbsp;',
                    'visible'=>'!Yii::app()->user->isGuest',
                    
                ),
                'view'=>array(
                    'imageUrl'=>false,
                    'label'=>'[view]&nbsp;',
                ),
            ),
            
        ),
    ),
)); ?>
Аватара пользователя
Ivan Ozercov
Сообщения: 53
Зарегистрирован: 2012.03.21, 15:53
Откуда: Минск

Re: Сортировка столбца в GridView

Сообщение Ivan Ozercov »

тебе надо что бы происходила сортировка и по name и по country одновременно?
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Сортировка столбца в GridView

Сообщение vladimircape »

newbie112 писал(а):есть GridView, отображает 4 поля: id, name (состоит из firstname и lastname), country, city.
country, city - сортируются по нажатию на имя столбца.
но с name сортировка не происходит. как ее сделать?

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

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'address-grid',
    'dataProvider'=>$model->search(),
    'columns'=>array(
        array(
                'name'=>'id',
                'visible'=>!Yii::app()->user->isGuest,
        ),
        array(
                'name' => 'Name',
                'value'=>'$data->firstname.\' \'.$data->lastname',
            ),
        'country',
        'city',
            
            array(
            'class'=>'CButtonColumn',
            'header' => 'Actions',
            'template'=>'{delete}{update}{view}',
            'buttons'=>array(
                'delete'=>array(
                    'imageUrl'=>false,
                    'label'=>'[delete]&nbsp;',
                    'visible'=>'!Yii::app()->user->isGuest',
                ),
                'update'=>array(
                    'imageUrl'=>false,
                    'label'=>'[edit]&nbsp;',
                    'visible'=>'!Yii::app()->user->isGuest',
                    
                ),
                'view'=>array(
                    'imageUrl'=>false,
                    'label'=>'[view]&nbsp;',
                ),
            ),
            
        ),
    ),
)); ?>
естественно не будет, или ты хочешь чтобы AR всё сам за тебя делал :) sort указывай
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

Ivan Ozercov писал(а):тебе надо что бы происходила сортировка и по name и по country одновременно?
нет, мне нужно что бы и по name тоже была сортировка, такая же как и по country, city..
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

естественно не будет, или ты хочешь чтобы AR всё сам за тебя делал sort указывай
а если точнее?)
я в модели в search() указал

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

return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'sort' => array('attributes' => array('name', 'country', 'city')), 
и в GridView

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

'enableSorting'=>true, 
не так?
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Сортировка столбца в GridView

Сообщение vladimircape »

newbie112 писал(а):
естественно не будет, или ты хочешь чтобы AR всё сам за тебя делал sort указывай
а если точнее?)
я в модели в search() указал

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

return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'sort' => array('attributes' => array('name', 'country', 'city')),
и в GridView

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

'enableSorting'=>true,
не так?
нет не так, почитай мануалы пощерсти короче, :D я в свое время нашел же.
'sort'=>array(
'attributes'=>array(
'user_id'=>array(
'default'=>'desc',
),
Stas
Сообщения: 441
Зарегистрирован: 2011.11.29, 16:00

Re: Сортировка столбца в GridView

Сообщение Stas »

а дайте ссылку в каком мануале читать
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

тоже ничего не могу найти
как же ее все таки сделать то..
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

Я сделал так
в модели

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

return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
                        'sort' => array('attributes' => array('id','name', 'country', 'city')),   
в грид добавил

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

'enableSorting'=>true, 
вписал туда Id - по нему сортировка происходит, а вот по name - нет. проблема в том, что name, это отдельно созданная колонка, которая содержит firstname+lastname, в базе данных такого поля нет.
что тут можно сделать?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Сортировка столбца в GridView

Сообщение anton44eg »

Аватара пользователя
Ivan Ozercov
Сообщения: 53
Зарегистрирован: 2012.03.21, 15:53
Откуда: Минск

Re: Сортировка столбца в GridView

Сообщение Ivan Ozercov »

я у себя вот так вот делал
правда не знаю на сколько это правильно
в методе seach

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

        $sort = new CSort();
                $sort->attributes = array(
                    'user_username'=>array(
                        'asc'=>'user.username ASC',
                        'desc'=>'user.username DESC',    
                    ),
                    'user_email'=>array(
                        'asc'=>'user.email ASC',
                        'desc'=>'user.email DESC',
                    ),
                    'business_name'=>array(
                        'asc'=>'business.name ASC',
                        'desc'=>'business.name DESC',
                    ),
                    '*',
                );
        
        return new CActiveDataProvider($this, array(
            'pagination'=>array(
                'pageSize'=> Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']),
            ),
            'criteria'=>$criteria,
            'sort'        =>$sort,
        ));
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

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

'asc'=>'user.username ASC', 
что здесь значит user и username, и почему пишутся через точку?)
Аватара пользователя
Ivan Ozercov
Сообщения: 53
Зарегистрирован: 2012.03.21, 15:53
Откуда: Минск

Re: Сортировка столбца в GridView

Сообщение Ivan Ozercov »

user это связанная таблица через relation т.е в что бы из модели обратится к username, надо в relation текущей модели прописать

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

public function relations()
{
return array(
      'user' => array(self::BELONGS_TO, 'User', 'user_id'),
      'business'=>array(self::BELONGS_TO, 'Business','business_id'),
    
}
после этого мы сможем обращатся к этому свойству из объекта текущей модели. user.username это как раз мы обращаемся к аттрибуту username в таблице User
newbie112
Сообщения: 23
Зарегистрирован: 2012.06.13, 14:38

Re: Сортировка столбца в GridView

Сообщение newbie112 »

понял. а как сделать сортировку просто столбца, который не является атрибутом какой либо таблицы?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Сортировка столбца в GridView

Сообщение anton44eg »

в столбце что-то же хранится?
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Сортировка столбца в GridView

Сообщение vladimircape »

anton44eg писал(а):в столбце что-то же хранится?
я вот делаю вот так

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

'columns'=>array(
            'id',
            'user_id',
            'user.first_name',
            'user.last_name',
            array( 'name'=>'user_search', 'value'=>'$data->user->email'),  
 
но почему-то в столбце user_search сортировка по убыванию и возрастанию ,а поиск типа LIKE не работает?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Сортировка столбца в GridView

Сообщение anton44eg »

Поиск в функции search нужно.

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

$criteria->compare('user.email', $this->user_search) 
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Сортировка столбца в GridView

Сообщение vladimircape »

anton44eg писал(а):Поиск в функции search нужно.

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

$criteria->compare('user.email', $this->user_search) 
:D самое прикольное что я 1 в один так написал(до этого) и всё же не работает.

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

    public function search()
    {
            $criteria=new CDbCriteria;
            $criteria->compare('t.id',$this->id,true);
            $criteria->compare('t.service_id',$this->service_id,true);
            $criteria->compare('t.user_id',$this->user_id,true);
            $criteria->compare('t.email',$this->email,true);
            $criteria->compare('t.service',$this->service,true);            
           
            $criteria->with=array('user');//needs for sorting
            $criteria->compare('user.email', $this->user_search);
            
           //$criteria->addSearchCondition('user.email',$this->user_search); 
            
            $sort = new CSort();
            $sort->defaultOrder = 't.id DESC';
            $sort->attributes = array(
                'id'=>array(
                    'asc'=>'t.id asc',
                    'desc'=>'t.id desc',
                ),
                'email'=>array(
                    'asc'=>'t.email desc',
                    'desc'=>'t.email asc',
                ),
                'user_id'=>array(
                    'asc'=>'t.user_id desc',
                    'desc'=>'t.user_id asc',
                ),
                'service'=>array(
                    'asc'=>'t.service desc',
                    'desc'=>'t.service asc',
                ),
                'service_id'=>array(
                        'asc'=>'t.service_id desc',
                        'desc'=>'t.service_id asc',
                    ),
                'user.first_name'=>array(
                        'asc'=>'user.first_name desc',
                        'desc'=>'user.first_name asc',
                    ),        
                'user.last_name'=>array(
                        'asc'=>'user.last_name desc',
                        'desc'=>'user.last_name asc',
                    ),                
                'user_search'=>array(
                    'asc'=>'user.email ASC',
                    'desc'=>'user.email DESC',
                ),
                '*',
            );
            return new CActiveDataProvider($this, array(
                    'criteria'=>$criteria,                        
                    'sort'=>$sort,
                ));
    }
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Сортировка столбца в GridView

Сообщение anton44eg »

нужно еще добавить в модель

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

public $user_search; 
Во второй раз, когда использовался - долго бился - почему не работает :)
vladimircape
Сообщения: 339
Зарегистрирован: 2012.05.29, 16:31

Re: Сортировка столбца в GridView

Сообщение vladimircape »

anton44eg писал(а):нужно еще добавить в модель

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

public $user_search;
Во второй раз, когда использовался - долго бился - почему не работает :)
Батенька вы меня не уважаете :D конечно добавил, если не было бы,то ошибку бы выдавало
чтобы не быть голословным ,вот как у меня

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

class InvitationAdmin extends Invitation
{
    public $adminName='Invitations'; // will be displayed in main list
    public $pluralNames=array('Invitation','Invitation');   
    public $serviceChoices=array("facebook"=>"facebook","web"=>"web","twitter"=>"twitter");
    public $user_search;
    public function attributeLabels()
    {
        return array(
                'id' => 'ID',
                'user_id' => 'User ID',
                'email' => 'Friend_Email',
                'service' => 'Friend_Service',
        );
    }
    public function rules()
    {
        return array(
                    array('id,service_id','safe'),
                    array('user_id, email, service', 'required'),
                    array('user_id', 'numerical', 'integerOnly'=>true),
                    array('email, service', 'length', 'max'=>45),                        
                    array('id, user_id, email, service, service_id,user_search', 'safe', 'on'=>'search'),//2
                    array('user_id', 'Usercheck'),                        
        );
    }
    public function Usercheck()
    {
        $user=User::model()->findbyPK($this->user_id);
        if(!$user) $this->addError('user_id','There is no such user');    
    }

    public function adminSearch()
    {
        return array(
            'columns'=>array(
            'id',
            'user_id',
                
            'user.first_name',
            'user.last_name',
            array( 'name'=>'user_search', 'value'=>'$data->user->email'),                                
            'email',
            'service_id',
            array(
                'name'  =>'service',
                'filter'=>array('web'=>'web','facebook'=>'facebook','twitter'=>'twitter'),    
            ),              
            )
        );
    }
    public function attributeWidgets()
    {
        return array(
        array('service','dropDownList'), 
        );            
    }
    public function search()
    {
            $criteria=new CDbCriteria;
            $criteria->compare('t.id',$this->id,true);
            $criteria->compare('t.service_id',$this->service_id,true);
            //$criteria->compare('t.user_id',$this->user_id,true);
            
            
            $criteria->compare('t.email',$this->email,true);
            $criteria->compare('t.service',$this->service,true);            
           //$criteria->together = true;
            $criteria->with=array('user');//needs for sorting
           // $criteria->compare('user.email', $this->user_search);
            $criteria->compare('email',$this->user_search);
           // $criteria->addSearchCondition('user.email',$this->user_search); 
            
            $sort = new CSort();
            $sort->defaultOrder = 't.id DESC';
            $sort->attributes = array(
                'id'=>array(
                    'asc'=>'t.id asc',
                    'desc'=>'t.id desc',
                ),
                'email'=>array(
                    'asc'=>'t.email desc',
                    'desc'=>'t.email asc',
                ),
                'user_id'=>array(
                    'asc'=>'t.user_id desc',
                    'desc'=>'t.user_id asc',
                ),
                'service'=>array(
                    'asc'=>'t.service desc',
                    'desc'=>'t.service asc',
                ),
                'service_id'=>array(
                        'asc'=>'t.service_id desc',
                        'desc'=>'t.service_id asc',
                    ),
                'user.first_name'=>array(
                        'asc'=>'user.first_name desc',
                        'desc'=>'user.first_name asc',
                    ),        
                'user.last_name'=>array(
                        'asc'=>'user.last_name desc',
                        'desc'=>'user.last_name asc',
                    ),                
                'user_search'=>array(
                    'asc'=>'user.email ASC',
                    'desc'=>'user.email DESC',
                ),
                '*',
            );
            return new CActiveDataProvider($this, array(
                    'criteria'=>$criteria,                        
                    'sort'=>$sort,
                    /*'pagination' => array(
                        'pageSize' => 1,
                        ),*///for the future
                ));
    }
    public function defaultScope()
    {
        return array(
        'select' => 'id,user_id,email,service,service_id',
        );
    }
}
 
Ответить