Здравствуйте!
У меня такая ситуация - на сайте должны быть 3 разных меню (может, и еще будут), вывод которых нужно переопределить.
Первые два я переоперделил из имевшихся системных меню. В template.php написал:
<?php
function mytem_preprocess_page(&$variables) {
if (isset($variables['main_menu'])) {
$variables['pervoe_nav'] = theme('links__system_main_menu', array(
'links' => $variables['main_menu'],
'attributes' => array(
'id' => 'myfirtsmenu'
)
));
}
else {
$variables['primary_nav'] = FALSE;
}
if (isset($variables['secondary_menu'])) {
$variables['vtoroe_nav'] = theme('links__system_secondary_menu', array(
'links' => $variables['secondary_menu'],
'attributes' => array(
'id' => 'mysecmenu'
)
));
}
else {
$variables['vtoroe_nav'] = FALSE;
}
}?>
И после этого в шаблоне страницы стало удобно выводить меню, печатая: <?php print $pervoe_nav; ?> и <?php print $vtoroe_nav; ?>.
Однако, когда я захотел также сделать третье меню, то понял, что системных меню, которых можно переопределить, больше не осталось.
Тогда, я через админку создал еще одно меню и дал ему системное имя "menu-mytretemenu".
Потом, нашел, где в файле menu.inc определяются переменные main_menu и secondary_menu.
Нашел вот этот кусок:
<?php/**
* Return an array of links to be rendered as the Main menu.
*/
function menu_main_menu() {
return menu_navigation_links(variable_get('menu_main_links_source', 'main-menu'));
}
/**
* Return an array of links to be rendered as the Secondary links.
*/
function menu_secondary_menu() {
return menu_navigation_links(variable_get('menu_secondary_links_source', 'user-menu'), 0);
}
}?>
Тогда, я скопировал его в template.php и по аналогии создал переменную. А после этого переопделеил эту переменную, по аналогии с первыми двумя меню:
<?php
/**
* Return an array of links to be rendered as the Tretye menu.
*/
function menu_third_menu() {
return menu_navigation_links(variable_get('menu_third_links_source', 'menu-mytretemenu'));
}
function
mytem_preprocess_page(&$variables) {
if (isset($variables['main_menu'])) {
$variables['pervoe_nav'] = theme('links__system_main_menu', array(
'links' => $variables['main_menu'],
'attributes' => array(
'id' => 'myfirtsmenu'
)
));
}
else {
$variables['primary_nav'] = FALSE;
}
if (isset($variables['secondary_menu'])) {
$variables['vtoroe_nav'] = theme('links__system_secondary_menu', array(
'links' => $variables['secondary_menu'],
'attributes' => array(
'id' => 'mysecmenu'
)
));
}
else {
$variables['vtoroe_nav'] = FALSE;
}
if (isset($variables['third_menu'])) {
$variables['tretye_nav'] = theme('links__system_third_menu', array(
'links' => $variables['third_menu'],
'attributes' => array(
'id' => 'mythirdmenu'
)
));
}
else {
$variables['tretye_nav'] = FALSE;
}
}
?>
Но что-то не работает это в итоге.. Пытаюсь выводить в шаблоне - <?php print $tretye_nav; ?> - ничего не выводится.. Может, где-то вкралась ошибочка, подскажите, пожалуйста?
Комментарии
В template.php переопределяется только темизация.
Смысла делать подобную картину не вижу, ибо меню можно вывести где угодно в теме и без использования всяких лишних хуков
Смотрите в сторону функции theme()
посмотрел я часик в сторону функции theme()
искал сначала на drupal.org, но что-то ничего толкового не нашел..
потом искал в гугле, в итоге нашел вот это:
http://api.drupal.ru/api/function/theme/6
почитал, но что-то так и не понял, как с помощью него создать свое меню, котрое можно будет также просто выводить, типа: <?php print $tretye_nav; ?>
и чтобы меню в хтмл выводилось как
<ul id="myfirtsmenu">
, как первые два у меня, а не<ul class="menu">
, как если через админку через блок выводитьВот http://api.drupal.org/api/drupal/includes%21theme.inc/function/theme/7
Но крайне рекомендую вникнуть еще и в
http://api.drupal.org/api/drupal/modules%21system%21theme.api.php/group/...
А вообще вы ерундой занимаетесь, вы можете вывести само меню(абсолютно любое прямо в теме). Для вашего способа придется писать никому на фиг не нужный модуль, а потом вызывать этот модуль в теме, т.е. по сути тоже самое, только в извращенной форме. Если уж так надо сделать возможность смены 3го меню - реализуйте это в самой теме через настройки темы.
Вообще темизация ничего не создает, а лишь выводит, чтобы стало яснее посмотрите потом еще на theme_menu если не перепутал, чтобы узнать какие аргументы передать функции theme
уфф.. да уж, я сам не рад, что все это затеял..
мне всего-то и хотелось создать стандартным способом меню, вывести его через блок в нужном регионе, и придать ему вид на свой вкус с помощью css.
И практически все получается, но вот только, как я писал выше, drupal любому создаваемому меню присваивает класс
<ul class="menu">
, а изменить этот класс через admin/structure/menu/manage/menu-vtoroemenu/edit нельзя, там вообще ничего нельзя изменить, только машинное имя при создании. А это имя появляется только в диве, в котором выводится меню:<div id="block-menu-menu-vtoroemenu" class="block block-menu contextual-links-region">
А класс у меню остается неизменным - menu, а каждому пункты к тому же присваивается класс вроде class="first leaf"..
Можно, конечно, через этот див задать стили, вот так например:
#block-menu-menu-vtoroemenu ul li {}
Но тогда этот стиль накладывается на ВСЕ меню в этом диве, в частности, и на админские
<ul class="contextual-links"><li class="menu-list first"><a href="/admin/structure/menu/manage/menu-third-menu/list?destination=node">Список ссылок</a></li>
что выглядит некрасиво, да и как-то неправильно..И, помимо всего прочего, у этого стандартного меню, всегда есть заголовок, которой нельзя не вводить и нельзя убрать (тоже бред, что друпале через админскую панель нельзя отключить вывод заголовка, что у меню, что у ноды).
И в итоге, ничего не добившись через админку и цсс, я полез в template.php и menu.inc
Саму функцию вывода меню можно как раз таки переопределить в template.php, т.е. кладете в этот файл нужную функцию(в оригинальном виде, ибо обычно требуется переопределить частично, либо добавить альтернативный вывод на основе входных данных или еще чего), переименовываете название функции и в зависимости от входных данных переопределяете вывод. В итоге сможете выводить абсолютно любое нужное вам меню в любых контейнерах, т.е. хоть в таблице, естественно вывод этого меню будет проходить через вашу функцию во всех местах, где будет вызвано theme('menu',...). Это и есть система хуков темизации.
Чем именно class="menu" не устраивает? Можно же в theme() добавить свой класс, и через него переопределить стили в самом CSS