Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Ajouter des classes « first » et « last » aux blocs menu

Date du document en anglais : 23 Août 2009 - 15h23 - http://drupal.org/node/138656 Drupal 5.x  



Cet article est spécifique à Drupal 5.x. Drupal 6 utilise des theme_links au lieu de menu_item_link, et ajoute automatiquement les classes « First » et « Last » aux items de menus.

On veut souvent styliser le premier et le dernier élément de menu différemment des autres. CSS 2 fournit un simple sélecteur pour le faire dynamiquement mais il n'est malheureusement pas pris en compte par Internet Explorer, aussi, beaucoup de concepteurs de thèmes ajoutent une classe « First » et « Last » aux éléments des listes, pour qu'ils puissent être ciblés par les styles CSS.

Drupal 5 ajoute automatiquement les classes « first » et « last » aux primary et secondary links, mais ne le fait malheureusement pas pour les menus affichés dans des blocs. Heureusement, le système des thèmes nous permettra d'y remédier.

Le menu est généré par la fonction menu_tree(), qui n'est pas surchargeable par le thème. Quoiqu'il en soit, cette fonction est elle-même appelée par une fonction de thème, nous pourrons la surcharger par ce biais. Pour cela, copiez-collez le code suivant dans votre fichier template.php :


 <?php
function phptemplate_menu_tree($pid 1) {
    if (
$tree phptemplate_menu_tree_improved($pid)) {
        return 
"\n<ul class=\"menu\">\n"$tree ."\n</ul>\n";
    }    
}

function 
phptemplate_menu_tree_improved($pid 1) {
  
$menu menu_get_menu();
  
$output '';

  if (isset(
$menu['visible'][$pid]) && $menu['visible'][$pid]['children']) {
    
$num_children count($menu['visible'][$pid]['children']);
      for (
$i=0$i $num_children; ++$i) {
        
$mid $menu['visible'][$pid]['children'][$i];
        
$type = isset($menu['visible'][$mid]['type']) ? $menu['visible'][$mid]['type'] : NULL;
        
$children = isset($menu['visible'][$mid]['children']) ? $menu['visible'][$mid]['children'] : NULL;
        
$extraclass $i == 'first' : ($i == $num_children-'last' '');
        
$output .= theme('menu_item'$midmenu_in_active_trail($mid)
 || (
$type MENU_EXPANDED) ? theme('menu_tree'$mid) : ''count($children) == 0$extraclass);     
      }
  }

  return 
$output;
}

function 
phptemplate_menu_item($mid$children ''$leaf TRUE$extraclass '') {
  return 
'<li class="'. ($leaf 'leaf' : ($children 'expanded' 'collapsed')) . ($extraclass ' ' $extraclass '')
 . 
'">'menu_item_link($midTRUE$extraclass) . $children ."</li>\n";
}
?>
  

Cette fonction diffère de la fonction par défaut par le fait qu'elle dirige le système vers la version alternative de menu_tree(), phptemplate_menu_tree_improved().

Cette fonction fonctionne exactement comme celle du core sauf qu'elle passe une extraclass à la fonction menu item alternative. (Oui, on peut ajouter des paramètres à une fonction de thème surchargée). phptemplate_menu_item() pose juste l'extraclasse si elle est spécifiée, ou ne fait rien si elle ne l'est pas. Voilà ainsi les classes « first » et « last » dans tout menu d'un bloc.

Notez que ce code ajoute ces classes à l'élément de la liste, pas au lien lui-même.

Voici comment Drupal gère habituellement ces classes, et permet à une règle CSS de cibler soit l'élément de la liste soit le lien, selon les besoins. Si on mettait la classe sur l'élément <a> lui-même, cela ne ferait que styliser le lien et non l'élément affiché.

Élément de menu isolé

Parfois, vous avez un (sous-)menu avec un seul élément. Le code précédent ajoute la classe « first » à un élément de menu, sans se soucier s'il est le premier parmi une multitude ou s'il est le premier et aussi le seul élément du menu. Cela pouvant vicier un thème, il y a deux façons de pallier à la présence d'un seule élément de menu :

Façon n° 1 :

Ajoutez ce code :

<?php 
 $extraclass 
.= $num_children == ' last' ''
 
?>

après

<?php
  $extraclass 
$i == 'first' : ($i == $num_children-'last' '');
  
?>

Cela ajoutera juste une classe « Last », vous aurez ainsi un élément de menu avec la classe « first last ».

Façon n° 2 :

Ajoutez ce code :

<?php
  $extraclass 
$num_children == 'single-item' $extraclass;  
?>

après

<?php
  $extraclass 
$i == 'first' : ($i == $num_children-'last' '');  
?>

Cela ajoutera une classe « single-item » au lieu de « first ».