web-dev-qa-db-fra.com

Vérifier le type de contenu du nœud dans le hook de prétraitement

J'ai une série de variables que je veux rendre disponibles sur les modèles twig pour des modèles de contenu spécifiques.

Dans MYTHEME.theme J'ai:

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

Cela me permet d'utiliser {{ headertext }} et {{ mycustomblock }} dans des modèles de type de contenu comme node--contenttype1.html.twig et node--contenttype2.html.twig. Mais je préfère ne pas construire le 'headertext' et 'mycustomblock' variables pour chaque type de nœud unique lorsque je n'ai besoin que de chacun pour un type de contenu. Ce serait bien d'avoir un commutateur ou une instruction if qui vérifie de quel type de contenu il s'agit avant de générer une variable avec un bloc.

Existe-t-il un moyen de vérifier le type de contenu du nœud?

J'ai essayé

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

Mais ça n'a pas marché.

12
Matt

Pour obtenir le type de contenu d'un nœud, il vous suffit d'utiliser $variables['node']->getType() ou $variables['node']->bundle(). La première méthode appelle simplement la seconde, donc appeler l'une ou l'autre ne fait pas beaucoup de différence.

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

La seule différence est que bundle() est définie pour chaque entité, car le concept de bundle est commun à toutes les entités, tandis que le type de contenu est la propriété Drupal utilisé pour les nœuds avant les changer dans l'une des entités Drupal core modules implement; using bundle() facilite l'adaptation du code pour d'autres types d'entités, mais je ne pense pas que ce soit le cas pour le code que vous utilisez.

15
kiamlaluno

Vous devez utiliser $variables['node']->getType(). De plus, si vous en avez besoin sur certains modes d'affichage uniquement, envisagez également de vérifier cela, avec $variables['view_mode']

5
yvan

Vous pouvez ajouter le nœud (et le type de vue) à votre nom de fonction de raccordement:

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

Par exemple, pour le type de nœud page en mode full:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
2
Tim