Yii如何突出显示当前菜单项

时间:2012-03-21 10:26:26

标签: php frameworks yii

我使用以下代码显示菜单项。

默认情况下,应激活“主页”链接。所以我使用了代码

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)
    ),
    )); 

我提到了网址http://www.yiiframework.com/doc/api/1.1/CMenu#activateItems-detail 但我不知道如何使用这些参数。请帮忙

7 个答案:

答案 0 :(得分:6)

不是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");
    } 
});

答案 1 :(得分:3)

您提供的代码通常位于view内。视图文档说明了

  

在视图脚本中,我们可以使用访问控制器实例   $this。因此,我们可以提取控制器的任何属性   评估视图中的$this->propertyName

因此,我们已经确定在当前上下文中,$this->id引用CController::id属性。此id通常是控制器类名的前缀。例如,在MyController内,您将拥有$this->id == "my"

考虑到所有这些,您现在可以告诉active当{且仅当前视图是从名为true的控制器内呈现时DefaultController。但是,从该菜单项的url属性中,我们看到该操作的相关控制器(假设默认路由)为PostController。所以$this->id == "default"的想法是错误的。

如果您希望在PostController中的任何操作正在运行时激活“主页”项,则应将其更改为$this->id == "post"。通常没有必要这样做,因为默认路由使用的activateItems属性(默认为true)将考虑控制器ID 当前确定要激活哪个菜单项的操作。

答案 2 :(得分:3)

如果您有一些高级链接结构,请将方法放在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 :(得分:2)

我用这种方式:

array('label'=>'Contact', 'url'=>array('site/contact'), 'active'=>strpos(Yii::app()->request->requestUri, Yii::app()->createUrl('site/contact'))===0)

答案 4 :(得分:0)

菜单将起作用,因为我们使用默认页面作为站点/联系人,站点/登录 但很多时候它对模块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

所以,我们可以有问题来美化网址..

答案 5 :(得分:0)

对于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'])],
]
]);

答案 6 :(得分:0)

以文件为基础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上的$ option以获取链接。

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

结果,活动类将被添加到a.class,而不是li.class