Я пытаюсь добавить обработчик предварительной обработки, чтобы добавить классы на основе имени таксономии в тело css моей установки drupal. Мне удалось получить всю информацию об узле на основе некоторого поиска, проб и ошибок, но я хотел бы перейти к следующему шагу и получить все термины таксономии на основе конкретного идентификатора узла.
Мой текущий код предварительной обработки следующий:
function custom_preprocess_html(&$variables) {
// Add the node ID and node type to the body class
$body_classes = [];
$nodeFields =\Drupal::service('current_route_match')->getParameter('node')->toArray();
if (is_array($nodeFields) && count($nodeFields) > 0) {
if (isset($nodeFields['nid'])) {
$body_classes[] = 'node-' . $nodeFields['nid'][0]['value'];
}
if (isset($nodeFields['type'])) {
$body_classes[] = $nodeFields['type'][0]['target_id'];
}
}
$variables['attributes']['class'] = $body_classes;
}
Он отлично работает и извлекает информацию об узле. Основываясь на ответе здесь, мне кажется, что все, что мне нужно сделать, это добавить следующую строку, чтобы получить термины таксономии: $taxonomyTerms = $nodefields->get('field_yourfield')->referencedEntities();, но когда я это сделаю, Drupal выдает ошибку. Я открыто признаю, что я новичок в Drupal 8, поэтому любые предложения о том, где я ошибаюсь (может быть, field_yourfield не существует?), Были бы очень признательны.



Если вы пытаетесь получить имена терминов, на которые ссылаются, и добавить их как классы тела, ваш подход кажется немного неправильным.
Вот что я использую:
function CUSTOM_preprocess_html(&$variables) {
// Entity reference field name.
$field_name = 'field_tags';
// Get the node object from the visited page.
// If the page is not a node detail page, it'll return NULL.
$node = \Drupal::request()->attributes->get('node');
// Let's make sure the node has the field.
if ($node && $node->hasField($field_name)) {
$referenced_entities = $node->get($field_name)->referencedEntities();
foreach ($referenced_entities as $term) {
$variables['attributes']['class'][] = \Drupal\Component\Utility\Html::cleanCssIdentifier($term->getName());
}
}
}