Styliser les menus

Traduction de la page http://drupal.org/node/988842
publiée / actualisée sur drupal.org le 1 Mars 2011


La nouvelle fonction theme_links($variables) de Drupal 7 ne reçoit qu'un tableau associatif pour toute la structure du lien. Comme vous pouvez le lire dans la documentation, vos liens doivent être passés en tant que tableaux associatifs via un argument links, mais ne décrit pas où et comment vous trouver cette variable.

L'exemple suivant explique comment faire avec le menu utilisateur :

<?php
$user_menu 
menu_navigation_links('user-menu');
print 
theme('links', array(
  
'links' => $user_menu,
  
'attributes' => array(
    
'id' => 'user-menu',
    
'class' => array('links''clearfix'),
  ),
  
'heading' => array(
    
'text' => t('User menu'),
    
'level' => 'h2',
    
'class' => array('element-invisible'),
  ),
));
?>

Qu'est donc l'argument user-menu dans la fonction menu_navigation_links($menu_name, $level = 0) ? C'est le nom du menu qui doit être affiché. Vous trouverez le nom du menu de cet exemple dans la page d'administration User menu (Administration > Structure > Menus > User menu ) ou http://example.com/admin/structure/menu/manage/user-menu/edit de votre site.

Dans cet exemple, la variable $user_menu n'est pas obligatoire, mais en procédant de la sorte, vous pourrez l'utiliser ensuite dans une instruction conditionnelle qui est plus courante dans un gabarit.

Surcharger un menu dans un bloc

Traduction de la page http://drupal.org/node/988694
publiée / actualisée sur drupal.org le 1 Mars 2011


Créez une fonction override dans votre fichier template.php :

<?php
function themename_links__system_MENUNAME_menu($variables) {}
?>

Un paramètre $variables est passé et il contient un index nommé links. Chaque lien contient, entre autres, un href et un title.

A l'intérieur de votre fonction override, parcourez les liens :

<?php
foreach ($variables['links'] as $link) {}
?>

Si nous voulons juste afficher une balise <a>, sans utiliser Drupal, nous écririons normalement :

<?php
echo "<a href="{$link['href']}">{$link['title']}</a>";
?>

Cependant, Drupal dispose d'une fonction l() qui crée les liens pour nous. Il vaut mieux l'utiliser car elle traite les cas particuliers comme le lien <front>.

Aussi, nous ferons plutôt ça :

<?php
echo l($link['title'], $link['href'], $link);
?>

La fonction l() s'occupera d'ajouter une classe active si le lien est destiné à la page en cours.

Au finale, votre fonction override ressemblera à ceci :

<?php
function themename_links__system_MENUNAME_menu($variables) {
  
$output '';
  foreach (
$variables['links'] as $link) {
    
$output .= l($link['title'], $link['href'], $link);
  }
  return 
$output;
}
?>