Доброго времени суток! Я с друпалом около недели, поэтому просьба сильно не пинать за возможно некорректный или повторяющийся вопрос. Искать сложно т.к. пока плохо владею терминологией.
задача такая:
Есть главная страница которая содержит список материалов типа А.
Есть страницы с материалами типа А, каждая из которых содержит свой список материалов типа Б.
Материалы типа А и Б содержат разные наборы полей и имеют разные шаблоны для отображения (node--typeA.tpl.php и node--typeB.tpl.php соответственно).
Вопрос такой: как организовать такую иерархию? Сделать материалы типа A словарем токсономии (тогда как привязать к node--typeA.tpl.php), или есть вариант оставить его материалом?
Комментарии
Добавьте к материалу типа А поле типа entityreference (модуль entity reference есть на d.org). Настройте поле так, чтобы можно было прикреплять только материалы типа Б, и кол-во значений - неограниченно. Тогда к каждой ноде типа А можно будет прикрепить несколько нод типа Б и вывести их на странице материала типа А. Получится иерархия только на 1 уровень.
Спасибо!
А возможно ли будет темизировать вывод списка нодов типа Б в шаблоне нода типа А node--typeA.tpl.php ?
конечно. можно вывести через views в блоке с контекстным фильтром, можно через panels, можно переписать node-typeA.tpl.php
Спасибо, как раз метод переписывания node-typeA.tpl.php более подходит т.к. шаблон погоняется под сайт. Теперь буду думать как из node-typeA.tpl.php через апи добраться до списка нодов типа Б, имеющих ссылки на нод типа А
https://api.drupal.org/api/drupal/themes%21bartik%21templates%21node.tpl...
поля уже готовы к рендерингу, смотрите описание переменной $content. Только в настройках отображения поля нужно выбрать форматтер - ссылка к сущности. Вроде entityreference такой форматтер предоставляет
Отвечаю сам...
Переменная $content будет содержать поле entityreferens только в дочернем ноде.
Для того, чтобы из родительского нода получить список дочерних нодов (которые содержат entityreference со ссылкой на родительский) нужен такой код:
<?php
/*
Функция возвращает список NID нодов в которых поле entityreference ссылается нод переданный в аргументе $nodeId (родительский нод)
$nodeType - содержит машинное имя поля entityreference в дочерней ноде.
*/ function mymod_get_entityreferences_settings($nodeType,$nodeId) { //передаем тип родительской ноды и ее NID
$table = 'field_data_'.$nodeType; //имя таблицы
$target_id = 'f.'.$nodeType.'_target_id'; //имя поля в табице $table которое содержит NID родительской ноды
$result = array();
// получаем список NID всех нодов имеющих в entityreferens ссылку на текущий
$query = db_select($table, 'f');
$query->fields('f', array('entity_id'));
$query->condition('f.deleted', '0'); //нод не удален
$query->condition($target_id, "$nodeId"); //Имеет ссылку на текущий
$query->distinct();
$rows = $query->execute();
foreach ($rows as $row)
$result[] = $row->entity_id;
return $result;
}
?>
Тестировалось при условии что entityreferens содержит только одно значение.
По мотивам этого поста
Всем удачи, может кому пригодится.