Как вывести поле из Entity Reference в node.tpl.php ?

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

Аватар пользователя trolik trolik 20 ноября 2016 в 14:33

Привет друзья!
Помогите пожалуйста советом или ссылкой.
Суть проблемы.
Есть тип материала Автор и тип Книга. Соответсвенно при создании Книги, я могу выбрать Автора посредством поля Entity Reference. В ноде Книги мне нужно выводить несколько полей из Автора. Как это сделать в node--book.tpl.php? Если с "родными" полями проблем нет
<?php print render($content['field_name']) ?>
То как вывести поля из Entity Reference?
Спасибо за любой ответ.

Лучший ответ

Аватар пользователя dgastudio dgastudio 20 ноября 2016 в 18:08
1

если вы работаете напрямую в шаблоне то

$ref = node_load($node->field_ref['und'][0]['target_id']); //получили объект
$rev_nv = node_view($ref); // получили готовый рендер массив

print render($rev_nv['body']); // вывели нужное поле

//хотя чисто теоретически должно работать
print render($content['field_ref']['body']);

Комментарии

Аватар пользователя bumble bumble 20 ноября 2016 в 16:15

Поле Entity Reference хранит в себе только ID сущности.

Для того чтоб иметь доступ к полям сущности отмеченной в Entity Reference, её необходимо сначала загрузить (node_load) и вывести рендер массивом (node_view).
И потом Вы сможете выводить поля сущности с помощью функций render().

Т.к. логика в шаблонах считается крайне плохим тоном - рекомендую все это делать либо в препроцессоре, или в хуках отвечающих за вывод ноды - hook_node_view.

Так же, в Вашем случае, можно создать псевдо-поле, тогда вообще не нужно будет лезть в шаблон ноды. Тут хороший ман по этой теме.

Аватар пользователя gun_dose gun_dose 20 ноября 2016 в 17:19

Всё значительно проще - в шаблоне в переменной $content все поля уже есть в том виде, в котором их накликали в настройках отображения. И обращение к такому полю происходит так же, как и к любому другому.

Аватар пользователя bumble bumble 20 ноября 2016 в 17:23

trolik wrote:

В ноде Книги мне нужно выводить несколько полей из Автора. Как это сделать в node--book.tpl.php?

Нужно поле из связанной сущности, а не поле связанной сущности, которое рендерится в соответствии с настройками view_mode.

Аватар пользователя bumble bumble 20 ноября 2016 в 17:35

Ок. Допустим, нужно сделать следующую структуру:

  • Название книги: поле ноды
  • Автор книги: поле ER (пусть будет entity reference view formatter)
  • Жанр книги: поле ноды
  • Родина автора: поле ER (тут еще раз обратится можно к полю из связанной сущности?)
  • ...
Аватар пользователя trolik trolik 20 ноября 2016 в 17:41

Спасибо за советы!
В <?php dpm($field_author); ?> я вижу искомое поле, а вывести не могу. И понимаю, что тривиальная задача, и должно быть на ровном месте затупил, но я тупо не пойму как к нему достучатся.
Скриншот функции dpm

Аватар пользователя bumble bumble 20 ноября 2016 в 17:51
1

Если картинку нужно получить - можно, например ф-цией theme_image_style():

<?php
$file 
$field_author[0]['entity']->collaborator_image[LANGUAGE_NONE][0];
$variables = array(
  
'style_name' => 'thubmnail',
  
'path' => $file->uri,
  
'width' => isset($file->width) ? $file->width '',
  
'height' => isset($file->height) ? $file->height '',
);
$image theme_image_style($variables);
?>

Потом, в шаблоне можно:  <?php print $image; ?>

UPD - сократил трохи...

Аватар пользователя BatKor BatKor 20 ноября 2016 в 17:59

Дружище!!!, не парься сильно! могу лишь по советовать потыкай по больше и обязательно получится. Это совет действует если ты, "занимаешься". Если нет то удачи в вопросах может кто ни быдь и ответит тебе правильно.
P.S. пиши
<?php print $field_author  ?>

если не видишь скомпилированный html.
вообще если это поле ноды то темезируй его напримую через fiels--...tpl.php

Аватар пользователя BatKor BatKor 20 ноября 2016 в 18:03

Я заново прочитал твой вопрос. Могу сказать чтобы ты создал файл field--FIELD_NAME.tpl.php и тут начал его выводить так как тебе нужно.

Аватар пользователя dgastudio dgastudio 20 ноября 2016 в 18:08
1

если вы работаете напрямую в шаблоне то

$ref = node_load($node->field_ref['und'][0]['target_id']); //получили объект
$rev_nv = node_view($ref); // получили готовый рендер массив

print render($rev_nv['body']); // вывели нужное поле

//хотя чисто теоретически должно работать
print render($content['field_ref']['body']);