Коллеги, подскажите пожалуйста, как можно такое сделать не прибегая к созданию views для ноды, а с использованием шаблона twig для drupal 8.
Необходимо на странице ноды вывести поле таксономии, которой принадлежит текущая нода.
На самом деле задача более сложная. Вывод поля таксономии для ноды. Если в текущем уровне таксономии, которой принадлежит нода, это поле не заполнено, то берём значение со старшего уровня таксономии. И так до корня, пока не будет получено существующее значение поля таксономии.
Пробовал сделать как описано здесь, но ни чего не получилось. Высыпалась куча ошибок.
Может кто подскажет как можно в node.twig вывести поле таксономии для ноды на экран?
Комментарии
- Я бы сделал как и пологается на _prerprocess_node переменные а только потом их {{ term.field }}
- В припроцессе терминальный объект получать типа $term = $node->get('termFieldName')->entity()
В результате будет получен указатель на узел таксономии, соответствующий данной странице (ноде)? Далее с $term работать как с таксономией?
Если таксономия имеет поле с машинным именем field_image, то будем работать например $term->get('field_image')->value, верно мыслю?
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.
Сделал в функции так
$node = $variables['node'];
$term = $node->get('field_innode_totaxonomy')->getValue();
это работет.
А вот извлечь значение поля из термина таксономии не удаётся.
... $vars['node']->get('field_trade_color')->first()->getValue()['target_id'] ...
Пытаюсь сделать, как подсказываете и не поулчается. Не доходит до меня, что есть что.
$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();
Я всё же не могу понять как мне получить доступ к полям таксономии.
Если можете, подскажите.
> Я всё же не могу понять как мне получить доступ к полям таксономии.
$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();
Большое спасибо вам за подсказки.
Но я уже пробовал
$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.
Не удаётся победить вывод в twig.
Перепробовал различные варианты, например этот, этот, вот этот.
Что не так? Или как нужно? Как это вообще делается по уму?
Если Вам нужен view для поля то его настройки находятся в дисплеях entity через formatter поля. У Вас например для entity_reference поле надо задать formatter вывода с указанием view_mode, а в entity -> display для поля термина нужный для него formatter.
Удалось!
Если кому-то будет полезно в файле темы
<?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
{{ myval }}
{% endif %}
sasdrupal.org , выражаю вам благодарность за помощь!
Сказать спасибо можно через контекстное меню поста -> Спасибо