В общем, есть ноды ссылающиеся на одну обобщающую.
Как вводить эти ноды в обобщающей сто раз обсуждалось и тут вопросов нет.
Но как вывести все ноды связанные обобщающей, если мы просматриваем одну из этих дочерних нод?
В общем, есть ноды ссылающиеся на одну обобщающую.
Как вводить эти ноды в обобщающей сто раз обсуждалось и тут вопросов нет.
Но как вывести все ноды связанные обобщающей, если мы просматриваем одну из этих дочерних нод?
Комментарии
В целом в принципе надо слегка переписать php аругменты, просто вам надо в view передать nid того обобщающего нода, а не nid просматриваемого, так как просматриваемый нод как и все другие тоже ссылается на обобщающий, то все что надо сделать в аргументах при выводе view в блоке
это использовать свой php код
return $curNode->cck_ref_field[0]['value'];
Или что-то типа такого
спасибо, сейчас попробую..
Во views выбрал тип аргумента >
Содержимое: Мое поле.
В PHP code вставил ваш код, заменив имя поля на свое...
Уверен, что я не все сделал и врядли правильно) возможно, нужно еще что-то дописывать?
В программиинге, увы, не разбираюсь
;-(
не не так, в фильтрах выбрать тип связанных нод,
в аргументах выбрать node_reference, он выберет из наших связанных нод только те в cck поле node_reference которых будет nid, который мы с помощью php скормим в аргументы
вот у этого аргумента node_reference в view надо выбрать php код по умолчанию
и вставить то что было выше
Наврал малясь, надо вот так
return $curNode->cck_ref_field[0]['nid'];
для ноде референс полей вообще нет 'value' есть только 'view' = заголовок на что ссылается и 'nid'
это как раз то что надо выцапать.
проверить сможете только при открытии страницы одной из связанных нод.
в view проверить почти никак, так как текущая страница для редактирования view никаких ноде референс полей не имеет.
Чтобы совсем уж до кучи, надо убрать из списка ту запись на странице которой мы находимся.
для этого добавим фильтр материал:nid
укажем is not equal, поле для значения оставить пустым, таким образом мы создали фильтр, который должен отсечь нас же самих. единственаня проблема то, что фильтры увы обрабатываются view до того как вызывается обработчик аргументов, чтобы до конца собрать запрос. А это значит что из кода php формально нельзя установить значение фильтра и надеятся что фильтр его схавает, так как на самом деле sql запрос уже построен и в запросе уже есть условие что node.nid != 0, так как поле в фильтре мы оставили пустым. Поэтому подглядев класс view_handler_filter я сделал ход конем, а точнее добавляю в запрос новое условие этим же самым фильтром, предварительно скормив в фильтр нужное мне значение.
$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'];
В результате открыв такой узел вы увидите ниже все узлы завязанные на обобщающий узел, кроме того что уже отображен.
Xermit, большое спасибо, все получилось. Кроме убрать из списка ту запись на странице которой мы находимся. Смог сделать только ссылку на нее активной, что тоже хорошо.
Еще как вариант динамически задать параметр для фильтра это самом блок создать и сформировать view как например описано здесь
http://programmingbulls.com/drupal-6-revisted-passing-arguments-through-...
было бы что нить типа такого
$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
Шикарно! Все работает ^_^
Безграничный вам респект за развернутую помощь!
И в закладки)
Блин, народ, а у меня не получается. Создала views блок, в фильтре нужный мне тип материала А, который ссылается через поле field_ref на другой тип Б.
В аргументах написала такой php-код
$curNode = menu_get_object();
return $curNode->field_ref[0]['nid'];
Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них.
А у меня выводится просто список всех материалов А, причем на любой ноде. Почему он не берет мой аргумент. Объясните, пожалуйста.
Я сам запутался в постановке задаче, думаю ошибка в понимании.
Что вы имели ввиду "Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них."
Какой тип материала подразумевался в конце предложения. А точнее, когда должен выводится список нодов типа А, ссылающиеся на Б, когда открыта нода типа Б или А?
У меня тип Автор, к нему привязан тип Песня. Разумеется, что у одного Автора несколько песен. Я хочу чтобы при открытии ноды-песни, на странице отображался блок с остальными песнями того же автора.
"Надо, чтобы выводился список нод A, которые привязаны к типу Б, только когда открыта одна из них." Т.е. когда открыта А.
Тогда странно что не работает. А как осуществлена привязка Песни к Автору, я так понимаю у типа Песня есть поле node_referеnce в котором вы выбираете Автора? Если наоборот то работать не будет.
Да, у типа Песня 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! Вы считаете, что я все правильно сделала, да?
Вы не туда вставили код, вы его вставили в то место где должен быть код проверяющий сами переданные аргументы, а надо было в списке
Action to take if argument is not present:
выбрать Provide default argument/PHP Code
и вставить его туда.
В остальном все верно.
Xermit, огромное Вам спасибо!!! Вы меня спасли! Все получилось ) Ура!!! Я так рада )))
Спасибо огромное, Xermit!
Мне помогло для выдачи через views списка для выбора связанных нод через nodereference.
Возник такой вопрос - а можно ли каким-то образом редактировать модератору или администратору чужие ноды так, что бы в результате для выбора показывались не созданные модератором или администратором ноды, а те, что показываются автору, т.е. созданные им?