Как передать аргументы представлению в поле CCK Viewfield?

Аватар пользователя direqtor direqtor 4 августа 2008 в 7:00

Разбираюсь тут с полем CCK Viewfield или View reference
Использую его порт на Drupal 6. Интересная штука. Позволяет добавлять Views в материалы в виде поля. В связи с этим возникла идея решить с его помощью старую проблему.

Есть два типа материала Page и Story. У Story имеется поле nodereference, которое ссылается на Page. Задача состоит в том, чтобы получить при просмотре Page список всех Story, которые ссылаются на него. Обычно это решается полем CCK nodereferer, которое добавляется в материал типа Page и автоматически создает список требуемых Story. Но у него только три возможности отображения: заголовок со ссылкой, тизер и полный вид. Представления же дают практически неограниченные возможности для настройки внешнего вида списков, в связи с чем возникла другая идея реализации этого функционала.

Создаем View, который отображает список материалов типа Story. В аргументы представления добавляем то самое поле nodereference из Story. В фильтрах ставим Тип материала = Story и Node: Published = True. Так же добавляем в представление Блок или Страницу (во View Referernce почему-то можно ссылаться только на них). Создаем в материале Page поле типа View reference. В значение Defaul value ставим наше представление. Ниже есть фильтр доступных представлений. Оставляем там только требуемое нам, что бы пользователь не мог изменить значение. Теперь при создании материала Page в поле View reference будет стоять наше представление. Если бы при просмотре Page его nid передавался бы в качестве аргумента в представление, то это бы было идеальным способом отображения всех Story ссылающихся на наш Page.

Вот только это если... Я еще слабовато знаком с представлениями, чтобы с ходу решить эту задачу. Как передать nid ноды в представление присоединенное через View reference?

В настройках аргумента node reference есть поля Wildcard - не знаю может оно как-то влияет на это.
Попробовал там же поставить Validator: Node, а в Argument type: Node ID, поигрался с типами перечисленными в настройках – ничего не получается. Отображаются все ноды отсекаемые фильтром но аргумент в представление не передается. Можно поставить фильтр для node reference, но тогда для каждого Page придется создавать свое дефолтовое представление отличающееся только одним значением в фильтре – та еще работенка, да и нерациональная к тому же.
На Drupal.org нашел на эту тему Viewfield Argument Using Nodereference Field - кого-то посетила та же идея.
Ответ на такой же как у меня вопрос звучал так:
You need to pass the NID of the nodereference field instead of %nid do to what i think you want to do. this can be done in the phpcode section under default value (and you can hide the whole affair as well so you users dont have to see the nonsense of selecting vierws, etc.)
Написанное я понимаю, но вот где проставить это %nid, что бы все заработало?

Комментарии

Аватар пользователя kyky kyky 4 августа 2008 в 9:27

в пятерке это делается так:

у вида создается аргумент Node Reference
заполняя форму отправки материала, в поле views_reference указываете аргумент текущей ноды, помоему NID или %NID.
В настройках поля этот аргумент можно сделать по умолчанию.

Пишу по памяти, так как мой сайт, на котором действует этот механизм, НЕ ДОСТУПЕН!
Как только заработает, проверю и уточню!

Аватар пользователя direqtor direqtor 4 августа 2008 в 12:50

заполняя форму отправки материала, в поле views_reference указываете аргумент текущей ноды, помоему NID или %NID
В этой форме, либо Select list, либо Autocomplete text field. NID там ввести некуда.

Аватар пользователя EllECTRONC EllECTRONC 4 августа 2008 в 15:35

Аргументы типа %1, %2 нужно вводить в поле Опции при аргументе, но не все поля имеют эту особенность.

Аватар пользователя andyceo andyceo 14 августа 2008 в 0:53

Да, я тоже не понял как сказать ViewField'у что надо использовать в качестве параметра ID текущей ноды, например.

