CGridView. Поиск и сортировка по полю связанной таблицы
В этом топике пойдет речь о поиске/сортировке столбцов из связанной таблицы в CGridView.
Существует не один вариант решения, рассмотрим вариант, предложенный здесь.
2) Добавляем описание нового поля:
3) Добавляем правило для созданного поля в rules для сценария search:
4) Не забываем также описать атрибут:
5) Добавляем экшн:
6) В экшне мы используем вызов модели со сценарием search. Его нам нужно подкорректировать. Собственно, сейчам мы и добавляем сортировку и поиск по полю из связанной таблицы.
7) И, наконец, вызов грида в представлении:
На самом деле, этот способ показался мне несколько длинным, однако все же полезным в некоторых случаях :)
Существует не один вариант решения, рассмотрим вариант, предложенный здесь.
Что имеем
У нас есть две таблицы: комментарии и статьи (используем тестовый демо-блог Yii). У каждого комментария есть поле post_id, ссылающееся на статью. В итоге мы хотим вывести грид с комментариями, где вместо ИД статьи будет поле с ее наименованием + сортировка/поиск по полю.Решение
1) Проверяем, описана ли связь в relations:'post' => array(self::BELONGS_TO, 'Post', 'post_id'),
2) Добавляем описание нового поля:
private $_postTitle = null; public function getPostTitle() { if ($this->_postTitle === null && $this->post !== null) { $this->_postTitle = $this->post->title; } return $this->_postTitle; } public function setPostTitle($value) { $this->_postTitle = $value; }
3) Добавляем правило для созданного поля в rules для сценария search:
public function rules() { return array( array('content, author, email', 'required'), array('author, email, url', 'length', 'max'=>128), array('email','email'), array('url','url') array('content, postTitle, status, author', 'safe', 'on'=>'search'), ); }
4) Не забываем также описать атрибут:
'postTitle' => 'Статья',
5) Добавляем экшн:
public function actionIndex() { $model = new Comment('search'); $model->unsetAttributes(); if (isset($_GET['Comment'])) $model->attributes = $_GET['Comment']; $this->render('index', array( 'model' => $model, )); }
6) В экшне мы используем вызов модели со сценарием search. Его нам нужно подкорректировать. Собственно, сейчам мы и добавляем сортировку и поиск по полю из связанной таблицы.
public function search() { $criteria = new CDbCriteria; $criteria->with = "post"; // указываем связанный объект, который должен быть загружен вместе с текущим объектом $criteria->compare('content', $this->content, true); $criteria->compare('status', $this->status); $criteria->compare('author', $this->author, true); $criteria->compare('post.title', $this->postTitle, true); // добавляем критерий поиска по связанному полю. Во избежание ошибок или при использовании нескольких связанных объектов, рекомендуется проставить для всех колонок алиасы таблиц(например, "t.content", "post.title") $sort = new CSort(); $sort->defaultOrder = 't.id DESC'; // устанавливаем сортировку по умолчанию $sort->attributes['postTitle'] = array( // добавляем сортировку по postTitle 'asc' => 'post.title', 'desc' => 'post.title desc', ); return new CActiveDataProvider($this, array( 'criteria' => $criteria, 'sort' => $sort )); }
7) И, наконец, вызов грида в представлении:
$this->widget('zii.widgets.grid.CGridView', array( 'dataProvider' => $model->search(), 'filter' => $model, 'columns' => array( 'content', 'postTitle', 'status', 'author', ), ));
На самом деле, этот способ показался мне несколько длинным, однако все же полезным в некоторых случаях :)
У меня заработало
ОтветитьУдалитьне
private $_postTitle = null;
а
public $postTitle = null;
и я удалил функции
public function getPostTitle() {
if ($this->_postTitle === null && $this->post !== null) {
$this->_postTitle = $this->post->title;
}
return $this->_postTitle;
}
public function setPostTitle($value)
{
$this->_postTitle = $value;
}
Зачем эти функции?
Система авторизации пользователей на Yii http://accessnetwork.ru