Come effettuare l'override di theme_links()

Come effettuare l'override di theme_links()

Programmare in Drupal ed estenderne le funzionalità è molto semplice grazie all'API Drupal che offre un alto grado di flessibilità. Nell'ambito della modifica dell'output troviamo la funzione theme() e tutte le funzioni theme_*(), che si occupano di generare l'output.

Chi sviluppa temi per Drupal ha spesso la necessità di modificare come i dati vengono presentati all'utente. A volte attraverso moduli ad hoc, altre volte con dei semplici fogli di stile oppure sovrascrivendo le funzioni del core (override).

Esempio pratico: come aggiungere uno <span> per racchiudere una voce del menu Drupal

Nei template Drupal troviamo un file particolare, template.php, attraverso il quale si possono riprogrammare i comportamenti di default di Drupal. In questo esempio pratico verrà mostrato come modificare l'output dei link nel menu di Drupal per racchiuderli all'interno di uno <span>...</span>. Questa operazione, ad esempio, può essere necessaria per specifiche esigenze grafiche.

Una voce di menu solitamente viene renderizzata nella forma:

<li><a [...]>Nome collegamento</a></li>

Il nostro obiettivo è quello di racchiudere il testo del link in uno <span>...</span>, e quindi ottenere:

<li><a [...]><span>Nome collegamento</span></a></li>

Come modificare theme_links()

La funzione theme_links() si occupa di creare un insieme di link.

theme_links($links, $attributes = array('class' => 'links'))

I parametri sono un vettore di link ed un vettore di attributi. La funzione restituirà il codice HTML sotto forma di lista non ordinata. Il codice completo della funzione è visualizzabile nel sito Drupal API: theme_links().

La modifica per racchiudere il testo del link è piuttosto semplice. La riga che aggiunge il link all'output è:

$output .= l($link['title'], $link['href'], $link);

Ricordo che la funzione l() crea un link in base ai parametri che gli vengono passati. Il primo parametro sarà la stringa di ancoraggio del link. È su questo parametro che si dovrà intervenire.

Quindi si può facilmente intuire che $link['title'] va modificata in questo modo:

$link['title'] = '<span>' . check_plain($link['title']) . '</span>';

Inoltre, si rende necessaria una ulteriore modifica al vettore $link in quanto ora viene passato come argomento un frammento HTML e non più un testo semplice:

$link['html'] = TRUE;

Come si effettua l'ovveride della funzione theme_links()?

La procedura è molto semplice: si deve ricopiare la funzione originale nel file template.php del template Drupal in uso e cambiarne il nome seguendo la convenzione di Drupal. In questo caso:

NomeDelTemplate_links()

e modificare le righe di codice che ci interessano, ovvero precedere la riga:

$output .= l($link['title'], $link['href'], $link);

con il seguente codice:

$link['title'] = '<span>' . check_plain($link['title']) . '</span>';
$link['html'] = TRUE;

A questo punto non rimane altro che pulire la cache di Drupal.