Задача
Часто приходит в голову мысль заняться выводом меню Primary Link (Главного) и Secondary Link (Вторичного) самостоятельно, используя специфическое оформление. При выборе пункта из Главного меню возвращается подменю (Вторичное) и выбранный пункт подсвечивается как активный. Если же выбрать пункт вторичного меню, подсветка пункта-родителя в Главном меню снимается. Требуется подсвечивать и родительский пункт меню.
Решение
Предпримем следующие шаги:
1. Добавим функцию в template.php, дав ей произвольное имя.
2. Скопируем код функции theme_links() из theme.inc и вставим его без изменений.
3. Мы назовем функцию phptemplate_generatexyz_primarylinks(). Новые строки, добавленные нами, выделены.
<?php
function phptemplate_generatexyz_primarylinks($links, $attributes = array('class' => 'links'))
{
$output = '';
if (
count($links) > 0) {
$output = '<ul'. drupal_attributes($attributes) .'>';
$num_links = count($links);
$i = 1;
foreach (
$links as $key => $link) {
$class = '';
// Автоматически добавляем класс каждому линку и элементу LI
if (isset($link['attributes']) && isset($link['attributes']['class'])) {
$link['attributes']['class'] .= ' ' . $key;
$class = $key;
}
else {
$link['attributes']['class'] = $key;
$class = $key;
}
?>
Новые строки:
..................................................................
<?php
$explode_array = explode('-',$link['attributes']['class']);
if(count($explode_array)== 5)
{
array_push($explode_array,'active');
$link['attributes']['class'] = implode('-',$explode_array);
$pos = strrpos($link['attributes']['class'], "-");
$link['attributes']['class'] = substr_replace($link['attributes']['class'], ' ', $pos, -6);
}
?>
..................................................................
<?php
// Добавим классы first и last списку ссылок в помощь нашим темизаторам.
$extra_class = '';
if ($i == 1) {
$extra_class .= 'first ';
}
if ($i == $num_links) {
$extra_class .= 'last ';
}
$output .= '<li class="'. $extra_class . $class .'">';
// Тут HTML?
$html = isset($link['html']) && $link['html'];
// Инициируем переменные fragment и query.
$link['query'] = isset($link['query']) ? $link['query'] : NULL;
$link['fragment'] = isset($link['fragment']) ? $link['fragment'] : NULL;
if (isset(
$link['href'])) {
$output .= l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment'], FALSE, $html);
}
else if ($link['title']) {
// Некоторые ссылки на самом деле не ссылки, но мы заключим их в контенйер <span>
if (!$html) {
$link['title'] = check_plain($link['title']);
}
$output .= '<span'. drupal_attributes($link['attributes']) .'>'. $link['title'] .'</span>';
}
$i++;
$output .= "</li>\n";
}
$output .= '</ul>';
}
return
$output;
}
?>
4. Изменим page.tpl.php. После кода
<?php
if (isset($primary_links)) :
?>
Вставим следующее:
<?php
print phptemplate_generatexyz_primarylinks($primary_links, array('class' => 'links primary-links'));
?>
И закомментируем старый вывод Меню:
<?php
//print theme('links', $primary_links, array('class' => 'links primary-links'));
?>
И, о чудо, никаких пятен! Пункты Главного (primary links) меню теперь подсвечиваются, кода мы выбираем подпункт Вторичного меню.
Автор решения: sivarajan
Оригинал: Need to highlight primary link when secondary link is selected
Комментарии
Зачем усы сбрил...
Сначала не признал.
Это далеко не самое лучшее решение. Как минимум потому, что вот такие вызовы print phptemplate_generatexyz_primarylinks никаким образом нельзя перекрыть. Странно что вы не нашли решение получше, оно там было в двух шагах. А именно:
/// Active menu links fix
function phptemplate_menu_links($links, $attributes = array()) {
if (!count($links)) {
return '';
}
$level_tmp = explode('-', key($links));
$level = $level_tmp[0];
$output = "<ul class=\"links-$level ".$attributes['class']. "\">\n";
foreach ($links as $index => $link) {
$output .= '<li';
if (stristr($index, 'active')) {
$output .= ' class="active"';
$link['attributes']['class'] = 'active';//add class active to <li
}// frontpage AND current-link in menu is <front>
elseif((drupal_is_front_page()) && ($link['href']=='<front>')){
$link['attributes']['class'] = 'active';//add class active to <li
$output .= ' class="active"';//add class active to <a
}
$output .= ">". l($link['title'], $link['href'], $link['attributes'], $link['query'], $link['fragment']) ."</li>\n";
}
$output .= '</ul>';
return $output;
}
<?php print theme('menu_links', $primary_links, array('class' => 'links primary-links')) ?>
<?php print theme('menu_links', $secondary_links, array('class' => 'links secondary-links')) ?>
Данное решение основано на том, что активные пункты меню помечаются классом active, что касается и родительских пунктов тоже.
Спасибо, Друг!
Чтобы получить то, что нужно от тебя, стоило перевести нелучшее решение