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

12

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

En MYTHEME.themej'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 les modèles de type de contenu comme node--contenttype1.html.twiget node--contenttype2.html.twig. Mais je préfère ne pas créer les variables 'headertext'et 'mycustomblock'pour chaque type de nœud unique lorsque je n'ai besoin que de chacune 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é.

Mat
la source

Réponses:

15

Pour obtenir le type de contenu d'un nœud, vous utilisez simplement $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 qu'elle 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ée pour les nœuds avant de les changer dans l'une des entités implémentées par les modules de base Drupal; l'utilisation 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.

kiamlaluno
la source
5

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']

yvan
la source
2

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 pagetype de nœud en fullmode:

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