Views contextual filters, relationships - аргументы и отношения (связи)
В этом уроке я уделю особое внимание работе с аргументами во Views. Аргументами называются части URL, например:
node/15 Первый аргумент будет node, второй 15. taxonomy/term/10 Первый аргумент taxonomy, второй term, третий 10. user/67 Первый аргумент user, второй 67
Я думаю что эти примеры наглядные и не требуют дополнительных пояснений.
Аргументы можно получить с помощью функции arg()
<?php print arg(0) . '<br />'; print arg(1); ?>
Если URL был node/15, то будет выведены:
node 15
Нумерация аргументов в функции arg начинается с 0. А теперь давайте посмотрим, какие готовые решения есть в модуле Views.
Вывод нод пользователя
Допустим мы находимся на странице user/1 и нам нужно вывести блок нод пользователя с uid = 1. Для этого мы будем использовать аргумент из URL.
Добавляем новый вид.Выводим блок, в полях указываем title ноды, естественно выводим только опубликованные ноды, сортируем по post date
Заголовок
Заголовок: user_nodes
Формат
Формат: Unformatted list | Настройки
Показать: Fields | Настройки
Fields
Содержимое: Заголовок
Filter criteria
Содержимое: Опубликовано (Да)
Sort criteria
Содержимое: Post date (desc)
Pager
Use pager: Display a specified number of items | 15 пунктов
More link: Нет
Теперь нажмем добавить в Contextual fitlers (arguments, аргументы, контекстные фильтры). Выбираем:
Содержимое: Author uid
И дальше выбираем
When the filter value is NOT available Provide default value User ID from URL Provide default value
Сохраняем вид. Выводим блок в нужный нам регион и заходим например на страницу user/1 и в созданном нами блоке будут выведены все ноды пользователя с uid = 1.
Вывод связанных нод
А сейчас мы усложним пример. Допустим нам нужно привязать к одной ноде несколько других. Для этого используются поля node reference. Чтобы использовать эти поля связей, нам потребуется модуль References и его подмодуль node references.
http://drupal.org/project/references
Поля связей в 7ом друпале позволяют привязать к одной ноде несколько пользователей и несколько нод одновременно. Реализуется это через поля типа node reference. А так как в Друпал 7 можно добавлять поля к любой сущности, то и связывать теперь можно любые сущности.
У меня на сайте есть 4 новости и я хочу сделать привязать ко второй новости первую и третью, допустим эти новости на схожую тематику.
Заходим в управление полями контент типа новости и добавляем поле node reference с возможностью автозаполнения. Назову поле "схожие новости". Дальше выбираем какие контент типы могут иметь связи с нодой, а также ставим количество выбираемых нод для поля. Я выбрал только новости. Дальше нажимаем сохранить поле. Теперь заходим в редактирование второй ноды. Там у меня поле node reference схожие новости.
Конечно новости уже будут отображаться в виде списка, как связанные с этой нодой. Но наша задача настроить view.
Добавляем новый view, опять же в виде блока.
Заголовок:
similar_news
Формат:
Unformatted list | Настройки
Показать: Fields | Настройки
Fields
Содержимое: Заголовок
Filter criteria
Содержимое: Опубликовано (Да)
Содержимое: Тип (= Новость)
Sort criteria
Содержимое: Post date (desc)
Pager
Use pager: Display a specified number of items | 5 пунктов
Добавляем аргумент (contexual filter) Содержимое: Nid. Но в этот раз выбираем
When the filter value is NOT available Provide default value Content ID from URL
А также в Relationships (отношения, связи) добавляем новую связь Содержимое: Схожие новости (field_similar) (Если у вас поле называется по другому, то следует выбирать его). Также обратите внимание, что там есть тоже самое поле но с пометкой reverse. Это означает, что будет обратная связь, то есть если мы на странице с новостью 3, то будет показана в блоке новость 2 (Хотя мы выбирали в Новости 2 связь с Новость 1 и Новость 3).
В результате будут выбраны еще и эти поля:
Contextual filters
Содержимое: Nid
Relationships
Содержимое: Схожие новости
Теперь в нашем поле содержимом нужно поставить relation, вместо Do not use a relationship выберите имя нашей связи.
Fields
(field_similar) Содержимое: Заголовок
Сохраняем наш view и блок вставляем в нужный регион.
Теперь на страницы новости 2, будут в отдельном блоки отображаться схожие новости Новость 1 и Новость 3.