Question

Je suis en train d'ajouter des menus déroulants à un thème qui utilise arrondi drupal CSS porte coulissante texte.

La version actuelle utilise une injection de liens primaire de la durée dans les balises un, qui fonctionne très bien. Mais ne supporte pas les menus déroulants.

Code de travail:

<?php print theme('links', $primary_links, array('class' => 'links primary-links')) ?>

Dans le modèle avec un ajout de fichier template.php:

<?php
// function for injecting spans inside anchors which we need for the theme's rounded corner background images
function strands_guybrush_links($links, $attributes =  array('class' => 'links')) {
  $output = '';
  if (count($links) > 0) {
    $output = '<ul'. drupal_attributes($attributes) .'>';

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

    foreach ($links as $key => $link) {
      $class = $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()))) {
        $class .= ' active';
      }
      $output .= '<li'. drupal_attributes(array('class' => $class)) .'>';

      if (isset($link['href'])) {
        $link['title'] = '<span class="link">' . check_plain($link['title']) . '</span>';
        $link['html'] = TRUE;      
        // Pass in $link as $options, they share the same keys.
        $output .= l($link['title'], $link['href'], $link);        
      }
      else if (!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;
}
?>

J'ai donc ajouté de Nice module Menu qui fonctionne bien et permet les fonctions de menu déroulant pour ma navigation qui est maintenant adressée à partir du modèle en utilisant:

<?php   print theme_nice_menu_primary_links() ?>

Le problème est que les balises a besoin d'avoir des portées à l'intérieur pour permettre le balisage d'état sélectionné. J'ai essayé tous les angles que je pouvais trouver pour modifier le menu_item_link fonction qui est utilisée drupal par de beaux menus pour construire les liens.

par exemple. Je regardais le forum pendant deux jours drupal et pas de joie.

Les lignes du module qui construisent les liens sont:

function theme_nice_menu_build($menu) {
  $output = '';
  // Find the active trail and pull out the menus ids.

  menu_set_active_menu_name('primary-links');
  $trail = menu_get_active_trail('primary-links');
  foreach ($trail as $item) {
    $trail_ids[] = $item['mlid'];
  }

  foreach ($menu as $menu_item) {
    $mlid = $menu_item['link']['mlid'];
    // Check to see if it is a visible menu item.
    if ($menu_item['link']['hidden'] == 0) {
      // Build class name based on menu path
      // e.g. to give each menu item individual style.
      // Strip funny symbols.
      $clean_path = str_replace(array('http://', '<', '>', '&', '=', '?', ':'), '', $menu_item['link']['href']);
      // Convert slashes to dashes.
      $clean_path = str_replace('/', '-', $clean_path);
      $class = 'menu-path-'. $clean_path;
      $class .= in_array($mlid, $trail_ids) ? ' active' : '';  
      // If it has children build a nice little tree under it.
      if ((!empty($menu_item['link']['has_children'])) && (!empty($menu_item['below']))) {
        // Keep passing children into the function 'til we get them all.
        $children = theme('nice_menu_build', $menu_item['below']);
        // Set the class to parent only of children are displayed.
        $class .= $children ? ' menuparent ' : '';
        // Add an expanded class for items in the menu trail.
        $output .= '<li id="menu-'. $mlid .'" class="'. $class .'">'. theme('menu_item_link', $menu_item['link']);
        // Build the child UL only if children are displayed for the user.
        if ($children) {
          $output .= '<ul>';
          $output .= $children;
          $output .= "</ul>\n";
        }  
        $output .= "</li>\n";
      }  
      else {
        $output .= '<li id="menu-'. $mlid .'" class="'. $class .'">'. theme('menu_item_link', $menu_item['link']) .'</li>'."\n";
      }  
    }  
  }
  return $output;
}

Comme vous pouvez le voir la sortie de $ menu_item_link utilise pour analyser le tableau en liens et ajouté la classe d'actifs sur le lien de navigation sélectionné.

La question est de savoir comment puis-je ajouter une durée à l'intérieur des balises un OU comment puis-je envelopper les étiquettes un avec une portée qui a la classe active de style les liens de porte coulissante?

Était-ce utile?

La solution

Si vous voulez envelopper les balises un avec une portée, vous pouvez remplacer le theme_nice_menu_build et ajoutez votre durée à la sortie. Si vous voulez dans la balise que vous devez remplacer le menu_item_link.

Vous pouvez remplacer un thème funciton par la création d'un your_theme_name_function_name d'appel de fonction et Drupal utiliserez cette fonction pour rendre le balisage au lieu de celui par défaut. De cette façon, vous pouvez modifier le balisage comme vous le souhaitez. Cette fonction doit être dans le fichier template.php de votre thème.

Une bonne façon de commencer est de copier la fonction que vous souhaitez remplacer et simplement modifier vos goûts.

Beaucoup de choses se sont passées depuis Drupal 4.7, je ne souhaite pas vous utiliser. Il est assez facile d'insérer des balises span:

function your_theme_name_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  $link['localized_options']['html'] = TRUE;
  return l('<span>' . $link['title'] . '</span>', $link['href'], $link['localized_options']);
}

Je l'ai testé cela et il fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top