Отображение меню в виде выпадающего списка

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

Аватар пользователя seaji seaji 14 мая 2007 в 0:57

При администрировании сайта, зачастую приходиться прыгать по меню "Управление" и не всегда конечный пункт достигается за один клик. Бывает пока ждешь загрузки 2-3 страниц забываешь, что собственно хотел сделать. Поэтому я для себя написал небольшой скриптик, который распечатывает указанное меню в виде выпадающего списка. Очень удобно, выбрал, кликнул и ты уже там где хотел бы быть.

Вы можете возразить, что для этого можно использовать всяческие готовые модули, которые с помощью JavaScript делают выпадающие меню.
Я JavaScript откинул, так как, не везде он работает. И еще если я администрирую сайт с КПК, то выпадающие Java меню отображаются раскрытыми и мне придется каждый раз продираться через эти меню.

Вот собственно код:
в файл темы template.php пропишите такую функцию:

<?php
function menu_to_select_list($mpid = array()) {
        global $base_path;
   $menu = menu_get_menu();
   foreach ($mpid as $pid) {
   if (isset($menu['visible'][$pid]) && $menu['visible'][$pid]['children']) {

        $output = '<form name="create" action="'.$base_path.'" method="get" class="top_bar_form left">
        <select size="1" name="q">'
;
       $output .='<option value="';
       $output .= $menu['visible'][$pid]['path'];
       $output .='">';
       $output .= $menu['visible'][$pid]['title'];
       $output .='</option>';

     foreach ($menu['visible'][$pid]['children'] as $mid) {
        $item = menu_get_menu($mid);
       $output .='<option value="';
       $output .= $item['visible'][$mid]['path'];
       $output .='">';
       $output .= $item['visible'][$mid]['title'];
       $output .='</option>';
       if(isset($item['visible'][$mid]['children'])) {
        foreach ($item['visible'][$mid]['children'] as $mid_2) {
         $item_2 = menu_get_menu($mid_2);
         $output .='<option value="';
         $output .= $item_2['visible'][$mid_2]['path'];
         $output .='">- ';
         $output .= $item_2['visible'][$mid_2]['title'];
         $output .='</option>';
        }
       }
     }
      $output .='</select> <input type="submit" value=">" class="form-submit"></form>';
   }
   }
   return $output;
 }
?>

Дальше Вы можете вызывать функцию menu_to_select_list($mpid = array()) где угодно.
Хотите, прописывайте ее в page.tpl.php. Хотите вызывайте ее в блоке (фильтрация PHP).

Например, для меню "Управление" пишите:
<?php
print menu_to_select_list(array(5))
?>
Для меню "Создание материала" пишите:
<?php
print menu_to_select_list(array(9))
?>
Если у пользователя нет прав на это меню, то он ничего не увидит. Функция не выдаст результата.

Комментарии

Аватар пользователя seaji seaji 30 июня 2007 в 4:17

Небольшое изменение:

<?php
/**
* Return select list for paticular menu and 2 children
*
* param $pid
* Menu ID for starting point
* return HTML for select list.
*/
function menu_to_select_list($pid) {
global $base_path;
$menu = menu_get_menu();
if (isset($menu['visible'][$pid]) && $menu['visible'][$pid]['children']) {

$output = '
';
$output .='';
$output .= $menu['visible'][$pid]['title'];
$output .='';

foreach ($menu['visible'][$pid]['children'] as $mid) {
$item = menu_get_menu($mid);
$output .='';
$output .= $item['visible'][$mid]['title'];
$output .='';
if(isset($item['visible'][$mid]['children'])) {
foreach ($item['visible'][$mid]['children'] as $mid_2) {
$item_2 = menu_get_menu($mid_2);
$output .='- ';
$output .= $item_2['visible'][$mid_2]['title'];
$output .='';
}
}
}
$output .='';
}
return $output;
}
?>

В этом варианте я убрал кнопки перехода.
Переход осуществляется при выборе пункта меню из списка.
В качестве начальной точки задается не массив, а просто ID меню.
Например, для меню "Управление" пишите:

<?php
print menu_to_select_list(5)
?>

В первом варианте был массив т.к. я планировал задавать несколько начальных точек и что бы они складывались в один лист, но с этим пока проблемы. Sad

Аватар пользователя player player 10 февраля 2008 в 15:38

Спасибо! У Вас во втором варианте функции menu_to_select_list ошибка в строке 11. Нет цикла.
Виноват. Вызвал не так Smile

Аватар пользователя inkar inkar 18 апреля 2008 в 22:12

print menu_to_select_list(5)-именно в какое место надо всавлять???
Если я хочу чтоб у меня было выпадающий меню в примари линкс!!!!!!!

Аватар пользователя seaji seaji 7 мая 2008 в 1:54

Ну да, или можно просто зайти в управление меню, навести курсор на пункт "изменить" и посмотреть на строку состояния Lol

Аватар пользователя seaji seaji 7 мая 2008 в 2:01

Еще для заметки.
В результате различных экспериментов выяснено, что данный способ НЕ РАБОТАЕТ если у Вас изменен файл .htaccess на предмет IndexPage.

Аватар пользователя Valeratal Valeratal 7 мая 2008 в 13:03

я так понял, мне нужно создать сначало меню

кстати, модуль jumpmenu делает тоже самое - из имеющихся меню делает выпадающее Smile

Аватар пользователя seaji seaji 5 января 2009 в 19:17

Специалисты, подскажите как это дело перевести под шестой Друпал?
Стал переводить свой сайт videotech.spb.ru на D6, а у них там вся система меню поменялась.
Може кто подскажет на вскидку функцию для D6 вместо функуции menu_get_menu() в D5 ???