Нодус:Простейшие селекторы
Мы создали в Нодусе свой тип данных и наполнили БД неким набором записей этого типа. Теперь перед нами стоит задача создать страницу со списком этих записей:
- Отобразить список записей типа cat с постраничной навигацией
- В списке записей отображается сокращенная версия записи со ссылкой на полную версию
Нам на помощь придут селекторы. Селектор - это объект, который выбирает записи по какому-либо критерию. Простейший селектор создается системой автоматически и служит для выборки всех опубликованных записей конкретного типа. Мнемокод такого селектора совпадает с мнемокодом типа. Выполнив все описанное в предыдущей статье, мы сразу же можем воспользоваться селектором в коде проекта:
// Получим селектор $selector = Component_Nodus::selector('cat'); // Выберем все записи $rows = $selector->rows(); // Выберем записи по лимиту $rows = $selector->rows($limit); $rows = $selector->rows($limit,$offset); // Воспользуемся хелпером для отображения списка (в шаблоне) print $this->nodus->selector_rows($selector);
Однако, для решения нашей задачи такой селектор нам не подходит, т.к. в нем не хватает одного важного свойства: откликаться по какому-то адресу и при этом отрисовывать страницу (с заголовком, постраничной навигацией и пр.). Поэтому мы немного дополним селектор по умолчанию.
Открываем созданный нами ранее файл модуля Component.Nodus.App.Datatype.Cat.Type и дописываем в него класс Component_Nodus_App_Datatype_Cat_Selector:
class Component_Nodus_App_Datatype_Cat_Selector extends Component_Nodus_Selector { public function url() { return '/cats/'; } public function title() { return 'Кошки'; } public function perpage() { return 10; } }
Полагаю, что вряд ли есть нужда здесь что-то пояснять, ибо названия у функций - недвусмысленно говорящие. Заходим по адресу /cats/, который мы указали в селекторе, и видим искомый список с постраничной навигацией.
Изменяем внешний вид
Как и в случае с показом полной версии сайта, по умолчанию мы наблюдаем совсем не радующую взор картину. Дело в том, что система пытается отобразить записи в списке в режиме отображения teaser, а шаблона для него мы не сделали. Поэтому первым делом создадим шаблон teaser.phtml - по аналогии с full.phtml (примера приводить не буду).
Однако, хотелось бы иметь средства для изменения шаблонов не только отдельных записей, но и других элементов селектора. Для этого заглянем в каталог app/components/Nodus/views/. Там мы увидим набор файлов с префиксом "selector-". Это и есть шаблоны для отображения селектора. Сами эти файлы трогать не надо - они стандартные и желают оставаться таковыми и впредь.
- selector-page.phtml: отображение страницы селектора - полностью с заголовком, навигаторами и пр. Внутри мы можем увидеть, что он состоит из пяти блоков, отображаемых с помощью хелпера (его, кстати, можно использовать в любых шаблонах) - верхушки страницы, верхнего навигатора, списка записей, нижнего навигатора, низушки страницы.
- selector-rows.phtml: отображение списка записей
- selector-page-top.phtml и selector-page-bottom.phtml: верхняя и нижняя часть страницы соответственно
- selector-navigator-top.phtml и selector-navigator-bottom.phtml: верхний и нижний навигаторы соответственно. По умолчанию они одинаковы и состоят из одного навигатора страниц, хотя при нужде они могут отличаться и содержать в себе и другие элементы управления.
- selector-page-navigator.phtml: навигатор страниц.
Путем переопределения шаблона мы можем изменить внешний вид как всего селектора, так и отдельного его элемента. Для переопределения надо всего лишь скопировать нужный шаблон в каталог app/components/Nodus/app/views/ и при необходимости переименовать его. Например:
- app/views/selector-rows.phtml: переопределен внешний вид списка записей всех селекторов.
- app/views/selector-rows-cat.phtml: то же самое, но только для селектора с мнемокодом cat (наиболее употребимый случай).
- app/views/selector-rows-cat-1.phtml: то же самое, но только для первой страницы (мало ли - вдруг на других страницах внешний вид другой нужен).
Не забудьте после создания нового шаблона сбросить кеш, т.к. сканировать файловую систему при каждом запросе - слишком затратная процедура, поэтому список шаблонов кешируется.