Preprocessing e modifica degli attributi nel file .theme
Come in Drupal 7, puoi influenzare l’output di un determinato HTML usando le funzioni di preprocessing. Ad esempio, se vuoi aggiungere una classe a un menu e preferisci farlo a livello di PHP, puoi farlo. Questo è un buon modo per modificare il markup relativo al tema, ma se vuoi creare un markup indipendente dal tema, è meglio scrivere un modulo personalizzato.
(Nota: per scopi di documentazione qui «mytheme» è il nome macchina del tuo tema; ad esempio, «bartik» è il nome macchina del tema.)
Per lavorare con le funzioni di preprocessing:
1. Crea o modifica un file nella cartella del tuo tema chiamato mytheme.theme
2. Crea una funzione come mytheme_preprocess_HOOK, dove HOOK si riferisce all’elemento su cui vuoi intervenire*
3. Scrivi le tue modifiche e salva
4. Ricostruisci la cache per rendere disponibili le tue modifiche (se hai installato drush, usa drush cr da riga di comando)
* I nomi HOOK seguono le convenzioni dei template twig. Per creare un hook per page.html.twig, crei mytheme_preprocess_page. Per creare un hook per un nodo - article.html.twig, crei mytheme_preprocess_node__article (sostituendo i trattini bassi). Per conoscere i nomi degli hook, consulta la sezione «Trovare i file di template con il debugging».
Supponiamo di voler aggiungere la classe my-menu a tutti i menu del tuo sito. Supponendo che il tuo tema si chiami «mytheme», devi scrivere la seguente funzione:
/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
// Se non esiste già un array di classi, creane uno vuoto.
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
// Fonde con eventuali classi già impostate da altre invocazioni di hook_preprocess_menu
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-menu']);
}
Questo è molto simile a Drupal 7 e utile se vuoi personalizzare un menu specifico.
Puoi controllare l’oggetto $variables con una condizione per determinare con quale menu stai lavorando. Gli elementi dentro $variables diventano disponibili in twig dopo il preprocessing del tema.
Ora, per ampliare il nostro esempio, supponiamo di voler aggiungere la classe «my-main-menu» al menu principale del tuo sito. Ecco la funzione per farlo:
/**
* Implements hook_preprocess_HOOK() for menu.html.twig.
*/
function mytheme_preprocess_menu(&$variables) {
if ($variables['menu_name'] == 'main') {
if (!isset($variables['attributes']['class'])) {
$variables['attributes']['class'] = [];
}
$variables['attributes']['class'] = array_merge($variables['attributes']['class'], ['my-main-menu']);
}
}
Differenze rispetto a Drupal 7
Non esiste più il file template.php. Questo file è stato sostituito da mytheme.theme. Tuttavia, funziona ancora in gran parte nello stesso modo, consentendo agli hook di modificare l’output.