Вывод поля таксономии на странице ноды через twig

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

Аватар пользователя Maxlynx Maxlynx 17 декабря 2017 в 16:33

Коллеги, подскажите пожалуйста, как можно такое сделать не прибегая к созданию views для ноды, а с использованием шаблона twig для drupal 8.

Необходимо на странице ноды вывести поле таксономии, которой принадлежит текущая нода.

На самом деле задача более сложная. Вывод поля таксономии для ноды. Если в текущем уровне таксономии, которой принадлежит нода, это поле не заполнено, то берём значение со старшего уровня таксономии. И так до корня, пока не будет получено существующее значение поля таксономии.

Пробовал сделать как описано здесь, но ни чего не получилось. Высыпалась куча ошибок.
Может кто подскажет как можно в node.twig вывести поле таксономии для ноды на экран?

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 17 декабря 2017 в 19:30
1

- Я бы сделал как и пологается на _prerprocess_node переменные а только потом их {{ term.field }}
- В припроцессе терминальный объект получать типа $term = $node->get('termFieldName')->entity()

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 7:55

В результате будет получен указатель на узел таксономии, соответствующий данной странице (ноде)? Далее с $term работать как с таксономией?
Если таксономия имеет поле с машинным именем field_image, то будем работать например $term->get('field_image')->value, верно мыслю?

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 8:20

function mytheme_preprocess_node(&$variables){
//$nid = \Drupal::routeMatch()->getRawParameter($node_id);
//$node = \Drupal::entityTypeManager()->getStorage('node')->load($nid);
$term = $node->get('field_innode_totaxonomy')->entity();
$variables['myval'] = $term->get('field_image')->value;
}

На этом этапе $term = $node->get появляется ошибка Error: Call to a member function get() on null
Нода создаётся как материал определённого типа. В типе материала есть поле field_innode_totaxonomy для связи с таксономией. У таксономии есть поле содержащее картинку field_image.

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 8:29

Сделал в функции так
$node = $variables['node'];
$term = $node->get('field_innode_totaxonomy')->getValue();
это работет.
А вот извлечь значение поля из термина таксономии не удаётся.

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 9:17

Пытаюсь сделать, как подсказываете и не поулчается. Не доходит до меня, что есть что.
$term = $node->get('field_innode_totaxonomy')->getValue();
print_r($term);

Здесь я вижу, что $term содержит идентификатор того самого термина таксономии.
В вашей строчке $vars['node']->get('field_trade_color')->first()->getValue()['target_id']
field_trade_color - это то связь с термином таксономии?
target_id - это что, машинное имя извлекаемого поля из таксономии?

$vars['node']->get('field_trade_color')->first()->getValue()['target_id'] это эквивалент
$node = $variables['node'];
$term = $node->get('field_innode_totaxonomy')->getValue();

Я всё же не могу понять как мне получить доступ к полям таксономии.
Если можете, подскажите.

Аватар пользователя sas@drupal.org sas@drupal.org 18 декабря 2017 в 10:25
1

> Я всё же не могу понять как мне получить доступ к полям таксономии.


$tid = $variables['node']->get('field_innode_totaxonomy')->first()->getValue()['target_id'];
$term = taxonomy_term_load($tid);

//Получить значение поля field_name из термина с delta = 0
$term_field = $term->get('field_name')->first();

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 11:24

Большое спасибо вам за подсказки.
Но я уже пробовал
$field = $term->get('field_image')->value
и
$field = $term->get('field_image')->getValue()
$variables['myfield'] = $field;
Затем в twig
{{ myfield }}
Но всё безрезультатно. Либо сыпались ошибки, либо ни чего не выводится на экран.
print_r($field) отображает пустой массив.
$mv = $term->get('field_image')->getValue();
$variables['myval'] = array_map(function($delta) {
return $delta['uri'];
}, $mv);
Такое тоже не работет, пишет ошибки.
Возможно нужно отрендерить прежде чем записывать в $variables.

Аватар пользователя sas@drupal.org sas@drupal.org 18 декабря 2017 в 12:02
1

Если Вам нужен view для поля то его настройки находятся в дисплеях entity через formatter поля. У Вас например для entity_reference поле надо задать formatter вывода с указанием view_mode, а в entity -> display для поля термина нужный для него formatter.

Аватар пользователя Maxlynx Maxlynx 18 декабря 2017 в 12:05

Удалось!

Если кому-то будет полезно в файле темы

<?php
theme_preprocess_node
(&$variables){
    
$node $variables['node'];
    
// field_innode_totaxonomy - поля, связи ноды с таксономией
    
$tid $node->get('field_innode_totaxonomy')->first()->getValue()['target_id'];
    
$term taxonomy_term_load($tid);
    
// field_image - машинное имя поля таксономии, которое хотим отобразить
    
$mv $term->get('field_image')->first()->view();
    
// myval - переменная, которая будет выводить содержимое в twig
    
$variables['myval'] = $mv;
?>

Ну и в самом файле twig

{% if node.hasField('field_innode_totaxonomy') == true %}
   {{ myval }}
{% endif %}

sasdrupal.org , выражаю вам благодарность за помощь!