Views contextual filters, relationships - аргументы и отношения (связи)

admin друпал drupal

В этом уроке я уделю особое внимание работе с аргументами во 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 

contextual filter
Сохраняем вид. Выводим блок в нужный нам регион и заходим например на страницу user/1 и в созданном нами блоке будут выведены все ноды пользователя с uid = 1.

Вывод связанных нод

А сейчас мы усложним пример. Допустим нам нужно привязать к одной ноде несколько других. Для этого используются поля node reference. Чтобы использовать эти поля связей, нам потребуется модуль References и его подмодуль node references.

http://drupal.org/project/references

Поля связей в 7ом друпале позволяют привязать к одной ноде несколько пользователей и несколько нод одновременно. Реализуется это через поля типа node reference. А так как в Друпал 7 можно добавлять поля к любой сущности, то и связывать теперь можно любые сущности.

У меня на сайте есть 4 новости и я хочу сделать привязать ко второй новости первую и третью, допустим эти новости на схожую тематику.

Заходим в управление полями контент типа новости и добавляем поле node reference с возможностью автозаполнения. Назову поле "схожие новости". Дальше выбираем какие контент типы могут иметь связи с нодой, а также ставим количество выбираемых нод для поля. Я выбрал только новости. Дальше нажимаем сохранить поле. Теперь заходим в редактирование второй ноды. Там у меня поле node reference схожие новости.
similar news
Конечно новости уже будут отображаться в виде списка, как связанные с этой нодой. Но наша задача настроить 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.

Комментарии

Добавить комментарий

Войти, используя Loginza Google Account Yandex Mail.ru Vkontakte Facebook

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.

Я вибираю в качестве поля

Я вибираю в качестве поля термин таксономии, аргумент - родительский термин, если честно, то все это методом научного тыка, короче выводит просто списки подразделов на любой странице, направьте в верном направлении, плз.

Во-первых, нужно выбирать в

Во-первых, нужно выбирать в качестве аргумента просто tid (id термина) и ставить Provide default from URL и там выбрать tid. То есть мы будем брать аргумент из подобного URL'а:

taxonomy/term/245

Дальше нужно добавить отношение (relation), там есть несколько вариантов, среди которых parent terms (родительские термины). Можно еще вывести все матириалы термина, но это и есть вывод по умолчанию на станице

taxonomy/term/245

 

Я думаю вам нужно начать с того, что именно вам нужно сделать и отличается ли это от стандартного вывода Друпала. Возможно этот вывод уже есть в Друпале.

 

Если подобного функционала нет в Друпале, то тогда нужно поискать уже готовый модуль для друпала, скорее всего вы не первый кому понадобился такой же функционал.

Совершенно с вами согласен,

Совершенно с вами согласен, именно с этого и начал, но все что пока нашел из готового, это модуль books, но с ним возни не меньше чем с этим, там ведь тоже с представлениями надо работать... Решение с таксономией считаю самым оптимальным, только вот данный элемент подправить и имеется решение универсальное для различных случаев, доски, каталоги, справочники и тд. Вот взгляните пожалуйста, сделал, но пока безрезультатно...

 

scr

 

Привет)   а если связь

Привет)

 

а если связь немного сложнее?

 

у материала толе ссылка на термин,

у термина поле ссылка на другие термины

 

как для страницы ноды вывести в блоке те ноды у которых термином являются термины связанные с термином ноды на странице?

 

весь мозг сломал уже, буду весьма признателен за помощь.

 

Саныч.

Наверно вам стоит выбрать в

Наверно вам стоит выбрать в одной ноде другую через node reference, а в выбранной ноде уже делать выбор термина. Хотя в 7ке возможно как и вы сказали. Но скажу сразу, вью на таких связях будет ОЧЕНЬ долго работать и потреблять много памяти и времени.

ех) со связанными нодами нет

ех)

со связанными нодами нет проблем,

на производительность пок не смотрю, знаю что тяжел)

 

просто немогу разобрать для себя сам принцип, как вытянуть подобное,

честно, решая это так уже запутался с аргументами и связями, думал вы подскажете, не решения а хотя-бы общий принцип.

 

Саныч.

Решил) УРА!! спасибо всем, а

Решил) УРА!! спасибо всем, а ларчик  просто открывался))

 

для термина поле Сопутствующие (ссылка на термин)

 

вьюс: вывод материала

в отношения:

Содержимое: Термины таксономии материала

(термин) Термин таксономии: Термин таксономии, используя Связанные категории

Аргументом:

(поле Сопутствующие) Термин таксономии: ID термина

 Предоставить значение по умолчанию   > ID термина из URL > взять значение со страницы

добавить проверку

 

Что, сколько и где выводим и группируем, и как сортируем - отдельный разговор)

Таким образом решил показ сопутствующих товаров.

 

Может кому полезно будет, аможет кто покритикует,

а я пошел замеры делать.

 

Саныч.