Yii: Поиск и сортировка по полю из присоединённой таблицы в 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/
Другие объяснения:
- http://phptime.ru/yii/perevod-poisk-i-sortirovka-svyazannyh-modeley-v-cgridview.html (на англ. http://www.yiiframework.com/wiki/319/searching-and-sorting-by-count-of-related-items-in-cgridview/)
- то же с комментариями http://progergirl.blogspot.ru/2012/08/cgridview.html
- http://wps.su/blog/8/
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)
1 комментарий