Вы здесь

Программный вывод многоуровневого меню с определённой разметкой

1

Как программно вывести многоуровневое main menu с такой разметкой?

    <ul>
        <li>
            <a href="#">Ссылка</a>
        </li>
        <li>
            <a href="#">Ссылка</a>
        </li>
        <li class="dropdown">
            <a href="#">Ссылка</a>
            <ul>
                <li class="dropdown">
                    <a>Уровень 1</a>
                    <ul>
                        <li><a>Уровень 2</a></li>
                        <li><a>Уровень 2</a></li>
                    </ul>
                </li>
                <li><a>Уровень 1</a></li>
                <li><a>Уровень 1</a></li>
                <li><a>Уровень 1</a></li>
            </ul>
        </li>
    </ul>
Версия Drupal: 
7.x
Категория: 
Menu API
Вопрос задан 04.02.2015 - 05:15
Аватар пользователя SAM
SAM
212

Ответы

4

Переопределить:
theme_menu_tree
theme_menu_link

Ответ дан 04.02.2015 - 12:04
Аватар пользователя xandeadx
xandeadx
1541

Функции ясны, но вот в чём дело:
$element['#below'] - у всех пуст, без разницы есть ли вложения. Вообще весь массив $variables['element'] проверил.

Грубо говоря, я незнаю откуда дергать дочерние пункты. Напрямую из базы?

Комментарий оставлен 05.02.2015 - 05:18

Не должен быть пуст. Если есть дочерние пункты в меню (и они доступны пользователю по правам), то они там будут. Дергать напрямую из базы не надо.

Загрузите дерево меню и поглядите, что там в массиве.

Комментарий оставлен 05.02.2015 - 11:44

Я же сказал что весь массив элемента проверил через Devel. Вывод всего массива меню (по Вашему способу) тоже ничего не дал (нет дочерних элементов). Хотя в админке всё нормально.
http://i.imgur.com/LcaHhEZ.png

Комментарий оставлен 05.02.2015 - 13:06

some

Я взял заведомо многоуровневое меню, ко всем элементам которого у меня есть доступ.
Загрузил его функцией, которая заведомо грузит все данные меню и вывел:

$tree = menu_tree_all_data('menu_name');
dsm($tree);

Получил вот эту картинку. Как видите, у всех элементов меню, у которых есть дочерние элементы, below содержит их массивы.

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

Комментарий оставлен 05.02.2015 - 23:13

Да причем тут вывод в tpl.php
Я переопределяю на уровне шаблона. Исходя из Вашего ответа, загрузил всё дерево, но толку...

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

  if ($element['#original_link']['has_children'] == 1) {
    $menu_id = $element['#original_link']['mlid'];
    $tree = menu_tree_all_data($element['#original_link']['menu_name']);
    $sub_tree = $tree[$menu_id]['below']; // по id не вытаскивает, так как название массива непонятно формируется

    $sub_menu = '<ul>' . drupal_render($sub_tree) . '</ul>';

    $element['#attributes']['class'][] = 'dropdown';
    $element['#localized_options']['html'] = TRUE;
  }
  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}
Комментарий оставлен 06.02.2015 - 02:23
0

Меню в друпале - это массив данных. Его надо загрузить в переменную. Есть много способов это сделать, в зависимости от того, что именно надо. https://api.drupal.org/api/drupal/includes%21menu.inc/7 описывает все эти разные способы.

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

После работы, если она нужна, переменную с массивом меню внутри надо "превратить в хтмл". Это опять же в друпале можно сделать многими способами.

Пример:
$tree = menu_tree_all_data('machine-name-of-menu');
menu_tree_add_active_path($tree);
print drupal_render(menu_tree_output($tree));

Более простой пример:
$menu = menu_navigation_links('menu-main-page');
print theme('links__menu_main_page', array('links' => $menu));

Однако надо помнить, что "напечается" меню так, как указано в функциях превращения массива меню в хтмл - это функции темирования в друпале. Соответственно, если оно печатается не так, как надо - надо переопределить функции темы, отвечающие за части "печатания" меню. Как xandeadx писал, это theme_menu_tree для дерева и theme_menu_link для каждой отдельной ссылки в меню.

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

Ответ дан 04.02.2015 - 23:15