Проверьте тип содержимого узла в обработчике препроцесса

12

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

У MYTHEME.themeменя есть:

function MYTHEME_preprocess_node(&$variables) {

  if (isset($variables['node'])) {

    $mycustomblock = \Drupal::service('plugin.manager.block')
      ->createInstance('myblock', []);

    $variables['mycustomblock'] = $mycustomblock->build();

    $headertext = \Drupal::service('plugin.manager.block')
      ->createInstance('headertext',
        [
          'text-align-submit'  => 'right',
          'uppercase-submit'   => TRUE,
          'header_size'        => 'h4',
          'header-size-submit' => 'h4',
          'grid-size-submit'   => 6,
          'header-title'       => 'This is a test',
        ]
      );

    $variables['headertext'] = $headertext->build();
  }
}

Это позволяет мне использовать {{ headertext }}и {{ mycustomblock }}в таких типах контента шаблоны, как node--contenttype1.html.twigи node--contenttype2.html.twig. Но я предпочел бы не строить 'headertext'и 'mycustomblock'переменные для каждого типа узла , когда мне нужно только каждый из них по одному типу содержимого. Было бы неплохо иметь параметр switch или if, который проверяет, к какому типу контента это относится, прежде чем генерировать переменную с блоком.

Есть ли способ, которым я могу проверить тип содержимого узла?

я пытался

$type = $variables['node']->type;

Но это не сработало.

Matt
источник

Ответы:

15

Чтобы получить тип содержимого узла, вы просто используете $variables['node']->getType()или $variables['node']->bundle(). Первый метод просто вызывает второй, поэтому вызов одного или другого не имеет большого значения.

public function getType() {
  return $this->bundle();
}

Единственное отличие состоит в том, что bundle()он определяется для каждой сущности, поскольку концепция связки является общей для всех сущностей, а тип контента - это свойство Drupal, используемое для узлов перед их изменением в одной из сущностей, реализуемых базовыми модулями Drupal; использование bundle()упрощает адаптацию кода для других типов сущностей, но я не думаю, что это так для кода, который вы используете.

киамлалуно
источник
5

Вы должны использовать $variables['node']->getType(). Кроме того, если вам это нужно только в некоторых режимах просмотра, попробуйте проверить это,$variables['view_mode']

Айван
источник
2

Вы можете добавить узел (и тип представления) к вашему имени функции ловушки:

function MYTHEME/MYMODULE_preprocess_node__nodetype__display(&$variables) {
  // ...
}

Например, для pageтипа узла в fullрежиме:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
Тим
источник