[Решено]Как переопределить вывод своего меню?

Прислано: 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! Заранее благодарен за ответы по теме, и я думаю, что они помогут не только мне, но и многим новичкам.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано iT в вс, 21/12/2008 - 00:03.

Коллега по сути: http://drupal.ru/node/22900 :(


Опубликовано Geldora в вс, 21/12/2008 - 07:15.

Вам проще переопределить функции, по-моему так - function_menu_tree или есть еще в темплейтах menu-tree.tpl.php Поищите на друпал.орге или в апи.драпал.ру

Или если у вас Д6, поставьте Девел и включите Девел для темера, этот содуль выведет как и что можно переопределить.


Опубликовано ValBangMan в вс, 21/12/2008 - 12:26.

А можно подробнее про переопределение функций? Типа такого:
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) ?>

Что-нибудь по типу такой инструкции может кто-нибудь написать, только ПРАВИЛЬНОЙ, а не такой, как у меня от балды, чтобы только показать, какой она должна быть :)


Опубликовано hubba в пн, 22/12/2008 - 13:32.

Я делал так:
1) скопировал код функции menu_tree из системного файла и вставил код в файл template.php (в папке с темой)
2) в коде функции есть строки, отвечающие за обрамление тегами элементов меню. Вот эти строчик и правьте как вам угодно.


Опубликовано ValBangMan в пн, 22/12/2008 - 19:57.

В системном файле 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?>? Помогите, плз.


Опубликовано ValBangMan в вт, 23/12/2008 - 13:59.

В общем, понял, почему не изменялся вывод: просто нужно было выбрать другую тему пересохранить настройки и после опять выбрать мою и все гуд. Только не совсем....
Я для пробы способом, который предложил 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 вывожу меню так:

<?php if (isset($main_menu)) : ?>
  <?php print theme('menu_tree', $main_menu) ?>
<?php endif;

Походу получилось так, что темизации подверглась и сама переменная, в которой хранится содержимое региона, из-за этого и появились в начале и в конце тэги UL...В связи с этим появились 2 вопроса:
1. Какие функции отвечают за вывод дива <div id="block-menu-menu-main-menu" class="block block-menu"> в начале и заголовка моего меню, обрамленного тэгами <h2></h2>, они не нужны, как их убрать...?
2. С помощью какой функции друпал выводит содержимое регионов? (У меня мое меню с системным именем main-menu размещено в регионе main_menu)


Опубликовано ValBangMan в ср, 24/12/2008 - 07:01.

Решено! Просто в директории с темой созается файл block.tpl.php c таким содержимым:
<?php print $block->content ?> и левый див <div id="block-menu-menu-main-menu" class="block block-menu">убираются и меню выводится без него


Опубликовано iT в ср, 24/12/2008 - 11:33.

Круто. Спасибо за подробность и пути к файлам.
Эх, если бы все так подробно писали...


Опубликовано ValBangMan в ср, 24/12/2008 - 13:59.

Пожалуйста, просто сам разбираюсь с нуля вот и подумал, что многим будет интересно тоже, поэтому и делюсь подробно приобретенным опытом :)


Опубликовано Miklucho в сб, 28/02/2009 - 10:04.

Да уж, действительно спасибо, помогло здорово.
Кстати, если нужно темизировать вывод блоков только в одном регионе (в том числе в своем), то нужно это делать не в block.tpl.php, а нужно создать файл например block-header.tpl.php и в нем темизировать блоки выводящиеся в регион header.


Опубликовано Rizhaya@drupal.org в вс, 14/02/2010 - 15:29.

А есть ли возможность функции phptemplate_menu_tree и phptemplate_menu_item выполнять для какого-то отдельного меню, а не для всех?


Опубликовано tavriaforever@d... в чт, 29/07/2010 - 12:49.

Огромное спасибо за ответы, очень помогли!