Генерация меню

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

Аватар пользователя zaartix zaartix 27 августа 2007 в 1:29

Пытаюсь доработать меню под себя.
Как можно получить массив с primary links, вместе с дочерними элементами?

искал тут: http://api.drupal.org/api/group/menu/5

В общем пробовал <?phpmenu_primary_links ($level, $pid)?>, проблема возникла, что нельзя определить для какого элемента родительского меню относятся дети, если level=2. В общем-то проблема сводится к тому, чтобы menu_primary_links возвращал еще дочерние элементы. Даже как таковой pid от текущего (не активного) элемента приходится выковыривать через парсинг ключа массива primary_links. Вот и подумал, что проще всего будет получить развернутое до второго уровня меню в виде массива. Может я слишком глубоко влез и все гораздо проще? Smile

Комментарии

Аватар пользователя zaartix zaartix 27 августа 2007 в 20:15

вот пример:

главная ссылка1
главная ссылка2
____подссылка1
____подссылка2
главная ссылка3
главная ссылка4

И главное, чтобы показывалось оно развернутым как в случае нахождения на странице "главная ссылка2", так и на "подссылка 1" или "подссылка 2"

Аватар пользователя sas@drupal.org sas@drupal.org 27 августа 2007 в 20:51

1) Структра четко прописна в обычном меню по классам admin/build/menu через ul li
2) прописать использование любого меню в качестве primary / secondary можно на странице admin/build/menu/settings
Menu containing primary links:
Menu containing secondary links:

P.S. Мне мне импонирует menu_nice не надо ждать загружки страницы с secondary они появляются при наведении курсора на primary

Аватар пользователя zaartix zaartix 28 августа 2007 в 17:28

1. ну да, только вот заставить этот класс вывести подменю для текущего пунка меню у меня не получилось.
Нашел пример на офф сайте:
<?php
$mid = menu_get_active_nontask_item();
$active = menu_get_item($mid);
// this is a top-level link in your primary links
if($active['pid'] == variable_get('menu_primary_menu', 0)){
$output.= theme('menu_tree',$mid);
print('

');
}

?>
Но эта зараза выводит подменю только если активным является пункт основного меню, а если наступить на какой-либо линк из выпавшего списка - тогда уже подменю сворачивается, а это не есть гут Sad Именно на этом и застрял.

Аватар пользователя zaartix zaartix 28 августа 2007 в 17:44

Не, извиняюсь, ошибся, все ок выводится, только в отдельном потоке, а мне надо внутри меню прям чтобы было, т.е. все в одном потоке.

Т.е. чтоб хтмл был таким:

Ниже скриншот реального меню, которое и хочу сделать

Аватар пользователя zaartix zaartix 29 августа 2007 в 17:51

Интересно, все молчат потому как я дурацкий вопрос задал или потому как никто не знает как это сделать? Smile

Аватар пользователя zaartix zaartix 29 августа 2007 в 20:07

хм, это как Вы себе представляете? Smile
primary_links уже содержит ul и все li, предположим я все дочерние для текущего пункта получил в secondary_links, мне придется вставлять его (secondary_links) посредством жесткого определния отступов (padding-bottom) от текущего активного пункта меню на неопределенное количество пикселей вниз (?), и туда посредством position: absolute вставлять новый ul из дочерних элементов??? Smile имхо это издевательство над меню, да и нельзя мне из общего потока выдирать элементы, весь сайт расползется иначе.

Или я не так понял? Smile

Аватар пользователя zaartix zaartix 29 августа 2007 в 20:45

есть конечно хирургический способ
<?php
$sql = "select *
from {menu} as root
left join {menu} as primary_links on primary_links.pid=root.mid
left join {menu} as childs on childs.pid=primary_links.mid
where root.pid=0";
?>
не верю, что нет штатных средств получить массив с детьми

Аватар пользователя sas@drupal.org sas@drupal.org 29 августа 2007 в 21:04

Почему Вас не устраивают классические конструкции например как в garland через class и padding для li и вложенных ul li , нет там никаких position:absolute все relative Smile
Может посмотреть на задачу с другого "угла" ?

Аватар пользователя zaartix zaartix 29 августа 2007 в 22:01

хм, что-то действительно не подумал даже, что можно посмотреть в других шаблонах тем, спасибо Smile

А пока уже навоял функцию, которая выводит 2-х уровневое меню и определяет активную ветку (вдруг кому пригодится)

<?php
function gen_menu($template = array('ul','class','menu-v','li'))
{
$current_mid = menu_get_active_item();
$sql = "SELECT p.mid AS p_mid, p.title AS p_title, p.path AS p_path, c.mid AS c_mid, c.title AS c_title, c.path AS c_path
FROM menu AS root
LEFT JOIN menu AS p ON p.pid = root.mid
LEFT JOIN menu AS c ON c.pid = p.mid
WHERE root.pid Shok
ORDER BY root.pid, p.pid, p.weight, c.pid, c.weight";
$queryResult = db_query($sql);
$p_mid = 0;
while ($m = db_fetch_object($queryResult)) {
$c_mid = $m->c_mid;
if ($m->p_mid!=$p_mid) {
$p_mid = $m->p_mid;
$array[$p_mid]['title'] = $m->p_title;
$array[$p_mid]['href'] = $m->p_path;
}
if ($c_mid) {
$array[$p_mid]['childs'][$c_mid]['title'] = $m->c_title;
$array[$p_mid]['childs'][$c_mid]['href'] = $m->c_path;
if ($current_mid==$c_mid) {
$array[$p_mid]['childs'][$c_mid]['active'] = true;
$array[$p_mid]['active'] = true;
}
}
}
$return = '';
foreach ($array as $k=>$v) {
$return.="<{$template[0]} {$template[1]}=\"{$template[2]}\">";
$active = $v['active'] ? 'class="active"' : '';
$return.="<{$template[3]}>{$v['title']}";
if (sizeof($v['childs'])) {
$return.="<{$template[0]}>";
foreach ($v['childs'] as $v1) {
$active = $v1['active'] ? 'class="active"' : '';
$return.="<{$template[3]}>{$v1['title']}";
}
$return.="";
}
$return.="";
}
return $return;
}
?>