Yii, как выделить текущий пункт меню - PullRequest
2 голосов
/ 21 марта 2012

Я использовал следующий код для отображения пунктов меню.

Здесь по умолчанию ссылка «Домой» должна быть активирована. Так что я использовал код

active' => $this->id =='default' ? true : false

$this->widget('zii.widgets.CMenu',array(
     'linkLabelWrapper' => 'span',
    'items'=>array(
    array('label'=>'Home', 'url'=>array('post/index'),'active'=>$this->id=='default'?true:false),
    array('label'=>'About', 'url'=>array('site/page', 'view'=>'about'),'active'=>$this->id=='about'?true:false),
    array('label'=>'Test', 'url'=>array('site/page', 'view'=>'test')),
    array('label'=>'Contact', 'url'=>array('site/contact')),
    array('label'=>'Login', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),
    array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('site/logout'), 'visible'=>!Yii::app()->user->isGuest)
    ),
    )); 

Я ссылался на URL http://www.yiiframework.com/doc/api/1.1/CMenu#activateItems-detail Но я не знаю, как использовать эти параметры. Пожалуйста, помогите

Ответы [ 7 ]

6 голосов
/ 24 марта 2013

Не способ Yii, а (более простой) способ jQuery:

// find menu-item associated with this page and make current:
$('a').each(function(index, value) { 
    if ($(this).prop("href") === window.location.href) {
        $(this).addClass("current-page");
    } 
});
3 голосов
/ 22 февраля 2013

если у вас есть какая-то продвинутая структура ссылок, поместите метод ниже в Controller

/**
 * Checks if the current route matches with given routes
 * @param array $routes
 * @return bool
 */
public function isActive($routes = array())
{
    $routeCurrent = '';
    if ($this->module !== null) {
        $routeCurrent .= sprintf('%s/', $this->module->id);
    }
    $routeCurrent .= sprintf('%s/%s', $this->id, $this->action->id);
    foreach ($routes as $route) {
        $pattern = sprintf('~%s~', preg_quote($route));
        if (preg_match($pattern, $routeCurrent)) {
            return true;
        }
    }
    return false;
}

//usage
'items'=>array(
    array('label'=>'Some Label', 'url'=>array('some/route'),'active'=>$this->isActive(array(
        'some/route',
        'another/route',        
    )),    
),
3 голосов
/ 21 марта 2012

Код, который вы даете, обычно находится внутри представления .В документации по представлению говорится, что

Внутри скрипта представления мы можем получить доступ к экземпляру контроллера, используя $this.Таким образом, мы можем получить любое свойство контроллера, оценив $this->propertyName в представлении.

Итак, мы установили, что в текущем контексте $this->id относится к CController::id собственность.Этот идентификатор обычно будет префиксом имени класса вашего контроллера.Например, внутри MyController у вас будет $this->id == "my".

Имея все это в виду, теперь вы можете сказать, что active будет true тогда и только тогда, когда текущий вид будет отображен изнутри.контроллер с именем DefaultController.Однако из свойства url этого пункта меню мы видим, что соответствующий контроллер для этого действия (при условии маршрутизации по умолчанию) равен PostController.Таким образом, идея $this->id == "default" ошибочна.

Если вы хотите, чтобы элемент «Домой» был активным всякий раз, когда любое действие в вашем PostController выполняется, вы должны изменить его на $this->id == "post".Обычно в этом нет необходимости, поскольку свойство activateItems (по умолчанию true), используемое при маршрутизации по умолчанию, будет учитывать как идентификатор контроллера , так и текущее действие, чтобы определить, какое менюпункт, чтобы сделать активным.

2 голосов
/ 09 февраля 2014

Я использовал так:

array('label'=>'Contact', 'url'=>array('site/contact'), 'active'=>strpos(Yii::app()->request->requestUri, Yii::app()->createUrl('site/contact'))===0)
0 голосов
/ 26 апреля 2017

Взять за основу файл yiisoft / yii2-boostrap / nav.php с функцией renderItem ():

...
if ($this->activateItems && $active) {
    Html::addCssClass($options, 'active');
}       
return Html::tag('li', Html::a($label, $url, $linkOptions) . $items, $options);

И измените параметр $ в $ linkOption для ссылки.

Html::addCssClass($linkOptions, 'active');

В результате активный класс будет добавлен в a.class, вместо li.class

0 голосов
/ 14 апреля 2016

Для yiistarterkit просто добавьте этот код в файл _base.php:

function isActive($routes = array())
{
    if (Yii::$app->requestedRoute == "" && count($routes) == 0){
        return true;
    }
    $routeCurrent = Yii::$app->requestedRoute;
    foreach ($routes as $route) {
        $pattern = sprintf('~%s~', preg_quote($route));
        if (preg_match($pattern, $routeCurrent)) {
            return true;
        }
    }
    return false;
}

А затем используйте:

echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-left'],
'items' => [
    ['label' => \Yii::t('frontend', 'Home'), 'url' => ['/'], 'active'=>isActive()],
    ['label' => \Yii::t('frontend', 'Services'), 'url' => ['/services'], 'active'=>isActive(['services'])],
]
]);
0 голосов
/ 06 декабря 2012

Меню будет работать, поскольку мы используем страницы по умолчанию в качестве сайта / контакта, сайта / входа в систему, но много раз оно не будет работать для URL модуля.

предположим, у меня есть пользователь модуля, и у меня было действие входа в систему при входе в системуконтроллер, так что я могу сделать ниже вещь меню формы, как то, как пункт меню становится активным, определено ниже.

array('label'=>Yii::t('frontend','Login'), 'url'=>array('/user/login/login'), 'visible'=>Yii::app()->user->isGuest), // Working, Login tag activated on login page

array('label'=>Yii::t('frontend','Login'), 'url'=>array('/user/login'), 'visible'=>Yii::app()->user->isGuest), // Not working, Login tag not activated on login page

Таким образом, у нас может быть проблема, чтобы украсить URL ..

...