[РЕШЕНО] Как отобразить все ноды, ссылающиеся на данную, без передачи аргументов в URL

Главные вкладки

Аватар пользователя Technician Technician 25 января 2012 в 14:54

Есть два типа материала - производитель авто и модель авто. Установил модуль node reference, создал ссылку из модели авто на производителя. Для каждого производителя прописываю его название в качестве синонима URL. Получается, что страница, например, Audi доступна по адресу mysite.ru/audi (вместо mysite.ru/node/12). Хочу сделать, чтобы при входе на эту страницу отображался бы список всех моделей авто данного производителя. Создал соответствующее представление (в виде блока), создал в нем критерии фильтрации: "Содержимое: Опубликовано (Да), Содержимое: Тип (= Модель авто)", настроил вывод как хотелось, оно работает. На данном этапе на странице любого производителя выводятся все модели всех производителей.

Добавляю контекстный фильтр: "Содержимое: Производитель авто". И вот тут уже не все понятно. Если в предпросмотре представления указать номер ноды производителя (12 для Audi в моем случае), то видно, что фильтр срабатывает. Но при просмотре на сайте этот номер сейчас никак не передается и вывод оказывается пустой. Я так понимаю, требуется как-то передавать этот ID через URL, чтобы получилось что-то типа: mysite.ru/audi?vendor_id=12 и тогда view получит этот аргумент, применит его и все отфильтрует. Но это получается тавтология, получается, что я дважды передаю информацию о производителе. Более того страница производителя - это же нода, значит ее номер наверняка можно как-то передать напрямую во view. Но как?

Комментарии

Аватар пользователя Technician Technician 1 февраля 2012 в 19:18

Жаль, что никто не ответил. А проблемка решается крайне просто. Отпишусь, вдруг кому понадобится.

Когда создается контекстный фильтр (contextual filter) в представлении (view), то для него необходимо указать источник. Для этого в настройках контекстного фильтра следует в разделе "Когда значение фильтра НЕ доступно" выбрать пункт "Предоставить значение по умолчанию" и в выпадающем списке выбрать вариант "ID материала из URL". Готово! Все замечательно работает, при этом URL не содержит в чистом виде никаких ID.

Аватар пользователя ivan-zykov ivan-zykov 28 февраля 2012 в 1:02

Решаю похожую задачу, но так как использую EVA, то сделал представление Entity Content, настроил контекстные фильтры, как надо, но на нужной ноде все связанные материалы не выводятся. Коллеги, помогите!

Аватар пользователя Technician Technician 28 февраля 2012 в 8:56

ivan-zykov wrote:
Решаю похожую задачу, но так как использую EVA, то сделал представление Entity Content, настроил контекстные фильтры, как надо, но на нужной ноде все связанные материалы не выводятся. Коллеги, помогите!

Телепатов тут нет. Опишите подробно, что хотите получить, какие есть сущности, как они связаны, какие настройки и т.д.

Аватар пользователя ivan-zykov ivan-zykov 28 февраля 2012 в 19:10

Спасибо, что отозвались!

Есть материалы типа "Населённый пункт" и "Данные переписи". При создании или редактировании населённого пункта можно делать ссылку на один или несколько материалов типа "Данные переписи" через Node Reference (Drupal 7). Мне необходимо в таблице выводить список данных переписи на странице населённого пункта. Соответственно мои настройки view:

Тип представления: Entity Content (EVA)
Формат: Таблица
Критерии фильтрации: Содержимое: Опубликовано (Да), Содержимое: Тип (= Запись СНМ 1873)

Entity content settings
Тип сущности: Материал
Связки: Населённый пункт
Аргументы: id

Отношения
Содержимое: Номер в СНМ 1873 г. (поле node reference)

С такими настройками view отображается на всех нодах типа "Населённый пункт". Если добавить контекстный аргумент по nid и использовать связь из Отношений, то view уже нигде не отображается.

Заранее спасибо, если кто попробует помочь.

Аватар пользователя ivan-zykov ivan-zykov 28 февраля 2012 в 19:13

Да, чуть не забыл, в Drupal 6 использовать тип представления "содержимое материала" и просто добавлял аргумент "Материал: Nid" и всё работало. Но с EVA такого не получается.

Аватар пользователя ivan-zykov ivan-zykov 10 ноября 2015 в 11:48

Забавно, но я с самого начала создал представление типа "Блок", ннастроил контекстные фильтры и вывел этот блок на странице. В результате вызывается действие "Поведение при отсутствии результатов". Если удалить контекстные фильтры, то отображаются все ноды "Данные переписи" на всех страницах. Если в настройках контекстных фильтров "Когда значение фильтра НЕ доступно" указать "Отобразить все результаты для указанного поля", то блок так же отображается везде.

Аватар пользователя ivan-zykov ivan-zykov 3 марта 2012 в 15:03

Пробовал прописать PHP код для проверки контекстного фильтра:

<?php
$node 
node_load(arg(1));
$rez $node->nid;
return 
$rez;
?>

