Как создать иерархию материалов?

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

Аватар пользователя aliasnameless aliasnameless 8 ноября 2013 в 12:41

Доброго времени суток! Я с друпалом около недели, поэтому просьба сильно не пинать за возможно некорректный или повторяющийся вопрос. Искать сложно т.к. пока плохо владею терминологией.

задача такая:

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

Материалы типа А и Б содержат разные наборы полей и имеют разные шаблоны для отображения (node--typeA.tpl.php и node--typeB.tpl.php соответственно).

Вопрос такой: как организовать такую иерархию? Сделать материалы типа A словарем токсономии (тогда как привязать к node--typeA.tpl.php), или есть вариант оставить его материалом?

Комментарии

Аватар пользователя serega111 serega111 8 ноября 2013 в 13:03

Добавьте к материалу типа А поле типа entityreference (модуль entity reference есть на d.org). Настройте поле так, чтобы можно было прикреплять только материалы типа Б, и кол-во значений - неограниченно. Тогда к каждой ноде типа А можно будет прикрепить несколько нод типа Б и вывести их на странице материала типа А. Получится иерархия только на 1 уровень.

Аватар пользователя serega111 serega111 8 ноября 2013 в 15:41

конечно. можно вывести через views в блоке с контекстным фильтром, можно через panels, можно переписать node-typeA.tpl.php

Аватар пользователя aliasnameless aliasnameless 8 ноября 2013 в 16:16

Спасибо, как раз метод переписывания node-typeA.tpl.php более подходит т.к. шаблон погоняется под сайт. Теперь буду думать как из node-typeA.tpl.php через апи добраться до списка нодов типа Б, имеющих ссылки на нод типа А

Аватар пользователя serega111 serega111 8 ноября 2013 в 16:57

https://api.drupal.org/api/drupal/themes%21bartik%21templates%21node.tpl...
поля уже готовы к рендерингу, смотрите описание переменной $content. Только в настройках отображения поля нужно выбрать форматтер - ссылка к сущности. Вроде entityreference такой форматтер предоставляет

Аватар пользователя aliasnameless aliasnameless 12 ноября 2013 в 13:39

Отвечаю сам...
Переменная $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 содержит только одно значение.
По мотивам этого поста

Всем удачи, может кому пригодится.