Yii: Поиск и сортировка по полю из присоединённой таблицы в CGridView

Yii: Поиск и сортировка по полю из присоединённой таблицы в CGridView Поиск и сортировка по полю из присоединённой таблицы в CGridView.

1 способ: Через сеттер и геттер.

(Searching and sorting a column from a related table in a CGridView)

Проделываем это в CGridView для действия actionAdmin в контроллере заявок. Если в представлении admin.php мы просто используем связанное поле

'columns'=>array(
    'content',
    'entries.title', // заголовок из связанной талбицы заявок
    'status',
    'author',
),

То сортировка и фильтрация не будут работать. Потому что CGridView не разрешает символ '.' в названии поля, и когда встречает его, то отрубает возможность фильтрации.

Для обхода добавим в модель заявок (Entries) геттер и сеттер:

private $_postTitle = null;

public function getPostTitle()
{
    if ($this->_postTitle === null && $this->post !== null)
    {
        $this->_postTitle = CHtml::link($this->user->name." ".$this->user->surname, array("/profiles/profiles/personal","id"=>$this->user->id));
//$this->post->title;
    }
    return $this->_postTitle;
}
public function setPostTitle($value)
{
    $this->_postTitle = $value;
}

Далее в rules

public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
...
array('id, postTitle, entry_id, company, name, surname, middle_name, sex, created', 'safe', 'on'=>'search'),
);
}

Дальше здесь же в моделе правим действие search()

public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.

$criteria=new CDbCriteria;
$criteria->with = "user"; // Make sure you query with the post table.

$criteria->compare('t.id',$this->id);
$criteria->compare('t.entry_id',$this->entry_id);
$criteria->compare('t.company',$this->company,true);
$criteria->compare('t.name',$this->name,true);
$criteria->compare('t.surname',$this->surname,true);
$criteria->compare('t.middle_name',$this->middle_name,true);
$criteria->compare('t.sex',$this->sex,true);
$criteria->compare('t.created',$this->created,true);
$criteria->compare('user.name',$this->postTitle,true);
      

$sort = new CSort();
$sort->defaultOrder = 't.created DESC';
$sort->attributes = array(
   //'defaultOrder'=>'t.created DESC',
'*',
);

return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
            'sort'=>$sort,
));
}    

Теперь в представлении можем писать наш postTitle (вместо entries.title)

'columns'=>array(
    'content',
    array(            
      'name'=>'postTitle',
      'header'=>'Кто направил заявку?',
      'type'=>'raw', // так как у меня html-теги должны преобразовываться, чтобы видна была именно как ссылка                                               
    ),
    'status',
    'author',
),

 

2 способ: Используя расширение RelatedSearchBehavior.

Расширение — http://www.yiiframework.com/extension/relatedsearchbehavior/

Yii поиск и сортировка по связанным полям в CGridView

 

Другие объяснения:

 

 

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



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

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

1 комментарий

#881
Mister говорит:
May 26, 2013 at 03:53 am
Спасибо чувак, одна строчка кода упростила мне жизнь.