Verifique el tipo de contenido del nodo en el enlace de preproceso

12

Tengo una serie de variables que quiero poner a disposición en plantillas de ramita para plantillas de contenido específicas.

En MYTHEME.themetengo:

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

Esto me permite usar {{ headertext }}y {{ mycustomblock }}en plantillas de tipo de contenido como node--contenttype1.html.twigy node--contenttype2.html.twig. Pero prefiero no crear las variables 'headertext'y 'mycustomblock'para cada tipo de nodo cuando solo necesito cada una para un tipo de contenido. Sería bueno tener un modificador o una instrucción if que verifique qué tipo de contenido es antes de generar una variable con un bloque.

¿Hay alguna manera de verificar el tipo de contenido del nodo?

He intentado

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

Pero eso no funcionó.

Mate
fuente

Respuestas:

15

Para obtener el tipo de contenido de un nodo, simplemente use $variables['node']->getType()o $variables['node']->bundle(). El primer método solo llama al segundo, por lo que llamar a uno u otro no hace mucha diferencia.

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

La única diferencia es que bundle()se define para cada entidad, ya que el concepto de paquete es común para todas las entidades, mientras que el tipo de contenido es la propiedad que Drupal usa para los nodos antes de cambiarlos en una de las entidades que implementan los módulos centrales de Drupal; usar bundle()hace que sea más fácil adaptar el código para otros tipos de entidades, pero no creo que sea el caso del código que está usando.

kiamlaluno
fuente
5

Tienes que usar $variables['node']->getType(). Además, si lo necesita solo en algunos modos de vista, considere hacer una comprobación de esto también, con$variables['view_mode']

yvan
fuente
2

Puede agregar el nodo (y el tipo de vista) al nombre de la función de enlace:

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

Por ejemplo, para el pagetipo de nodo en fullmodo:

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