Afficher les menus dans bloc

La documentation Drupal 6 n'est plus maintenue et en cours de dépublication.


Consultez le guide utilisateur Drupal en français directement sur drupal.org.

Nous venons de créer une hiérarchie d'éléments contenus dans le menu Primary links. C'est bien, mais ce qui est encore mieux c'est de les afficher dans un bloc. En effet même si nous pouvons afficher le menu Primary links sur notre site, grâce à notre thème, nous ne pouvons pas accéder aux sous menus.

Première méthode :

La première méthode est la plus simple à mettre en place car elle fait appel à un bloc qui est fourni par drupal.

Nous nous rendons dans administrer/blocs et nous activons le bloc Primary links en cochant la case.

Nous obtenons alors un bloc contenant notre hiérarchie et laissant entrevoir les sous-menus.

Deuxième méthode :

Cette deuxième méthode tiens compte du fait que l'on peut déjà afficher le premier niveau de notre menu par l'intermédiaire du moteur de thème (et de la variable $primary_links pour PHPTemplate). En effet si le premier niveau de notre menu est affiché, à quoi sert il de les afficher à nouveau dans notre bloc. Nous voulons que lorsque nous nous trouvons sur une page de premier niveau, un bloc affiche uniquement les sous menu de cet élément.

Pour obtenir ce résultat rendons nous dans la page d'administration des blocs (administrer/blocs) puis cliquer sur ajouter un bloc. Nous arrivons sur le formulaire de cration d'un bloc, et nous aloons remplir le corps avec le code php suivant :

<?php
 

$secondary_links
= menu_secondary_links();
if (
is_array($secondary_links)) {
 
$output = "<ul class="menu">";
  foreach (
$secondary_links as $link) {
   
$output .= "<li class="leaf">".$link."</li>";
  }
 
$output .= "</ul>";
}

return
$output;
?>

remplissez les autres champs (Description, titre) et sélectionnez PHP Code comme format d'entrée. Il ne reste plus qu'à valider et à activer le bloc.

Il reste une denière chose à faire : s'assurer que les paramètres des menus sont correcte. En effet pour afficher notre bloc, nous faisont appel aux liens secondaires. Nous devons, pour obtenir le comportement voulu, configurer les liens secondaires de sortes qu'ils soient des sous menus des liens secondaires. Nous allons donc dans administer/paramètres/menus
et mettre le champs Liens secondaires comme sur la capture.

Commentaires

J'ai suivi la méthode décrite pour afficher les enfants du menu primaire dans un bloc situé dans la colonne gauche de mon site mais il affichait toujours 'Array' :(
En cherchant un peu, j'ai compris que la variable $link est effectivement une matrice (array en anglais...) contenant les titres et les liens des dits enfants.

Après pas mal d'essais et de recherches supplémentaires, j'ai fini par remplacer le code du bloc par celui-ci (qui marche ^^) :

<?php
return $secondary_links = theme('links', menu_secondary_links(), array('class' => 'leaf', 'id' => 'secondary-menu'));
?>

Reste plus qu'à écrire le code CSS de l'id 'secondary-menu' pour l'afficher comme on veut ;)

«La patience a beaucoup plus de pouvoir que la force» - Plutarque

bonjour,
je debute avec drupal et j'ai vraiment du mal a comprendre le mecanisme de personnalisation de menu.
si je comprend bien le deuxieme argument de la fonction theme est la fonction definie dans le tuto. alors ou defini tu cette fonction a présent?
si tu pouvais m'expliquer certaine fonctions qui me semble basique dans la gestion du contenu d'un site drupal ca m'aiderait beaucoup.(je parle de fonction telque theme_preprocess_page(&$variables),theme_links etc)
merci.

Bonjour,

En fait, le deuxième argument de la fonction theme n'est pas une fonction 'définie' dans le tuto, elle est appelée. C'est une fonction fournie par drupal qui retourne sous forme de liens toutes les entrée du menu secondaire.

A toi ensuite de préciser à la fonction theme (de drupal) les attributs CSS (class, id) que tu souhaites ajouter pour pouvoir personnaliser dans le theme (fichier style.css) l'affichage de ce sous-menu.

Pour le reste, je n'ai jamais eu besoin d'utiliser les fonctions comme theme_preprocess_page ou theme_links donc je ne pourrais pas te renseigner, désolée.

En espérant t'avoir aidé...