Переопределение третьего меню

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

Аватар пользователя dangler dangler 7 сентября 2012 в 21:16

Здравствуйте!

У меня такая ситуация - на сайте должны быть 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; ?> - ничего не выводится.. Может, где-то вкралась ошибочка, подскажите, пожалуйста?

Комментарии

Аватар пользователя sg85 sg85 7 сентября 2012 в 21:30

В template.php переопределяется только темизация.
Смысла делать подобную картину не вижу, ибо меню можно вывести где угодно в теме и без использования всяких лишних хуков
Смотрите в сторону функции theme()

Аватар пользователя dangler dangler 7 сентября 2012 в 22:21

посмотрел я часик в сторону функции theme()

искал сначала на drupal.org, но что-то ничего толкового не нашел..
потом искал в гугле, в итоге нашел вот это:
http://api.drupal.ru/api/function/theme/6

почитал, но что-то так и не понял, как с помощью него создать свое меню, котрое можно будет также просто выводить, типа: <?php print $tretye_nav; ?>
и чтобы меню в хтмл выводилось как <ul id="myfirtsmenu">, как первые два у меня, а не <ul class="menu">, как если через админку через блок выводить

Аватар пользователя sg85 sg85 8 сентября 2012 в 10:51

Вот 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

Аватар пользователя dangler dangler 8 сентября 2012 в 11:51

уфф.. да уж, я сам не рад, что все это затеял..

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

Аватар пользователя sg85 sg85 8 сентября 2012 в 16:00

Саму функцию вывода меню можно как раз таки переопределить в template.php, т.е. кладете в этот файл нужную функцию(в оригинальном виде, ибо обычно требуется переопределить частично, либо добавить альтернативный вывод на основе входных данных или еще чего), переименовываете название функции и в зависимости от входных данных переопределяете вывод. В итоге сможете выводить абсолютно любое нужное вам меню в любых контейнерах, т.е. хоть в таблице, естественно вывод этого меню будет проходить через вашу функцию во всех местах, где будет вызвано theme('menu',...). Это и есть система хуков темизации.

Чем именно class="menu" не устраивает? Можно же в theme() добавить свой класс, и через него переопределить стили в самом CSS