Sprawdź typ zawartości węzła w haku przedprocesowym

12

Mam szereg zmiennych, które chcę udostępnić w szablonach gałązek dla określonych szablonów treści.

W MYTHEME.thememam:

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

To pozwala mi używać {{ headertext }}i {{ mycustomblock }}w treści szablonów typu jak node--contenttype1.html.twigi node--contenttype2.html.twig. Ale wolę nie budować zmiennych 'headertext'i 'mycustomblock'dla każdego typu węzła, gdy potrzebuję tylko jednego dla jednego typu treści. Byłoby miło mieć przełącznik lub instrukcję, która sprawdza, który typ zawartości jest przed wygenerowaniem zmiennej z blokiem.

Czy istnieje sposób, aby sprawdzić typ zawartości węzła?

próbowałem

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

Ale to nie zadziałało.

Matt
źródło

Odpowiedzi:

15

Aby uzyskać typ zawartości węzła, wystarczy użyć $variables['node']->getType()lub $variables['node']->bundle(). Pierwsza metoda po prostu wywołuje drugą, więc wywołanie jednej lub drugiej nie ma większego znaczenia.

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

Jedyną różnicą jest to, że bundle()jest zdefiniowana dla każdej jednostki, ponieważ koncepcja pakietu jest wspólna dla wszystkich jednostek, podczas gdy typ zawartości jest właściwością Drupal używaną dla węzłów przed zmianą ich w jednym z elementów implementowanych przez podstawowe moduły Drupal; Użycie bundle()ułatwia dostosowanie kodu do innych typów encji, ale nie sądzę, że tak jest w przypadku kodu, którego używasz.

kiamlaluno
źródło
5

Musisz użyć $variables['node']->getType(). Również jeśli potrzebujesz go tylko w niektórych trybach widoku, zastanów się również nad sprawdzeniem tego za pomocą$variables['view_mode']

Yvan
źródło
2

Możesz dodać węzeł (i typ widoku) do nazwy funkcji hooka:

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

Na przykład dla pagetypu węzła w fulltrybie:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
Tim
źródło