Comment thématiser un bloc de menu?

11

J'ai créé un menu personnalisé (appelons-le "mynav") et dans mon thème, j'ai créé un modèle spécialement pour lui ( block--menu--menu-mynav.tpl.php) qui contient:

<div id="mynav" class="<?php print $classes; ?>"<?php print $attributes; ?>>
  <?php print $content ?>
</div>

Cela fonctionne bien.

Cependant, je préfère appliquer l'ID à la liste non ordonnée qui est générée et contenue dans $content. Je suppose que je dois créer une fonction MYTHEME_links__system_mynav_menucomme celle-ci:

function MYTHEME_links__system_mynav_menu($variables) {
  return "TEST"; // Generate HTML here (<ul id="mynav">...)
}

mais cela ne semble pas avoir d'effet.

Qu'est-ce que je fais mal?

RoToRa
la source
Il s'agit probablement d'un doublon de drupal.stackexchange.com/questions/2258/…
tim.plunkett
1
L'autre question concerne l'ajout d'un ID de menu unique, alors que cette question est plus générique.
kiamlaluno
Question exacte sur stackoverflow: stackoverflow.com/questions/11935477/…
claws

Réponses:

25

Afin de thématiser la liste non ordonnée, vous devez appeler theme_menu_tree (). Vous pouvez éditer votre template.php afin d'appeler cela.

function THEMENAME_menu_tree__MENUNAME($variables){
  return '<ul class="your-custom-class" id="your-custom-id">' . $variables['tree'] . '</ul>';
}

Ensuite, si vous souhaitez créer un thème pour vos liens, appelez theme_menu_link ().

function THEMENAME_menu_link__MENUNAME($variables) {
  $element = $variables['element'];
  $sub_menu = '';

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

Maintenant, le problème avec Drupal 7 est qu'il y a un bug majeur quand il s'agit d'afficher la trace active des menus personnalisés.

Voir problème
Issue # 520106 - Aucun moyen de définir dynamiquement la trace active
Issue # 942782 - Les menus personnalisés ne reçoivent jamais de trace active

Vous n'avez pas de chance si vous voulez de vrais menus personnalisés. Ces problèmes sont très anciens dans la communauté drupal, donc je ne sais pas s'ils seront corrigés de sitôt. Je ne sais pas s'il y a du PHP qui peut aider. Vous pouvez vous tourner vers certains modules alternatifs afin de faciliter la fonctionnalité, comme les attributs de menu et le bloc de menu . Les deux peuvent aider à contourner le système de menu cruddy dans Drupal 7.

Steven
la source
2

Dans le template.php de votre thème, c'était la façon de faire les choses dans Drupal 6

function MYTHEME_links__system_mynav_menu($variables) {
  return "TEST"; // Generate HTML here (<ul id="mynav">...)
}

Dans Drupal 7, vous devez appeler

  function MYTHME_menu_link(array $variables) {

  }
iStryker
la source
MYTHEME_menu_linksemble gérer uniquement les liens individuels. Je ne peux pas atteindre le ul.
RoToRa
J'y regarde, je ne sais plus si tu peux plus. Je sais qu'avec Drupal 7, vous avez plus de pouvoir sur les liens, mais moins de pouvoir sur les menus.
iStryker