как-то консультировал владельцев handball.by по такому вопросу... Все решилось стандартными стредствами и колдовством над CSS... Если оно, то могу описать телодвижения...
Каюсь, немного не совсем стандартными средствами решена была проблема. Пришлось немного подколдовать над mod_mainmenu...
Итак, для начала нужно хакнуть немного стандартный modules/mod_mainmenu.php. Ищем функцию mosShowHFMenu и перед ней добавляем (не забываем забэкапить оригинальный модуль):
function getParents($ch_id){
global $database;
$sql = "SELECT m.parent"
. "\n FROM #__menu AS m"
. "\n WHERE id = '". (int)$ch_id ."'"
;
$database->setQuery( $sql );
$rows = $database->loadResult();
$res = array();
if ($rows!=0) {
$res[] = $rows;
$res1 = getParents($rows);
foreach ($res1 as $res1_) $res[] = $res1_;
}
return $res;
}
Далее ниже в самой функции меняем
$links[] = mosGetMenuLink( $row, 0, $params );
на
$links[] = mosGetMenuLink( $row, 0, $params, getParents($Itemid) );
Все. С хаками покончили... Далее настройка самого отображения....
Занчит, все на примере... Возьмем за основу topmenu, скажем... Набиваем в нем всю нашу древовидную структуру полного развернутого меню. Далее, один модуль mod_mainmenu (назовем его HORIZ) привязываем на вывод нашего topmenu в виде горизонтального меню (ну или flat - кому как удобнее), в параметрах включаем "активация родителя". Этот вид показывает только mainlevel, т.е. только 1-й уровень иерархии меню...
Далее делаем 2-й модуль (Назовем его VERT), ссылающийся также на topmenu, но отображение делаем в вертикальном виде. Это отображение, как известно, умеет показывать меню в полном древовидном виде. В параметрах убираем "разворачивать меню" и включаем "активация родителя"...
Все публикуем и видим: изначально видно как горизонтальное, так и вертикальное меню, точнее только уровень mainlevel, так? Как только мы выберем один из пунктов mainlevel - соответствующий пункт в вертикальном развернется и покажет вложенные пункты в него. Причем #active_menu будет как у горизонтального, так и у вертикального (не забываем включить "активация родителя").
Все что нам осталось - скрыть через "display:none;" в CSS mainlevel уровень нашего VERT меню.
Таким образом, пока мы не перешли ни по одному из mainlevel - вертикальное меню будет скрыто(все элементы - hide). Далее, как только выбрали что-то из горизонтального - активировали соответствующую ветку дерева и открыли sublevel в вертикальном, который отображается отдельно от mainlevel... В коде, конечно же, виден и mainlevel вертикального, но он скрыт через css...
Пробуем, отписываемся...