[Решено]Как переопределить вывод своего меню?
Прислано: ValBangMan
сб, 20/12/2008 - 21:43
Добрый вечер, уважаемое сообщество. Очень надеюсь на помощь. До этого работал с джумлой, но заказчик пожелал освоить друпал, вот и осваиваю:)
Возник вопрос, по которому куча разбросанной инфы, но толком ничего не нашел, книгу еще не прислали по друпал 6 :), поэтому, собственно сам вопрос (Drupal 6.8).
1.Я создал свое меню "Главное меню" с тремя пунктами и с системным именем mainmenu.
2.В файле my_theme.info я создал новый регион regions[main_menu] = Главное меню.
3.В разделе "Блоки" в админке разместил свое меню "Главное меню" в регионе "Главное меню".
Если выводить меню в регионе в page.tpl.php как print $main_menu, то оно по-умолчанию обрамляется в тэги друпалосвские с друпаловскими классами:
<div id="block-menu-menu-mainmenu" class="block block-menu"> <h2>Главное меню</h2> <div class="content"> <ul class="menu"> <li class="leaf first"> <a class="active" title="" href="/">О нас</a> </li> <li class="leaf active-trail"> <a class="active" title="" href="/">Новости</a> </li> <li class="leaf last"> <a class="active" title="" href="/">События</a> </li> </ul> </div> </div>
В верстке, из которой нужно сделать шаблон для друпала свои классы и своя структура.
Как переопределить вывод вышепреведенного куска в следующем виде:
<ul> <li class="li_class"> <a class="link" title="" href="/">О нас</a> </li> <li class="li_class"> <a class="link" title="" href="/">Новости</a> </li> <li class="li_class"> <a class="link" title="" href="/">События</a> </li> </ul>
то есть, где что писать и что создавать, чтобы сменой шаблона достичь изменения вывода меню, не копаясь в файлах друпала, потому как я читал, что если исправлять файлы inc то это не есть хорошо и все можно сделать с помощью файлов в каталоге с шаблоном....но у меня пока не вышло :( HELP! Заранее благодарен за ответы по теме, и я думаю, что они помогут не только мне, но и многим новичкам.
- ValBangMan's blog
- Для комментирования войдите или зарегистрируйтесь
Коллега по сути: http://drupal.ru/node/22900 :(
- Для комментирования войдите или зарегистрируйтесь
Вам проще переопределить функции, по-моему так - function_menu_tree или есть еще в темплейтах menu-tree.tpl.php Поищите на друпал.орге или в апи.драпал.ру
Или если у вас Д6, поставьте Девел и включите Девел для темера, этот содуль выведет как и что можно переопределить.
- Для комментирования войдите или зарегистрируйтесь
А можно подробнее про переопределение функций? Типа такого:
1. Создаем файл menu-tree.tpl.php, в нем пишем
function_menu_tree { $output=''; $output.='<ul>'; foreach.....{$output.='<li>'.$item.'</li>'} $output.='</ul>'; }
2. После этого в шаблоне меню выводим не <?php print $main_menu ?> а <?php print theme($main_menu) ?>
Что-нибудь по типу такой инструкции может кто-нибудь написать, только ПРАВИЛЬНОЙ, а не такой, как у меня от балды, чтобы только показать, какой она должна быть :)
- Для комментирования войдите или зарегистрируйтесь
Я делал так:
1) скопировал код функции menu_tree из системного файла и вставил код в файл template.php (в папке с темой)
2) в коде функции есть строки, отвечающие за обрамление тегами элементов меню. Вот эти строчик и правьте как вам угодно.
- Для комментирования войдите или зарегистрируйтесь
В системном файле includes\menu.inc меняю функцию
function theme_menu_tree($tree) { return '<ul class="menu-my">'. $tree .'</ul>'; } /** * Generate the HTML output for a menu item and submenu. * * @ingroup themeable */
...<ul class="menu">...
НО когда я скопировал функцию theme_menu_tree($tree) вставил ее в файл template.php и переименовал в function phptemplate_menu_tree($tree) то ничего не заменилось :( и вывелось обычное <ul class="menu">
А также пробовал по-другому: создал в папке с темой файл menu-tree.tpl.php со следующим содержимым
<?php function theme_menu_tree($tree) { return '<ul class="menu-my">'. $tree .'</ul>'; } /** * Generate the HTML output for a menu item and submenu. * * @ingroup themeable */ ?>
Что я делаю не так? Может нужно выводить меню не так, как я <?php print $main_menu; ?>? Помогите, плз.
- Для комментирования войдите или зарегистрируйтесь
В общем, понял, почему не изменялся вывод: просто нужно было выбрать другую тему пересохранить настройки и после опять выбрать мою и все гуд. Только не совсем....
Я для пробы способом, который предложил hubba попробовал просто очистить тэги ul и li от друпаловских классов, причем друпал вывел тэг ul в самом начале и внутри его добавил друпаловский див с классом и после еще раз уже нормальный, очищенный список:
<ul> <div id="block-menu-menu-main-menu" class="block block-menu"> <h2>Главное меню</h2> <div class="content"> <ul> <li> <a class="active" title="" href="/">Новости</a> </li> <li> <a class="active" title="" href="/">О нас</a> </li> <li> <a class="active" title="" href="/">События</a> </li> </ul> </div> </div> </ul>
Содержимое файла template.php:
function phptemplate_menu_tree($tree) { return '<ul>'.$tree.'</ul>'; } function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) { return '<li>'. $link . $menu ."</li>\n"; }
В файле page.tpl.php вывожу меню так:
Походу получилось так, что темизации подверглась и сама переменная, в которой хранится содержимое региона, из-за этого и появились в начале и в конце тэги UL...В связи с этим появились 2 вопроса:
1. Какие функции отвечают за вывод дива <div id="block-menu-menu-main-menu" class="block block-menu"> в начале и заголовка моего меню, обрамленного тэгами <h2></h2>, они не нужны, как их убрать...?
2. С помощью какой функции друпал выводит содержимое регионов? (У меня мое меню с системным именем main-menu размещено в регионе main_menu)
- Для комментирования войдите или зарегистрируйтесь
Решено! Просто в директории с темой созается файл block.tpl.php c таким содержимым:
<?php print $block->content ?> и левый див <div id="block-menu-menu-main-menu" class="block block-menu">убираются и меню выводится без него
- Для комментирования войдите или зарегистрируйтесь
Круто. Спасибо за подробность и пути к файлам.
Эх, если бы все так подробно писали...
- Для комментирования войдите или зарегистрируйтесь
Пожалуйста, просто сам разбираюсь с нуля вот и подумал, что многим будет интересно тоже, поэтому и делюсь подробно приобретенным опытом :)
- Для комментирования войдите или зарегистрируйтесь
Да уж, действительно спасибо, помогло здорово.
Кстати, если нужно темизировать вывод блоков только в одном регионе (в том числе в своем), то нужно это делать не в block.tpl.php, а нужно создать файл например block-header.tpl.php и в нем темизировать блоки выводящиеся в регион header.
- Для комментирования войдите или зарегистрируйтесь
А есть ли возможность функции phptemplate_menu_tree и phptemplate_menu_item выполнять для какого-то отдельного меню, а не для всех?
- Для комментирования войдите или зарегистрируйтесь
Огромное спасибо за ответы, очень помогли!
- Для комментирования войдите или зарегистрируйтесь


Комментарии