Controllare il tipo di contenuto del nodo nel hook di preelaborazione


12

Ho una serie di variabili che voglio rendere disponibili su modelli di ramoscelli per modelli di contenuto specifici.

In MYTHEME.themeho:

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

Ciò mi consente di utilizzare {{ headertext }}e {{ mycustomblock }}in modelli di tipo di contenuto come node--contenttype1.html.twige node--contenttype2.html.twig. Ma preferirei non creare le variabili 'headertext'e 'mycustomblock'per ogni singolo tipo di nodo quando ne ho bisogno solo per un tipo di contenuto. Sarebbe bello avere uno switch o un'istruzione if che controlli il tipo di contenuto prima di generare una variabile con un blocco.

Esiste un modo per verificare il tipo di contenuto del nodo?

ho provato

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

Ma quello non ha funzionato.

Risposte:


15

Per ottenere il tipo di contenuto di un nodo, basta usare $variables['node']->getType()o $variables['node']->bundle(). Il primo metodo chiama solo il secondo, quindi chiamare l'uno o l'altro non fa molta differenza.

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

L'unica differenza è che bundle()viene definita per ogni entità, poiché il concetto di bundle è comune per tutte le entità, mentre il tipo di contenuto è la proprietà Drupal utilizzata per i nodi prima di modificarli in una delle entità implementate dai moduli principali Drupal; l'utilizzo bundle()semplifica l'adattamento del codice per altri tipi di entità, ma non credo sia il caso del codice che si sta utilizzando.


5

Devi usare $variables['node']->getType(). Inoltre, se ne hai bisogno solo in alcune modalità di visualizzazione, considera di fare un controllo anche su questo$variables['view_mode']


2

È possibile aggiungere il nodo (e visualizzare il tipo) al nome della funzione hook:

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

Ad esempio, per il pagetipo di nodo in fullmodalità:

function MYTHEME/MYMODULE_preprocess_node__page__full(&$variables) {
  // ...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.