ВопросГоризонтальное тянущееся меню на всю ширину

Добрый день .
Ищу варианты реализации меню .
От 10 до 15 элементов .
Ширина контейнера 100% .
Меню должно растягиваться .
Были попытки размещения блоками , но от этой идеи пришлось отказаться , т.к. не все браузеры его стабильно держали .
Сейчас стоит вопрос выполнения меню заключенного в таблицу .
Покопавшись немного в ядре удалось найти пару функций .

function theme_menu_tree($variables) {
  return '<ul class="menu clearfix">' . $variables['tree'] . '</ul>';
}
 
function theme_menu_tree_local_action($variables) {
  $link = $variables['element']['#link'];
 
  $output = '<li>';
  if (isset($link['href'])) {
    $output .= l($link['title'], $link['href'], isset($link['localized_options']) ? $link['localized_options'] : array());
  }
  elseif (!empty($link['localized_options']['html'])) {
    $output .= $link['title'];
  }
  else {
    $output .= check_plain($link['title']);
  }
  $output .= "</li>\n";
 
  return $output;
}

Естественно сразу попытался заменить теги .
После этого понял , что элементы во всех списках на странице изменились .

Вопрос , как заменить теги оборачивающие элементы списка только у нужного блока ?

Сразу приходит мысль указать в имени функции id блока .

А вообще , очень сильно сомневаюсь по поводу того , какой метод выбрал .

Возможно это делается по другому ?

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Так может выведите пункты меню в таблицу шириной 100%? Тогда все пункты точно всегда будут растягиваться на всю ширину контейнера.

17.12.2011 12:03
Аватар пользователя ice
ice написал:

Как раз это и является задумкой .
Но как записать нужную функцию пока не очень представляю .
Так как необходимо будет добавлять или удалять пункты , хотелось бы чтоб это понимал шаблон .
Да и вариант с блондинкой модератором не исключается .

17.12.2011 12:26
Аватар пользователя Spleshka
Spleshka написал:

Ну во-первых, функции theme_menu_tree_local_action() ни в одной из версий Друпала не существует. Во-вторых, скажите какая у вас версия Друпала и я напишу вам решение.

18.12.2011 15:19
Аватар пользователя ice
ice написал:

7

а называется эта функция theme_menu_local_action()

18.12.2011 15:23
Аватар пользователя Spleshka
Spleshka написал:

Закиньте в template.php вот такую функцию:

function ИМЯТЕМЫ_print_menu($links) {
  $item = array();
  if (count($links) > 0) {
    foreach ($links as $key => $link) {
      if (isset($link['href'])) {
        // Pass in $link as $options, they share the same keys.
        $item[] = 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']);
        }
        $item[] = '<span' . $span_attributes . '>' . $link['title'] . '</span>';
      }
    }
  }
  $rows[] = $item;
  return theme('table', array('rows' => $rows, 'attributes' => array('width' => '100%')));
}

После этого меню выводить вот так (в page.tpl.php):

<?php if ($main_menu): ?>
  <?php print ИМЯТЕМЫ_print_menu($main_menu); ?>
<?php endif; ?>

Это не имплементация методов Друпала, а исключительно своя функция. Сделано это для того, чтобы другие части системы, вызванные через стандартные методы, не были обёрнуты в таблицу, вместо стандартных списков.

18.12.2011 15:49
Аватар пользователя ice
ice написал:

Работает )
А это применимо только к основному меню или можно вывести так дополнительное ?

Не верно задал вопрос .

id меню "menu-menu" , как привязать данное решение к нему ?

18.12.2011 16:29
Аватар пользователя Spleshka
Spleshka написал:

Любое меню. ID тут не причём) В page.tpl.php передаётся $main_menu и $secondary_menu. Их можно передавать в качестве аргумента в эту функцию.

18.12.2011 16:44
Аватар пользователя ice
ice написал:

Видимо лыжи тут не причем , это я ... )

Как же вывести именно это меню в таблице ?

18.12.2011 17:02
Аватар пользователя Spleshka
Spleshka написал:

Так я же функцию написал, которое выводит любое меню, которое переданно аргументом?

