Подсветка активных пунктов Primary Link при выборе пункта из Secondary Link

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

Аватар пользователя Химический Али Химический Али 23 апреля 2008 в 11:46

Задача

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

Smile

Автор решения: sivarajan
Оригинал: Need to highlight primary link when secondary link is selected

Комментарии

Аватар пользователя neochief neochief 23 апреля 2008 в 12:36

Это далеко не самое лучшее решение. Как минимум потому, что вот такие вызовы print phptemplate_generatexyz_primarylinks никаким образом нельзя перекрыть. Странно что вы не нашли решение получше, оно там было в двух шагах. А именно:

//template.php

/// 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;
}

//page.tpl.php

<?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, что касается и родительских пунктов тоже.