Окружение пунктов меню дополнительными элементами

Главные вкладки

Аватар пользователя rampage rampage 11 декабря 2011 в 3:17

Я использую тему Andromeda и столкнулся с такой проблемой:
Главное меню выводится в списке, каждый пункт меню завернут в тег li. Мне надо перед этим тегом добавить свой, например span или div (пустой, так как он нужен мне для дальнейшей темизации).
На первый взгляд все просто.

Вот вывод меню в шаблоне темы:

<div id="main-menu" class="navigation">
        <?php print theme('links__system_main_menu', array(
          'links' => $main_menu,
          'attributes' => array(
            'id' => 'main-menu-links',
            'class' => array('links', 'clearfix'),
          ),
          'heading' => array(
            'text' => t('Main menu'),
            'level' => 'h2',
            'class' => array('element-invisible'),
          ),
        )); ?>
      </div>

Ага, ссылки берутся из $main_menu. Значит, надо найти там return "<li> ... </li>"; и дописать до и после свои теги.
Вот функция, которая возвращает эти ссылки:

function menu_navigation_links($menu_name, $level = 0) {
  // Don't even bother querying the menu table if no menu is specified.
  if (empty($menu_name)) {
    return array();
  }

  // Get the menu hierarchy for the current page.
  $tree = menu_tree_page_data($menu_name, $level + 1);

  // Go down the active trail until the right level is reached.
  while ($level-- > 0 && $tree) {
    // Loop through the current level's items until we find one that is in trail.
    while ($item = array_shift($tree)) {
      if ($item['link']['in_active_trail']) {
        // If the item is in the active trail, we continue in the subtree.
        $tree = empty($item['below']) ? array() : $item['below'];
        break;
      }
    }
  }

  // Create a single level of links.
  $router_item = menu_get_item();
  $links = array();
  foreach ($tree as $item) {
    if (!$item['link']['hidden']) {
      $class = '';
      $l = $item['link']['localized_options'];
      $l['href'] = $item['link']['href'];
      $l['title'] = $item['link']['title'];
      if ($item['link']['in_active_trail']) {
        $class = ' active-trail';
        $l['attributes']['class'][] = 'active-trail';
      }
      // Normally, l() compares the href of every link with $_GET['q'] and sets
      // the active class accordingly. But local tasks do not appear in menu
      // trees, so if the current path is a local task, and this link is its
      // tab root, then we have to set the class manually.
      if ($item['link']['href'] == $router_item['tab_root_href'] && $item['link']['href'] != $_GET['q']) {
        $l['attributes']['class'][] = 'active';
      }
      // Keyed with the unique mlid to generate classes in theme_links().
      $links['menu-' . $item['link']['mlid'] . $class] = $l;
    }
  }
  return $links;
}

Но как добавить до и после ссылки свои div'ы?

Комментарии

Аватар пользователя rampage rampage 11 декабря 2011 в 14:14

"mavr" wrote:
Посмотрите как реализовано в етой теме, должно помоч!

Посмотрел, но не помогло. Почему-то несмотря на links--system-main_menu.tpl.php никакое переопределение не сработало.
"sashken" wrote:
http://drupal.org/project/menu_attributes[/quote]
Спасибо, но это не то, что мне надо. Мне надо добавить к пунктам ul списка дополнительные теги.
"Erly" wrote:
http://www.drupal.ru/node/59154[/quote]
Мне надо обернуть в div'ы или span'ы именно li, а не a, как в вашем примере, но как переделать регулярное выражение для этого я не знаю.

Наверняка же есть места, в которых определено построение html кода, в который в итоге превратится ссылка. Почему там нельзя просто добавить нужные теги?
Я в разных функциях просто удалял вывод вместе с ul и li, но это не давало никаких результатов.

Аватар пользователя Erly Erly 11 декабря 2011 в 16:33

"rampage" wrote:
Мне надо обернуть в div'ы или span'ы именно li

С точки зрения валидации - это не очень хорошо. Т.к. дочерним элеметом UL должен быть LI, а не div или span.

Аватар пользователя rampage rampage 11 декабря 2011 в 16:50

"Erly" wrote:
С точки зрения валидации - это не очень хорошо. Т.к. дочерним элеметом UL должен быть LI, а не div или span.

Он и будет дочерним элементом. Вот, что мне надо:

<ul>
<div class="a"></div>
<li></li>
<div class="b"></div>
<div class="a"></div>
<li></li>
<div class="b"></div>
</ul>

Как все уже догадались, мне надо сделать с помощью css нечто нестандартное. Ни одного похожего решения я не нашел. Конечно, они скорее всего есть, но встретить их можно только случайно.

Аватар пользователя Shok211 Shok211 11 декабря 2011 в 16:58

О великий и могучЕй гугле помоги мне
Спасибо тебе

Ну дальше как могучий нам помог переопределяем тему
Если серьезно то все функции темизации имеют prefix theme_ ну в ядре друпала 100%

Аватар пользователя Erly Erly 11 декабря 2011 в 16:58

"rampage" wrote:


тогда дивы надо тоже в li обернуть.

А вам вообще что надо то? Может покажите картинку?

Аватар пользователя rampage rampage 10 ноября 2015 в 11:47

"Erly" wrote:
А вам вообще что надо то? Может покажите картинку?

Нет, как раз-таки дивы лучше не оборачивать в li, т.к. они должны быть либо над и под дивом (но как это сделать, если они внутри li?), либо слева и справа, но опять же каждый вручную придется подгонять.
Затем надо этим дивам с помощью css добавить границы. При определенных настройках формы и цвета границы станут как будто треугольниками, а самому li достаточно добавить по границе сверху и снизу. Получилось бы примерно то, что на картинке.

Аватар пользователя rampage rampage 11 декабря 2011 в 17:35

"Shok211" wrote:
О великий и могучЕй гугле помоги мне
Спасибо тебе
Ну дальше как могучий нам помог переопределяем тему
Если серьезно то все функции темизации имеют prefix theme_ ну в ядре друпала 100%

Зачем ты это вообще написал? Прочитай тему сначала, потом уроки доделай.

Аватар пользователя Shok211 Shok211 11 декабря 2011 в 18:10
<?php
function theme_menu_link(array $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";
}
?>

Вы конечно же не можете переопределить эту функцию в собственном модуле и выводить все пункты меню как вам надо. НУ и конечно как же без css . png картинки нас уже не устраивают : (

Аватар пользователя rampage rampage 11 декабря 2011 в 18:45

"Shok211" wrote:
Вы конечно же не можете переопределить эту функцию в собственном модуле и выводить все пункты меню как вам надо.

"rampage" wrote:
Значит, надо найти там return "<li> ... </li>"; и дописать до и после свои теги.
Вот функция, которая возвращает эти ссылки. Но как добавить до и после ссылки свои div'ы?

Стоило тебе попытаться прочитать хотя бы тему без комментариев и ты бы не обосрался так эпично.
"Shok211" wrote:
НУ и конечно как же без css . png картинки нас уже не устраивают : (

Время загрузки png глупо сравнивать с css.

Псевдовежливый стиль комментариев выдает твою школьную натуру с головой, особенно благодаря безграмотности. Теперь можешь уходить.

Аватар пользователя rampage rampage 11 декабря 2011 в 20:25

"Shok211" wrote:
Ты реально злой какой... тебе что строчку в коде Drupala указать где эта функция находиться ?

Ты чего хочешь-то? Тебе надо домашнее задание задать, чтобы ты закрепил пройденный материал в виде «Я так уже делал, не работает»?