Drupal добавляет диапазон внутри тегов A в хороших меню

Я пытаюсь добавить раскрывающиеся меню в тему drupal, в которой используется округление CSS с раздвижной дверью текста.

Текущая версия использует первичную инъекцию ссылок диапазона в теги, что отлично работает. Но не поддерживает раскрывающиеся меню.

Рабочий код:

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

В шаблоне с добавлением файла 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;
}
?>

Поэтому я добавил модуль Nice Menu, который хорошо работает и позволяет использовать функции раскрывающегося меню для моей навигации, которые теперь адресуется из шаблона с использованием:

<?php   print theme_nice_menu_primary_links() ?>

Проблема в том, что теги a должны иметь промежутки внутри, чтобы разрешить разметку выбранного состояния. Я пробовал каждый угол, который мог найти, чтобы отредактировать функцию drupal menu_item_link, которая используется красивыми меню для построения ссылок.

Например. Два дня смотрел форум drupal и никакой радости.

Строки в модуле, которые создают ссылки:

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

Как вы можете видеть, $ output использует menu_item_link для разбора массива на ссылки и добавления класса активных к выбранной ссылке навигации.

Вопрос в том, как добавить диапазон внутри тегов a ИЛИ как обернуть теги диапазоном, имеющим активный класс, для стилизации ссылок раздвижных дверей?


person Chris    schedule 16.03.2010    source источник
comment
Если ответ решает вашу проблему, вы должны принять его, нажав на галочку. Вы также можете использовать функцию голосования, чтобы проголосовать за хорошие / полезные ответы, щелкнув маленькую стрелку, указывающую вверх в этом ответе.   -  person googletorp    schedule 16.03.2010


Ответы (1)


Если вы хотите обернуть теги a диапазоном, вы можете перезаписать theme_nice_menu_build и добавить свой диапазон к выходным данным. Если вы хотите поместить внутрь тега a, вам нужно перезаписать menu_item_link.

Вы можете перезаписать функцию темы, создав вызов функции your_theme_name_function_name, и Drupal будет использовать эту функцию для рендеринга разметки вместо стандартной. Таким образом, вы можете изменить разметку как хотите. Эта функция должна быть в файле template.php вашей темы.

Хороший способ начать - скопировать функцию, которую вы хотите перезаписать, и просто изменить по своему вкусу.

Со времен Drupal 4.7 произошло многое, я не надеюсь, что вы этим воспользуетесь. Вставить теги 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']);
}

Я проверил это, и он отлично работает.

person googletorp    schedule 16.03.2010
comment
Как вы говорите, я могу заключить тег в диапазон. Но как обернуть текст в теге диапазоном? - person Chris; 16.03.2010
comment
Итак, вопрос в том, как перезаписать menu_item_link в файле template.php (и заставить его работать). Я пробовал много подходов, которые просто не производят тегов. - person Chris; 16.03.2010
comment
Я пробовал очень похожий подход, но он потерпел неудачу, должно быть, была устаревшая разметка. Ваше решение сработало отлично. Большое вам спасибо, я работал над этим весь вчера без радости. Drupal 6 вставляет span в красивое решение модуля меню !!!! - person Chris; 16.03.2010