Но в итоге то же - вызывается действие "Поведение при отсутствии результатов".

Аватар пользователя Dima.nixx Dima.nixx 23 марта 2012 в 15:44

ivan-zykov wrote:
Проблему оказалось быстрее и полезнее решить самостоятельно...

А написать как вы это сделали религия не позволила?
У меня аналогичная ситуация, но от того, что у вас это получилось самостоятельно мне не легче...

Аватар пользователя ivan-zykov ivan-zykov 30 марта 2012 в 11:51

Dima.nixx wrote:

А написать как вы это сделали религия не позволила?
У меня аналогичная ситуация, но от того, что у вас это получилось самостоятельно мне не легче...

Я сам допустил ошибку по невнимательности. Мне нужно было вывести список нод, не ссылающиеся на данную, а все, на которые данная нода ссылается. Сделал через "Отношения". По решению же Вашей проблемы Technician описал всё верно. Если, конечно, Вы так же не ошиблись как и я, из-за невнимательности.

Аватар пользователя Technician Technician 23 марта 2012 в 18:33

Так, похоже, никому ничего непонятно.

Распишу тогда все по пунктам для полного просветления. Пусть у нас есть Производители авто и Модели авто, и мы хотим создать страницы производителей, на которых будут перечислены все модели авто данного производителя.

1. Подключаем модули References, Views, Display Suite.
2. Создаем свои типы материалов "Производитель авто" и "Модель авто". В "Модель авто" добавляем поле "Производитель", тип поля "Ссылка на материал", в настройках указываем, что ссылаться можно на тип материала "Производитель авто".
3. Создаем представление в виде блока "Модели авто данного производителя". Выдачу информации можно настроить как угодно, любые поля (Заголовок, Изображение и т.д.) и в любом виде, это на суть не влияет. В критериях фильтрации указываем "Содержимое:Опубликовано = Да, Содержимое:Тип = Модель авто". В контекстном фильтре добавляем условие "Содержимое:Производитель авто", в его настройках указываем "Когда значение фильтра НЕ доступно"-"Предоставить значение по умолчанию" и из списка выбираем "ID материала из URL". Чтобы проверить правильность работы представления, можно внизу в поле "Предпросмотр с контекстными фильтрами ввести ID ноды производителя. Например, производитель Audi отображается по адресу /node/12. Значит, надо ввести число 12, нажать "Обновить предпросмотр" и увидим список моделей Audi.
4. Теперь блочное представление "Модели авто данного производителя" надо превратить в поле, которое можно вывести в ноде. Для этого заходим в "Структура-Display Suite-Поля" и добавляем там блочное поле "Модели авто". В настройках выбираем созданный в п.3 блок из списка и настраиваем, где будет доступно это поле и выводить ли заголовок блока.
5. В настройках типа материала "Производитель авто" в управлении отображением надо выбрать какой-нибудь макет (это поле появляется после установки Display Suite). После этого блочное поле, созданное в п.4, будет доступно в списке полей (сначала попадет в "Отключено"). Ставим это поле в нужное место макета и при входе в режиме просмотра на ноду производителя видим инфу о производителе и список его моделей.

Аватар пользователя Madman Madman 9 июня 2012 в 23:48

Помогите пожалуйста с реализацией следующего:
«в контекстном фильтре добавляем условие "Содержимое:Производитель авто"»

Могу выбрать только фильтр "Содержимое:Тип" А где дальше указать этот самый тип?
Либо можно выбрать поля этого типа.

Аватар пользователя Madman Madman 10 июня 2012 в 0:12

"Madman" wrote:
«в контекстном фильтре добавляем условие "Содержимое:Производитель авто"»

Отвечаю, тем кто вдруг может также сглупить как я)))
Нужно выбрать поле referer'а. материала Модель авто.

Аватар пользователя mozh mozh 28 ноября 2014 в 12:30

"Technician" wrote:
4. Теперь блочное представление "Модели авто данного производителя" надо превратить в поле, которое можно вывести в ноде. Для этого заходим в "Структура-Display Suite-Поля" и добавляем там блочное поле "Модели авто". В настройках выбираем созданный в п.3 блок из списка и настраиваем, где будет доступно это поле и выводить ли заголовок блока.
5. В настройках типа материала "Производитель авто" в управлении отображением надо выбрать какой-нибудь макет (это поле появляется после установки Display Suite). После этого блочное поле, созданное в п.4, будет доступно в списке полей (сначала попадет в "Отключено"). Ставим это поле в нужное место макета и при входе в режиме просмотра на ноду производителя видим инфу о производителе и список его моделей.

вместо этого создал node--[type].tpl.php
и там вывел представление программно:
<?php print views_embed_view('multimedia', 'block_9'); ?>
данные для функции можно взять из url http://site .ru/admin/structure/views/view/multimedia/edit/block_9 при редактированни этого представления, в даннов случае: Модели авто
в результате не нужно ставить модуль Display suite.
И спасибо за подробное описание, пригодилось для отображения отзывов по книгам.