Node reference: вывод всех ссылающихся нод в блоке (views?) при просмотре одной из этих нод

Аватар пользователя tyred tyred 23 августа 2010 в 19:28

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

Комментарии

Аватар пользователя Xermit Xermit 23 августа 2010 в 20:23

В целом в принципе надо слегка переписать php аругменты, просто вам надо в view передать nid того обобщающего нода, а не nid просматриваемого, так как просматриваемый нод как и все другие тоже ссылается на обобщающий, то все что надо сделать в аргументах при выводе view в блоке
это использовать свой php код

$curNode = menu_get_object();
return $curNode->cck_ref_field[0]['value'];

Или что-то типа такого

Аватар пользователя tyred tyred 23 августа 2010 в 21:04

Во views выбрал тип аргумента >
Содержимое: Мое поле.
В PHP code вставил ваш код, заменив имя поля на свое...
Уверен, что я не все сделал и врядли правильно) возможно, нужно еще что-то дописывать?
В программиинге, увы, не разбираюсь
;-(

Аватар пользователя Xermit Xermit 23 августа 2010 в 21:27

не не так, в фильтрах выбрать тип связанных нод,
в аргументах выбрать node_reference, он выберет из наших связанных нод только те в cck поле node_reference которых будет nid, который мы с помощью php скормим в аргументы
вот у этого аргумента node_reference в view надо выбрать php код по умолчанию
и вставить то что было выше

Аватар пользователя Xermit Xermit 23 августа 2010 в 23:09

Наврал малясь, надо вот так

$curNode = menu_get_object();
return $curNode->cck_ref_field[0]['nid'];

для ноде референс полей вообще нет 'value' есть только 'view' = заголовок на что ссылается и 'nid'
это как раз то что надо выцапать.

проверить сможете только при открытии страницы одной из связанных нод.

в view проверить почти никак, так как текущая страница для редактирования view никаких ноде референс полей не имеет.

Аватар пользователя Xermit Xermit 24 августа 2010 в 4:40

Чтобы совсем уж до кучи, надо убрать из списка ту запись на странице которой мы находимся.
для этого добавим фильтр материал:nid
укажем is not equal, поле для значения оставить пустым, таким образом мы создали фильтр, который должен отсечь нас же самих. единственаня проблема то, что фильтры увы обрабатываются view до того как вызывается обработчик аргументов, чтобы до конца собрать запрос. А это значит что из кода php формально нельзя установить значение фильтра и надеятся что фильтр его схавает, так как на самом деле sql запрос уже построен и в запросе уже есть условие что node.nid != 0, так как поле в фильтре мы оставили пустым. Поэтому подглядев класс view_handler_filter я сделал ход конем, а точнее добавляю в запрос новое условие этим же самым фильтром, предварительно скормив в фильтр нужное мне значение.

$node = menu_get_object();
$view = views_get_current_view();
foreach($view->display_handler->get_handlers('filter') as $type => $filter_handler)
{
  if ($type == 'nid')
  {
    $filter_handler->value['value'] = $node->nid;
    $filter_handler->query();
  }}
return $node->field_ref[0]['nid'];

В результате открыв такой узел вы увидите ниже все узлы завязанные на обобщающий узел, кроме того что уже отображен.

Аватар пользователя Antoniy Antoniy 15 апреля 2012 в 7:33

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

Аватар пользователя Xermit Xermit 24 августа 2010 в 4:45

Еще как вариант динамически задать параметр для фильтра это самом блок создать и сформировать view как например описано здесь
http://programmingbulls.com/drupal-6-revisted-passing-arguments-through-...

было бы что нить типа такого

$view = views_get_view('CCKRefView'); // fetch the view
$display_id = 'default'; // chose the display type
$view->set_display($display_id);
$view->is_cacheable = FALSE;
$item = $view->get_item($display_id, 'filter', 'nid');
$item['value'] = $node->nid;
$view->set_item($display_id, 'filter', 'nid', $item); // единственное здесь возможно чтобы set_item заработал придется exposed сделать фильтр, это я не проверял.
$view->is_cacheable = FALSE;
$output = $view->render(); //
print $output; // display output
Аватар пользователя tyred tyred 24 августа 2010 в 9:00

Шикарно! Все работает ^_^
Безграничный вам респект за развернутую помощь!
И в закладки)

Аватар пользователя Беленькая Беленькая 30 октября 2010 в 11:48

Блин, народ, а у меня не получается. Создала views блок, в фильтре нужный мне тип материала А, который ссылается через поле field_ref на другой тип Б.

В аргументах написала такой php-код

$curNode = menu_get_object();
return $curNode->field_ref[0]['nid'];

Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них.
А у меня выводится просто список всех материалов А, причем на любой ноде. Почему он не берет мой аргумент. Объясните, пожалуйста.

Аватар пользователя Xermit Xermit 31 октября 2010 в 16:31

Я сам запутался в постановке задаче, думаю ошибка в понимании.
Что вы имели ввиду "Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них."

Какой тип материала подразумевался в конце предложения. А точнее, когда должен выводится список нодов типа А, ссылающиеся на Б, когда открыта нода типа Б или А?

Аватар пользователя Беленькая Беленькая 31 октября 2010 в 16:36

У меня тип Автор, к нему привязан тип Песня. Разумеется, что у одного Автора несколько песен. Я хочу чтобы при открытии ноды-песни, на странице отображался блок с остальными песнями того же автора.

Аватар пользователя Беленькая Беленькая 31 октября 2010 в 16:37

"Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них." Т.е. когда открыта А.

Аватар пользователя Xermit Xermit 31 октября 2010 в 16:42

Тогда странно что не работает. А как осуществлена привязка Песни к Автору, я так понимаю у типа Песня есть поле node_referеnce в котором вы выбираете Автора? Если наоборот то работать не будет.

Аватар пользователя Беленькая Беленькая 31 октября 2010 в 16:53

Да, у типа Песня nodereference-поле, которое ссылается на Автора.
Во views блок, где в фильтре тип Песня, а в Аргументе

nodereference-поле (field_elu4iz)

Action to take if argument is not present:
Display all values

Validator options
Validator: php-code

$node = menu_get_object();
$view = views_get_current_view();
foreach($view->display_handler->get_handlers('filter') as $type => $filter_handler)
{
if ($type == 'nid')
{
$filter_handler->value['value'] = $node->nid;
$filter_handler->query();
}}
return $node->field_elu4iz[0]['nid'];

Не пойму, почему же ничего не получается.

Аватар пользователя Xermit Xermit 1 ноября 2010 в 0:30

Вы не туда вставили код, вы его вставили в то место где должен быть код проверяющий сами переданные аргументы, а надо было в списке
Action to take if argument is not present:
выбрать Provide default argument/PHP Code
и вставить его туда.
В остальном все верно.

Аватар пользователя dandily dandily 16 ноября 2010 в 19:19

Спасибо огромное, Xermit!
Мне помогло для выдачи через views списка для выбора связанных нод через nodereference.

Возник такой вопрос - а можно ли каким-то образом редактировать модератору или администратору чужие ноды так, что бы в результате для выбора показывались не созданные модератором или администратором ноды, а те, что показываются автору, т.е. созданные им?