Получение терминов таксономии для идентификатора узла в Drupal 8

Я пытаюсь добавить обработчик предварительной обработки, чтобы добавить классы на основе имени таксономии в тело 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 не существует?), Были бы очень признательны.

Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Один опытный веб-разработчик назвал комбинацию Drupal и AngularJS "сочетанием, созданным на небесах". Почему так? Потому что вместе они могут создать...
1
0
1 411
1

Ответы 1

Если вы пытаетесь получить имена терминов, на которые ссылаются, и добавить их как классы тела, ваш подход кажется немного неправильным.

Вот что я использую:

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());
    }
  }
}

Другие вопросы по теме