На странице создания поля, если выбрать создание поля Nodereference, ViewField, мы снизу можем видеть, какие Виды нам доступны, и выбирать из них. Там же еще чуть снизу есть поле, где можно ввести аргументы для выбранного вида. Только туда можно ввести конкретные значения, а так, чтобы переменную указать (например, ID текущей ноды) нельзя.

И как вы делали с помощью ViewField встроенные виды, не понимаю. Нашёл один из выходов из данной ситуации - вставка вида вручную из php-кода : http://drupal.org/node/48816

Аватар пользователя direqtor direqtor 20 августа 2008 в 5:40

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

Аватар пользователя direqtor direqtor 20 августа 2008 в 6:30

Где такое подполе?

Конфигурация поля в типе материала дает для настройки только:

Label;
Widget type;
Default value с подполем PHP code;
Display in group;
Help text;

В разделе Global settings:
Required;
Number of values;
Views to omit from selection choices;

Все... Никаких аргументов там нет.

Аватар пользователя Nikit Nikit 20 августа 2008 в 7:37

Делал когда-то такое, сейчас по апи быстрее получается.
Смысл: Отношение Торговый дом и организации расположенные в нем.

  • тип ноды "Торговый дом": поле - View reference "Организации", что там стоит см.ниже
  • тип ноды "Организации": поле - Node Reference "Торговые дома", тут ничего особенного
  • вид firms_view: встречающий аргумент выбирается поле Node Reference "Торговые дома", в параметрах аргумента "По умолчанию" стоит "Показать все значения", остальное не заполнено (не помню почему)

Quote:

Так же добавляем в представление Блок или Страницу (во View Referernce почему-то можно ссылаться только на них). Создаем в материале Page поле типа View reference. В значение Defaul value ставим наше представление. Ниже есть фильтр доступных представлений. Оставляем там только требуемое нам, что бы пользователь не мог изменить значение.

Где Default value стоит firms_view и еще ниже поле arguments, там у меня стоит %nid.
И вот работающий пример.

Аватар пользователя ryumkin ryumkin 28 августа 2009 в 17:58

Nikit wrote:
Делал когда-то такое, сейчас по апи быстрее получается.
Смысл: Отношение Торговый дом и организации расположенные в нем.

  • тип ноды "Торговый дом": поле - View reference "Организации", что там стоит см.ниже
  • тип ноды "Организации": поле - Node Reference "Торговые дома", тут ничего особенного
  • вид firms_view: встречающий аргумент выбирается поле Node Reference "Торговые дома", в параметрах аргумента "По умолчанию" стоит "Показать все значения", остальное не заполнено (не помню почему)

Quote:

Так же добавляем в представление Блок или Страницу (во View Referernce почему-то можно ссылаться только на них). Создаем в материале Page поле типа View reference. В значение Defaul value ставим наше представление. Ниже есть фильтр доступных представлений. Оставляем там только требуемое нам, что бы пользователь не мог изменить значение.

Где Default value стоит firms_view и еще ниже поле arguments, там у меня стоит %nid.
И вот работающий пример.

У меня не получилось - все сделал в точности. Использую Drupal 6. Настройки для вьюхи теже.
Делал вывод и блоком и страницей, ставил %nid, nid, NID, %NID и без толку - ничего не выводит. Пусто.
Что еще можно попробовать?

Аватар пользователя direqtor direqtor 20 августа 2008 в 12:27

Ну что ж, жду выхода версии viewfield на 6-ку, а пока буду пользоваться внедрением view в node-[тип_ноды].tpl.php

Аватар пользователя quaser quaser 1 ноября 2008 в 5:13

direqtor, вы решили передачу $node->nid в виде аргумента? А то такая же проблема. Ничего в шестёрке сделать не могу...

Аватар пользователя direqtor direqtor 1 ноября 2008 в 5:39

С передачей не решил.

Пользуюсь внедрением.
Настроил views c аргументом для поля nodereference
В файл node-[тип_ноды].tpl.php после вывода $content добавил:

$view = views_get_view('имя_представления');
print $view->execute_display('default', array($node->nid));