Ajouter un menu par défaut aux nodes sans menus
Date du document original en anglais : 23 Août 2009 - 19h17 - http://drupal.org/node/369854
Quand il s'agit de gérer des nodes il y en a toujours qui ne peuvent être rattachés à aucun des items du menu principal. Ainsi, pour le site sur lequel je travaille actuellement (ce n'est pas kolossaldrupal qui parle, c'est l'auteur de l'article en anglais. NDT), certains nodes ont besoin d'un menu par défaut même s'ils ne font pas partie des liens de menus principaux qui sont affichés sur la plupart des nodes.
Voici l'idée
- D'abord contrôlez la table menu_links pour voir s'il existe une ligne pour le chemin en cours (par exemple « node/1 »)
- Ensuite, si rien n'a été trouvé, cherchez le chemin du menu par défaut que l'on veut utiliser
- Paramétrez le menu par défaut comme item de menu courant (menu_set_item)
C'est tout.
<?php
/**
* La toute-puissante fonction de pré-traitement, si commode
* Paramétrez le nouvel item ici pour être sûr qu'il soit
disponible pour l'affichage.
*/
function mysite_preprocess_node(&$variables) {
$node = $variables['node'];
// paramétrer le menu par défaut si besoin.
_set_default_menu($node->nid);
}
/**
* Un menu est défini pour la plupart des items. Mais nous
* devons en définir un pour ceux qui n'en ont pas.
*/
function _set_default_menu($nid){
if (!node_has_menu("node/$nid")) {
$menu = _find_default_menu($nid);
}
}
// le node a-t-il un menu ?
function node_has_menu($path) {
$sql = "SELECT 'TRUE' FROM drupal_menu_links ";
$sql .= "WHERE menu_name IN ('primary-links') AND ";
$sql .= "link_path = '%s'";
$result = db_result(db_query($sql, $path));
return $result;
}
/**
* Ici, le menu par défaut existe. Vous pouvez trouver votre
* menu par défaut de différentes façons,
* par l'utilisation d'une taxonomy existante appliquée à un
* node ou par n'importe quel autre champ appliqué au node, ou
* même par une variable par défaut.
*/
function _find_default_menu($nid) {
$sql = "SELECT link_path FROM drupal_menu_links WHERE plid = 0 AND ";
$sql .= "menu_name IN ('primary-links') AND link_title = '%s'";
$link = db_result(db_query($sql, 'Some Menu'));
$router_item = menu_get_item($link);
// ne pas paramétrer si router_item est vide
if($router_item) {
menu_set_item("node/$nid", $router_item);
}
}
?>- Version imprimable
- 3354 lectures
-

Commentaires
Poster un nouveau commentaire