Message d'avertissement

The subscription service is currently unavailable. Please try again later.

Liens de menu actifs en fonction d'un champ du node

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
J'aimerais faire en sorte que l'un des éléments de mon menu principal soit actif (active trail) sur les nodes dont le champ "Rubrique" contient la valeur en question. En effet, je ne met pas mes nodes directement dans le menu, mais j'ai une liste de sélection pour choisir la rubrique dans laquelle il rentre.
Il me faudrait donc modifier le code d'affichage du main menu de façon à récupérer le contenu du champ rubrique du node actuel, et avec des if, faire afficher la propriété active.
Auriez-vous une idée de la manière de faire ça ?
Déjà, je ne trouve pas l'endroit où est codé l'affichage du main menu. Ensuite, il faudrait pouvoir récupérer les valeurs du node actuel sans être dans node.tpl.php.
Merci pour votre aide !
Maxime

Version de Drupal : 

Je ne sais pas si un module existe pour cela, mais vous pouvez rajouter dans le template.php de votre thème la fonction monTheme_links__system_main_menu($variables).

Il vous suffira dans cette fonction de prendre votre noeud, et de verifier que votre champ rubrique correspond à un links.

Par exemple si votre liens se nomme field_rubrique et que la valeur de ce champs est strictement le même que le nom du menu vous pouvez utiliser cette snippet :

<?php
function monTheme_links__system_main_menu($variables) {
  global
$language_url;
 
 
$links = $variables['links'];
 
$attributes = $variables['attributes'];
 
$heading = $variables['heading'];
 
$output = '';

  if (count($links) > 0) {
   
$output = '';
   
// Charger le noeud en cours.
   
$node = (arg(0) == 'node' && is_int(arg(1))) ? node_load(arg(1)) : NULL;
   
   
// Treat the heading first if it is present to prepend it to the
    // list of links.
   
if (!empty($heading)) {
      if (
is_string($heading)) {
       
// Prepare the array that will be used when the passed heading
        // is a string.
       
$heading = array(
         
'text' => $heading,
         
// Set the default level of the heading.
         
'level' => 'h2',
        );
      }
     
$output .= '<' . $heading['level'];
      if (!empty(
$heading['class'])) {
       
$output .= drupal_attributes(array('class' => $heading['class']));
      }
     
$output .= '>' . check_plain($heading['text']) . '</' . $heading['level'] . '>';
    }

    $output .= '<ul' . drupal_attributes($attributes) . '>';

    $num_links = count($links);
   
$i = 1;

    foreach ($links as $key => $link) {
     
$class = array($key);

      // Add first, last and active classes to the list of links to help out themers.
     
if ($i == 1) {
       
$class[] = 'first';
      }
      if (
$i == $num_links) {
       
$class[] = 'last';
      }
      if (isset(
$link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
           && (empty(
$link['language']) || $link['language']->language == $language_url->language)) {
       
$class[] = 'active';
      }
     
     
// Verifier si on doit mettre un menu link en active, pour ce faire nous
      // vérifions que d'abord il s'agit bien d'un noeud, ensuite que ce lien
      // ne soit pas déjà en class active, que le champs est bien rempli et
      // qu'il correspond au titre du menu.
     
if ($node && !in_array('active', $class) && isset($node->field_rubrique) && ($link['title'] == $node->field_rubrique['und'][0])) {
       
$class[] = 'active';
      }
     
$output .= '<li' . drupal_attributes(array('class' => $class)) . '>';

      if (isset($link['href'])) {
       
// Pass in $link as $options, they share the same keys.
       
$output .= l($link['title'], $link['href'], $link);
      }
      elseif (!empty(
$link['title'])) {
       
// Some links are actually not links, but we wrap these in <span> for adding title and class attributes.
       
if (empty($link['html'])) {
         
$link['title'] = check_plain($link['title']);
        }
       
$span_attributes = '';
        if (isset(
$link['attributes'])) {
         
$span_attributes = drupal_attributes($link['attributes']);
        }
       
$output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>';
      }

      $i++;
     
$output .= "</li>\n";
    }

    $output .= '</ul>';
  }

  return $output;
}
?>

Les lignes les plus important sont celle qui load le noeud en cours :

// Charger le noeud en cours.
$node = (arg(0) == 'node' && is_int(arg(1))) ? node_load(arg(1)) : NULL;

et celui qui vérifie dans le foreach que la rubrique est bien celle du titre du menu:

// Verifier si on doit mettre un menu link en active, pour ce faire nous
// vérifions que d'abord il s'agit bien d'un noeud, ensuite que ce lien
// ne soit pas déjà en class active, que le champs est bien rempli et
// qu'il correspond au titre du menu.
if ($node && !in_array('active', $class) && isset($node->field_rubrique) && ($link['title'] == $node->field_rubrique['und'][0])) {
  $class[] = 'active';
}

A vous de changer selon votre site.