Drupal, i breadcrumb ed il multilingua

Drupal, i breadcrumb ed il multilingua

La gestione dei breadcrumb in Drupal, già affrontata in passato negli articoli "Drupal Breadcrumb, Briciole di pane per Drupal" e "Migliorare i breadcrumb di Drupal", potrebbe rivelarsi piuttosto complicata in casi particolari che vedono la presenza del modulo i18n per il multilingua.

Attenzione: questo articolo è specifico per Drupal 6 in quanto non reputo Drupal 7 sufficientemente stabile e maturo per un sito in più lingue, a causa di una serie di bug e mancanza di funzionalità (vedi articolo "Drupal 7 e i18n, sistema ancora instabile").

Breadcrumb semplice con solo nodi

In seguito agli esperimenti effettuati con "i18nmenu_node", ho constatato che questo plugin non permette ad altri moduli, in particolare "custom_breadcrumbs" e "menu_breadcrumb", di funzionare correttamente nel caso in cui si imposti come sorgente del breadcrumb un menu diverso dal menu navigation (usato come struttura di default per creare il breadcrumb in Drupal). Mi sono quindi dovuto rassegnare al fatto di dover creare un menu distinto per ogni lingua (attenzione: ricordarsi di configurare opportunamente il file settings.php).

In sostanza il modulo "i18nmenu_node" è in grado di far visualizzare sempre lo stesso menu con le voci relative ai nodi tradotte senza doverle duplicare nella struttura del menu, in questo modo si rende la sua gestione più semplice. Sfortunatamente sia "custom_breadcrumbs" che "menu_breadcrumb" non riescono a ricreare il cosiddetto menu trail per i nodi tradotti, anche usando l'identificatore speciale fornito da "custom_breadcrumb_identifier": menu-parent-trail.

Quindi, nel caso di un sito in più lingue con la struttura del menu a più livelli composti da nodi, la soluzione che preferisco è di creare un menu per ogni lingua ed usare "custom_breadcrumbs" per poter visualizzare correttamente le briciole di pane impostando nella regola degli specifici tipi di contenuto (presenti nel menu) l'identificatore speciale menu-parent-trail. Teoricamente dovrebbe funzionare anche selezionando la voce "Use the menu structure to set the breadcrumb trail" (che si trova nella pagina di configurazione del modulo), ma non è sempre vero e devo ancora capire come mai.

Breadcrumb misto di nodi e viste

Analizziamo ora un caso un po' più complesso dove:

  1. nella struttura del menu ad un certo livello è presente una vista (o comunque una pagina che non sia un nodo);
  2. questa voce sia presente nel menu di ogni lingua;
  3. si desideri che il breadcrumb visualizzato quando si è in un nodo di quelli elencati nella vista visualizzi il percorso dalla home fino alla vista.

Menu di esempio:

  • Nodo uno
  • Nodo due
    • Vista
  • Nodo tre

Le briciole per la vista...

In questo caso, quando si è nella pagina della vista il breadcrumb da ottenere è:

Home » Nodo due

Per fare questo si può sfruttare ancora una volta menu-parent-trail, che però non tiene conto della presenza della stessa vista in più menu (ricordiamoci che ne abbiamo uno per lingua), pertanto è necessario modificare opportunamente il modulo "custom_breadcrumb_identifier" aggiungendo un controllo sulla lingua. Ecco uno spunto:

global $language;
$menus = db_query($query, $normal_path, $path);
while ($menu_line = db_fetch_object($menus)) {
  $options_menu = unserialize($menu_line->options);
  if ($options_menu['langcode'] == $language->language){
    $menu_item = $menu_line;
  }
}

In alternativa si può creare un nuovo modulo che lo estenda per fornire un identificatore personalizzato che si comporti nel modo appena descritto.

... e quelle per i nodi nella vista

Se la vista elenca nodi di tipo "x", quando uno di questi è visualizzato voglio che il breadcrumb sia:

Home » Nodo due » Vista

Una soluzione potrebbe essere il modulo "menutrails" che però in passato non mi ha soddisfatto quando l'ho usato in combinazione con i18n, quindi una soluzione molto semplice è quella di sfruttare nuovamente "custom_breadcrumbs" e configurare una regola per i nodi di tipo "x" (una per ogni lingua), specificando quale deve essere il percorso da fare per raggiungere il nodo. L'unico difetto di questo approccio è che bisogna riconfigurarlo ogni qualvolta si cambi la struttura del menu.