Drupal

Abilitare i template di pagina per tipi di contenuto su Drupal 8

Spesso quando ci si trova a lavorare al frontend di un sito basato su Drupal 8 può capitare la necessità di avere a disposizione un template di pagina specifico per ciascun tipo di contenuto.

Ovviamente Drupal permette di creare degli specifici template di contenuto, rinominando i template standard secondo uno specifico schema di nomenclatura che permette l'utilizzo del nuovo template, sovrascrivendo la struttura del template standard.

Esempio:

il page--node--1.html.twig sovrascrive il generico page.html.twig unicamente nella visualizzazione del nodo 1.

Il problema

Se stai leggendo questo post ti sarai sicuramente accorto che questa convenzione non tiene assolutamente conto del tipo di contenuto dell'entità nodo.

Fortunatamente questo comportamento "di default" può essere personalizzato ed esteso con poche righe di codice.

La soluzione è l' hook_theme_suggestions_page_alter()

Dobbiamo dunque dire a Drupal di tenere conto anche dei template di pagina per ciascun tipo di contenuto presente sul nostro sito.

Perciò utilizziamo una funzione di hook_theme_suggestions_page_alter() che ci permette di suggerire dei template di pagina alternativi per tutte le volte che viene utilizzato il page.html.twig. Nel nostro caso vogliamo un template specifico per ciascun tipo di contenuto.

Basterà infatti aggiungere il seguente snippet di codice all'interno del file MIOTEMA.theme.

  1. function MIOTEMA_theme_suggestions_page_alter(array &$suggestions, array $variables) {
  2. if ($node = \Drupal::routeMatch()->getParameter('node')) {
  3. $content_type = $node->bundle();
  4. $suggestions[] = 'page__'.$content_type;
  5. }
  6. }

Una volta che abbiamo salvato e svuotato la cache potremo usare i seguenti template per sovrascrivere il modello generico.  

  1. page--[content-type].html.twig
  2. page.html.twig

0 risposte per ['Abilitare i template di pagina per tipi di contenuto su Drupal 8 ']

Non preoccuparti, il tuo indirizzo email non sarà pubblicato :)

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.