Переопределение верстки меню на Друпал

Все таки странный народ эти товарищи с друпал.ру. Просто наверно они очень серьезные или не хотят конкурентов плодить, не знаю. Но я перелистал там дам 20 листов выдачи по тегу menu и нашел только один намек на то как просто связать переопределение функции темизации с конкретным меню. Вообщем пусть остается на их совести, но после долгих поисков я изобрел велосипед, о чем вам сейчас и расскажу.

Итак друпал по умолчанию выдает в блоке следующий код меню:

Что можно сказать? Да то что молодцы разработчики друпала. Не экономили они на классах, такой верстки меню практически на все случаи жизни должно хватить, особенно если делаешь сайт для себя любимого и все зависит от тебя. Но в реальности не все так гладко. Дизайнеру наплевать на ваш движок, он художник, верстальщику главное чтобы выглядело как надо, до еще и во всех браузерах было все ок. И тогда приходится встречаться с более экзотическими конструкциями, например:

Конечно, вы скажите, руки бы оторвать этому верстальщику) А я скажу вам, что художника может обидеть каждый. Уверяю вас, что у него тоже были объективные причины для написания такого кода, в любом случае проще доверится верстальщику и использвать уже то что есть, чем  переделывать все заново. Ну может теги поменять, все таки тег <b> конечно моветон, но смысл тот же, лишь семантичность улучшится. Ну ладно. Решаем использовать, а вот как. Если хорошо поглядеть и сравнить с кодом меню которые выдает друпал, то все можно подставить, кроме того что между тегами <li>. Тут нужно переопредлять функции темизации меню. А именно:

//file menu.inc
function theme_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
  return l($link['title'], $link['href'], $link['localized_options']); // вот выводится код ссылки
}

Переопределим его вот так:

//file phptemplate.php в вашей теме
function phptemplate_menu_item_link($link) {
$newlinkcode='';
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
 $newlinkcode=l(''.$link['title'].'', $link['href'], $link['localized_options']+array('html' => true)); // вот измененный код ссылки
  return $newlinkcode;
}

Сейчас думаю многим не интересно, потому как все что я написал выше есть во всех манулах и каждый сам до этого додумался. Но вот дальше появляется проблема. Делом в том что наше переопределение будет использовано во всех выводах меню в блоках. А это скорее все нам не нужно.  Как от этого избавится? В этом месте настоящие друпаловоды будут надо мной смеятся, мол такие проблемы могут возникнуть только у зеленых чайников которые PHP второй раз в жизни видят. Но я думаю не стоит им так зазнаваться. Я бы не стал на их месте их себя гуру сторить. Молодые люди – PHP простой язык, скромнее надо быть. Да и вообще, такие проблемы возникают у новичков просто из за не умения работать с дурпалом и минимальным инструментарием для него. Так, отступили от темы, возвращаемся.

Итак, очевидно, что нам нужно сделать нашу функцию переопределения более умной, чтобы она меняла вывод меню в засимости от того с каким меню она работает. Для этого нужно научиться изучать исходные данные в фукциях. Для этого хорошо использовать функцию print_r. Изменим нашу функцию, сохраняем, очищаем кеш, для этого можно зайти в админку где блоки или темы, и смотрим на результат распечатки, для этого удобнее нажать в браузере ctrl+U.

//file phptemplate.php в вашей теме
function phptemplate_menu_item_link($link) {
print_r($link); // распечатает массив в удобном для изучения виде
$newlinkcode='';
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }
 $newlinkcode=l(''.$link['title'].'', $link['href'], $link['localized_options']+array('html' => true)); // вот измененный код ссылки
  return $newlinkcode;
}

Теперь мы видим распечатку содержимого массива $link, у нас появится столько экземпляров распечатки, сколько есть ссылок в ваших блоках с менюшками. Как видите, очень богатый у нас массив то оказывается, и чего в нем только нету. В данном случае нас интересует элемент [menu_name] => menu-mymenu, как видите он и указывает на принадлежность ссылки конкретному меню, дальше дело техники;) Пробуйте сами. Главное не забывает обновлять кеш друпала. Делайте пометки с помощь например оператора echo, чтобы точно быть уверенным что вы видите измененную версию, а то всякое бывает)
Кстати, если я гдето не прав, буду благодарен за замечания, я только учусь)

Одна мысль по поводу записи “Переопределение верстки меню на Друпал

Оставить комментарий

Почта (не публикуется) Обязательные поля помечены *

Вы можете использовать эти HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>