18.12.2011 17:51
Аватар пользователя ice
ice написал:

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

18.12.2011 19:27
Аватар пользователя Spleshka
Spleshka написал:

А как вы представляете себе выпадающее меню, которое представляет из себя таблицу?

18.12.2011 20:46
Аватар пользователя ice
ice написал:
18.12.2011 20:58
Аватар пользователя Spleshka
Spleshka написал:

Ага, понял. Интересное решение.

Подсказываю как написать решение:

Есть замечательная функция, с которой вы уже знакомы - menu_tree. В ней вам надо изменить вывод функции menu_tree_output, которая и выстраивает html код по уровням.

Код будет примерно такой:

function ИМЯТЕМЫ_print_menu($menu_name) {
  $menu_output = &drupal_static(__FUNCTION__, array());
 
  if (!isset($menu_output[$menu_name])) {
    $tree = menu_tree_page_data($menu_name);
    $menu_output[$menu_name] = ИМЯТЕМЫ_custom_tree_output($tree);
  }
  return $menu_output[$menu_name];
}

Это слегка видоизменённая функция menu_tree(). Теперь вам надо написать функцию ИМЯТЕМЫ_custom_tree_output(), которая будет как 2 капли воды похожа на menu_tree_output(), но с другим html выводом дочерних элементов.

19.12.2011 15:12
Аватар пользователя ice
ice написал:

У вас это работает , скриншот можно посмотреть ?

20.12.2011 21:44
Аватар пользователя Spleshka
Spleshka написал:

Я реализацию не писал. Но если вы сделаете так, как я сказал, то можете написать её самостоятельно. Какой у вас уровень программирования?

21.12.2011 00:24
Аватар пользователя ice
ice написал:

Читаю книжки , вышиваю крестиком .
Явно не выше низкого , в противном случае не задавал бы вопросов ).
Ну а если серьезно , то черпаю знания php из записей уроков .

21.12.2011 01:01
Аватар пользователя Spleshka
Spleshka написал:

Я так понимаю, реализация выпадающего меню требуется от меня ?)) Отпишитесь в этой теме завтра, как будет свободная минутка обещаю набросать работающий код.

21.12.2011 01:05
Аватар пользователя ice
ice написал:

Спасибо за отзывчивость .
Жду с нетерпением ).

21.12.2011 01:10
Аватар пользователя ice
ice написал:

Вчера обнаружил themer в модуле devel , был поражен тому что он показывает .
Еще пригодится ).

22.12.2011 15:55
Аватар пользователя Spleshka
Spleshka написал:
function print_custom_menu($menu_name) {
  $menu_output = &drupal_static(__FUNCTION__, array());
  if (!isset($menu_output[$menu_name])) {
    $tree = menu_tree_page_data($menu_name);
    $menu = menu_tree_output($tree);
    $i = 0;
    $row = array();
    foreach ($menu as $item) {
      if (isset($item['#title'], $item['#href'])) {
        $row[$i] = l($item['#title'], $item['#href'], $item['#attributes']);
        if (sizeof($item['#below'])) {
          $items = array();
          foreach ($item['#below'] as $b_item) {
            if (isset($b_item['#title'], $b_item['#href'])) {
              $items[] = l($b_item['#title'], $b_item['#href'], $b_item['#attributes']);
            }
          }
          if ($items) {
            $row[$i] .= theme('item_list', array('items' => $items));
          }
        }
        $i++;
      }
    }
    $rows[] = $row;
    $menu_output[$menu_name] = theme('table', array('rows' => $rows, 'attributes' => array('class' => array($menu_name))));
  }
  return $menu_output[$menu_name];
}

Вызывать как и menu_tree():

<?php print print_custom_menu('main-menu'); ?>

Надеюсь, css сделать получится у вас)

22.12.2011 16:47
Аватар пользователя ice
ice написал:

ААААА , супер , стили щас прикручу )

Спасибо вам огромное , надеюсь не много времени на меня потратили )

22.12.2011 16:55
Аватар пользователя Spleshka
Spleshka написал:

Незачто :) Главное, чтобы всё работало!

22.12.2011 18:35

Комментировать