Block title
Block content
Ze webmaster
Par Ze webmaster,
Wed 17 October 2018
Php Php

Mieux comprendre le hook menu

Et avec ceci, ce sera tout !

Principe


Avant tout chose, il faut reconnaître une certaine ambiguïté dans son appelation... Car contraitement à ce que son nom peut laisser penser, le hook_menu() ne définit pas nécessairement un lien dans un menu, mais il permet d'associer une url à une fonction (traitement de données, formulaire...), url qui peut-être ou non référencée par un lien dans un menu. Il permet également de gérer des autorisations d'accès, des niveaux de menu, de gérer le passage de variables... et beaucoup d'autres choses en plus !

Mais pour bien utiliser le hook_menu(), il faut impérativement s'approprier son API.
https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_menu/7.x

il existe de très nombreux paramètres, nous allons nous contenter ici de passer en revu les options plus importants à maitriser.

 

Les prérequis avant de se lancer dans la lecture


Pour mieux comprendre les notions abordées ici, vous devez tout d'abord :

Savoir créer votre propre module ;
Comprendre le fonctionnement des hooks ;

Avec ceci en tête, vous serez un peu mieux armés pour attaquer le sujet !

 

Implémenter un hook_menu()


Dans votre module (ici monmodule), il suffit d'implémenter la fonction monmodule_menu(), qui doit renvoyer un tableau associatif, contenant autant d'éléments que d'url à définir.

function monmodule_menu() {
  $items = array();
  $items['mon-chemin'] = array(
    'title'              => '',
    'title callback'     => '',
    'title arguments'    => '',
    'description'        => '',
    'page callback'      => '',
    'page arguments'     => '',
    'delivery callback'  => '',
    'access callback'    => '',
    'access arguments'   => '',
    'theme callback'     => '',
    'theme arguments'    => '',
    'file'               => '',
    'load arguments'     => '', 
    'weigh'              => '',
    'menu_name'          => '',
    'expanded'           => '',
    'context'            => '',
    'tab_parent'         => '',
    'tab_root'           => '',
    'position'           => '',
    'type'               => '',
    'options'            => '',
  );
  return $items;
}

Ici, chaque clé correspond à une url, elle même composée par un tableau associatif, permettant d'en décrire ses propriétés.
 

Les paramètres à maîtriser


1 // Autour du titre

title Required
Le titre associé à l'url.
title callback Permet de définir une fonction associée à la génération du titre.
titre arguments Les arguments à faire passer à la fonction callback.

 

2 // À propos de la page

description Description de la page.
page callback La fonction associée à l'url.
page arguments Les arguments à faire passer à la fonction callback.

 

3 // À propos des autorisations

access callback Une fonction retournant un booléean définissant les autorisations pour accèder au menu.
Par défaut, on utilise la fonction user_access() avec les arguments du paramètre 'access arguments'.
access arguments Un tableau d'arguments à faire passer à la fonction callback.

 

4 // À propos des dépendences

file Permet d'inclure les fichiers nécessaires à l'exécution de la fonction callback de la page.
file path Le chemin vers le dossier contenant le fichier à embarquer.
Par défaut, c'est le répertoire du module.

 

5 // Les liens de menu

weight Un entier pour déterminer la postion du lien dans le menu.
menu_name Le nom du menu (nom machine) auquel affecter le lien.
type

Pour définir le type de lien :

MENU_NORMAL_ITEM --> Onglet normal de navigation apparaissant dans la barre de menu (valeur par défaut)
MENU_CALLBACK --> Page sans lien dans le menu, qui permet de générer une page pour réaliser un traitement spécifique associé à des données.
MENU_LOCAL_TASK --> Onglet dans une page.

 

En jouant avec tous ces paramètres, vous pouvez déjà arriver à faire pas mal de chose.
Néanmoins, je vous invite à toujours vous référer à l'API pour connaître en détail les tenants et les aboutissants de chaque option.

 

 

Pour en savoir plus


API hook_menu()
https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_menu/7.x

Commentaires


Ajouter un commentaire

edit Ajouter un commentaire