Prerocess functions

Le funzioni preprocess_HOOK servono per manipolare le variabili prima che vengano inviate al template Twig per essere visualizzate. Si inseriscono nel file .theme e si costruiscono seguendo la convenzione di naming NOME_TEMA_preprocess_HOOK(&$variables) dove HOOK può essere node, block, filed, region ecc... in base al file del quali si vogliono alterare le variabili.

Se si vogliono modificare le classi però è meglio farlo nel template e non tramite preprocess function.

  • nome_tema_preprocess_node(&$variables): per modificare le variabili di tutti i nodi
  • nome_tema_preprocess_node__article(&$variables): per modificare solo i nodi di tipo article (doppio underscore)
  • nome_tema_preprocess_node__42(&$variables): per modificare solo il nodo con id 42 (doppio underscore)
  • nome_tema_preprocess_block(&$variables): per tutti i blocchi
  • nome_tema_preprocess_menu(&$variables): per i menu
  • nome_tema_preprocess_field(&$variables): per tutti i campi
  • nome_tema_preprocess_html(&$variables): per alterare le variabili del file html.html.twig (ad esempio per aggiungere classi al tag <body>)
  • nome_tema_preprocess_page(&$variables): per il template page.html.twig
  • nome_tema_preprocess_region(&$variables): per il template delle regioni
  • nome_tema_preprocess_views_view(&$variables): per i template di Views
  • nome_tema_preprocess_maintenance_page(&$variables): per la maintenance page

Nel caso in cui ci siano più funzioni chiamate per lo stesso template verranno eseguite solo quella più specifica e quella più generica, ad esempio:

  • nome_tema_preprocess_node(): per tutti i nodi, sia di tipo article (anche quello con id 42) che non
  • nome_tema_preprocess_node__article():  per tutti i nodi di tipo article ma non quello con id 42
  • nome_tema_preprocess_node__42(): solo per il nodo con id 42
<?php

// per aggiungere un elemento di tipo tabella
$variables['my_new_content'] = ['#type' => 'table', ...];

// evitare di inserire markup direttamente
$variables['my_new_content'] = '<table><tr> ... </table>';

// per aggiungere dell'HTML
$variables['my_new_content'] = ['#markup' => '<p>Hello there</p>'];

// se non è una variabile che si vuole stampare non è necessario aggiungerla nel render array
$variables['is_new_content'] = $content->isNew() ? TRUE : FALSE;

//nel template la variabile sarà stampata con {{ my_new_content }}

//dato che $variables è passato per riferimento non è necessario ritornare nulla nella preprocess function perchè 
// viene modificata direttamente la variabile $variables

?>

Differenza tra Twig e preprocess

Quando usare una preprocess function

Naming convention delle preprocess functions

Preprocess generico e preprocess specifico

Per eseguire una funzione per ogni theme hook denominare la funzione nome_tema_preprocess senza suffisso.

<?php

function nome_tema_preprocess(&$variables, $hook) {
  if ($hook === 'node') {
    // la funzione verrà eseguita per ogni template ma il codice dentro l'if solo per i nodi
  }
}

?>

Aggiungere variabili ai template

Render array invece di markup hardcoded

Alter hooks

Questo tipo di funzioni serve per modificare le configurazioni di un oggetto prima che venga inviato al tema, ad esempio rimuovere un file CSS caricato da un modulo core, oppure forzare il caricamento di una libreria JS solo in determinate condizioni, o cambiare l'ordine di caricamento degli script.

  • nome_tema_css_alter(&$css, AttachedAssetsInterface $assets)
  • nome_tema_js_alter(&$javascript, AttachedAssetsInterface $assets)
  • nome_tema_library_info_alter(&$libraries, $extension)
  • nome_tema_form_alter(&$form, FormStateInterface $form_state, $form_id)
  • nome_tema_FORM_ID_alter(&$form, FormStateInterface $form_state, $form_id)
  • nome_tema_plugin_filter_TYPE_alter(array &$definitions, array $extra, $consumer)
  • nome_tema_plugin_filter_TYPE__CONSUMER_alter(array &$definitions, array $extra)
  • nome_tema_element_info_alter(array &$types)
  • nome_tema_page_attachments_alter(array &$attachments)
  • nome_tema_theme_suggestions_HOOK(array &$suggestions, array $variables)
  • nome_tema_theme_suggestions_alter(array &$suggestions, array $variables, $hook)
  • nome_tema_views_ui_display_tab_alter(&$tabs, ViewExecutable $view)
  • nome_tema_views_ui_display_top_alter(&$top, ViewExecutable $view)

Theme suggestions alter