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);
    }
}
?>

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <css>, <php>, <html>, <ccss>, <ccss>, <drupal5>, <drupal6>, <html>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".
  • You may use [view:viewname] tags to display listings of nodes.

Plus d'informations sur les options de formatage

CAPTCHA
Cette question permet d'éviter le spam :
5 + 4 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.