[решено] Как сделать активной ссылку в меню в зависимости от url?

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

Комментарии

Аватар пользователя dudin.ie dudin.ie 12 августа 2009 в 12:33

Вот, нашел на drupal.org в теме http://drupal.org/node/352157 такое решение для шестерки:

<?php
/**
* Selects the parent item if it's in the url
*/
function yourtheme_activelink($links) {
        
$segments explode('/'drupal_get_path_alias($_GET['q']));
        
$parent strtolower($segments[0]);
        foreach (
$links as $key => $link) {
                if (
drupal_get_path_alias($link['href']) == $parent) {
                         
$links[$key]['attributes']['class'] = 'active';
                         break;
                }
        }
        return 
$links;
}
?>

Но не могу заставить ЭТО работать у себя *(

Аватар пользователя kosilko kosilko 12 августа 2009 в 12:40

попробуйте этот код

<?php
function phptemplate_menu_item_link($link) {

    static 

$aliases = array();
    if ((
strpos($_GET['q'],$link['href'].'/')===0)) {
        
$link['localized_options']['attributes']['class']=isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].'parent' 'parent';
    }
    else {
        if (!isset(
$aliases[$link['href']])) {
            
$aliases[$link['href']] = url($link['href']));
            }
            if ((
strpos($_GET['q'],$aliases[$link['href']].'/')===0) || ($_SERVER['REQUEST_URI'] != $aliases[$link['href']] && strpos($_SERVER['REQUEST_URI'],$aliases[$link['href']].'/')===0)) {
                
$link['localized_options']['attributes']['class'] = isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].' parent':'parent';
            }
        }

        return 

theme_menu_item_link($link);
    }

?>

присваивает доп. класс "parent" для ссылок, имеющих урл "над" текущим

Аватар пользователя sk2 sk2 12 августа 2009 в 13:33

kosilko wrote:
попробуйте этот код

<?php
function phptemplate_menu_item_link($link) {

    static 

$aliases = array();
    if ((
strpos($_GET['q'],$link['href'].'/')===0)) {
        
$link['localized_options']['attributes']['class']=isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].'parent' 'parent';
    }
    else {
        if (!isset(
$aliases[$link['href']])) {
            
$aliases[$link['href']] = url($link['href']));
            }
            if ((
strpos($_GET['q'],$aliases[$link['href']].'/')===0) || ($_SERVER['REQUEST_URI'] != $aliases[$link['href']] && strpos($_SERVER['REQUEST_URI'],$aliases[$link['href']].'/')===0)) {
                
$link['localized_options']['attributes']['class'] = isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].' parent':'parent';
            }
        }

        return 

theme_menu_item_link($link);
    }

?>

присваивает доп. класс "parent" для ссылок, имеющих урл "над" текущим

А можно его переделать, чтобы он присваивал класс не ссылке <~a href="" class="parent"~> а списку <~li class="parent"~>

было бы просто супер.

зы. код полезный.

Аватар пользователя dudin.ie dudin.ie 12 августа 2009 в 14:27

Ура! Все работает!!!
kosilko, спасибо тебе, ты настоящий друг, спустя 5 часов мои мучения закончились только благодаря тебе!
Наконец можно идти на обед ))

Аватар пользователя kosilko kosilko 12 августа 2009 в 15:53

да не зашт -)

"sk2" wrote:
А можно его переделать, чтобы он присваивал класс не ссылке <~a href="" class="parent"~> а списку <~li class="parent"~>

Это уже не переделывать придется, а писать новый для перекрытия theme_menu_item, а в этом коде идет работа только с тэгом <a>. Ну а вообще, если мы заходим в подменю, то родительский пункт имеет класс "expanded active-trail", я не совсем понял смысл зачем присваивать еще и "parent"

Аватар пользователя dudin.ie dudin.ie 12 августа 2009 в 17:05

Страницы с адресами типа http://mysitename.ru/news/.../.. не являются у меня подменю раздела НОВОСТИ.
Это просто ноды типа материала NEWS.

Кроме того я исползую nice menus. Для этого модуля класс "expanded active-trail" вроде бы не актуален.
А вот ваш метод - то что надо! Уже все настроил, получилось, как по задумке.
Двигаюсь дальше к поставленной цели ))

Аватар пользователя maxroso maxroso 17 сентября 2009 в 13:56

dudin.ie мне необходимо решить подобную задачу и я использую nice menus, но не получается использовать этот код. Не могли бы вы разъяснить поподробней как использовали этот код.
Заранее благодарен.

Аватар пользователя dudin.ie dudin.ie 18 сентября 2009 в 20:51

Код от kosilko без изменений вставляется в themeplate.php вашей темы.
Чистите кэш.
После этого на всех страницах с адресом http://mysitename.ru/news/.../.. пункт меню НОВОСТИ приобретает class="parent". Да, именно parrent, а не active.
Вот с этим то классом parent вы дальше и работаете.

Успехов!

Аватар пользователя boratiche boratiche 15 февраля 2011 в 17:42

у меня таким же образом нужно сделать активным меню. Использую secondary links.
После вставки данного кода в themeplate.php и очистки кеша, не добавляется к ссылке класс parrent

Аватар пользователя Enemy Enemy 3 июня 2011 в 15:56

"kosilko" wrote:
<?php
function phptemplate_menu_item_link($link) {

static $aliases = array();
if ((strpos($_GET['q'],$link['href'].'/')===0)) {
$link['localized_options']['attributes']['class']=isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].'parent' : 'parent';
}
else {
if (!isset($aliases[$link['href']])) {
$aliases[$link['href']] = url($link['href']);
}
if ((strpos($_GET['q'],$aliases[$link['href']].'/')===0) || ($_SERVER['REQUEST_URI'] != $aliases[$link['href']] && strpos($_SERVER['REQUEST_URI'],$aliases[$link['href']].'/')===0)) {
$link['localized_options']['attributes']['class'] = isset($link['localized_options']['attributes']['class']) ? $link['localized_options']['attributes']['class'].' parent':'parent';
}
}

return theme_menu_item_link($link);
}

?>


лишняя скобка тут: $aliases[$link['href']] = url($link['href']));
код правильный выше

Аватар пользователя 0legka 0legka 23 марта 2012 в 12:38

"dudin.ie" wrote:
<?php
/**
* Selects the parent item if it's in the url
*/
function yourtheme_activelink($links) {
        $segments = explode('/', drupal_get_path_alias($_GET['q']));
        $parent = strtolower($segments[0]);
        foreach ($links as $key => $link) {
                if (drupal_get_path_alias($link['href']) == $parent) {
                         $links[$key]['attributes']['class'] = 'active';
                         break;
                }
        }
        return $links;
}
?>

прекрасно работает, только не забывайте менять "yourtheme" на "ваша тема" добавляет класс active к активному пункту меню ) с ним и работаем... не получилось только "проследить" до активного пункта типа вот так
111111111
-1222222222
-1333333333
-1444444444
--2222222222
--2333333333
--2444444444
222222222
333333333
если кто поможет буду очень признателен !!

Аватар пользователя Andrey116116 Andrey116116 29 января 2014 в 0:49

"0legka" wrote:
<?php
/**
* Selects the parent item if it's in the url
*/
function yourtheme_activelink($links) {
$segments = explode('/', drupal_get_path_alias($_GET['q']));
$parent = strtolower($segments[0]);
foreach ($links as $key => $link) {
if (drupal_get_path_alias($link['href']) == $parent) {
$links[$key]['attributes']['class'] = 'active';
break;
}
}
return $links;
}
?>

а в какой файл нужно добавлять этот код?