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

Php Yii如何突出显示当前菜单项,php,frameworks,yii,Php,Frameworks,Yii,我使用以下代码来显示菜单项 默认情况下,此处应激活“主页”链接。所以我用了密码 active'=>$this->id=='default'?真:假 $this->widget('zii.widgets.CMenu',array( 'linkLabelWrapper' => 'span', 'items'=>array( array('label'=>'Home', 'url'=>array('post/index'),'active'=&g

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

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

active'=>$this->id=='default'?真:假

$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)
    ),
    )); 
我参考了网址
但我不知道如何使用这些参数。请帮助

您给出的代码通常会在一个文件中找到。视图的文档声明:

在视图脚本中,我们可以使用
$this
。因此,我们可以通过 在视图中评估
$this->propertyName

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

记住所有这些,您现在可以知道,当且仅当当前视图是从名为
DefaultController
的控制器内部渲染时,
active
将是
true
。但是,从该菜单项的
url
属性中,我们可以看到该操作的关联控制器(假设默认路由)是
PostController
。所以
$this->id==“default”
的想法是错误的


如果您想在
PostController
中的任何操作运行时激活“Home”项,则应将其更改为
$this->id==“post”
。通常不需要这样做,因为与默认路由一起使用的
activateItems
属性(默认为
true
)将同时考虑控制器id和当前操作,以确定要激活的菜单项。

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

如果您有一些高级链接结构,请将下面的方法放在控制器中

/**
 * 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',        
    )),    
),
不是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");
    } 
});
我用这种方式:

array('label'=>'Contact', 'url'=>array('site/contact'), 'active'=>strpos(Yii::app()->request->requestUri, Yii::app()->createUrl('site/contact'))===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'])],
]
]);

以文件yiisoft/yii2 boostrap/nav.php函数renderItem()为基础:

和修改链接的$linkOption上的$option

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

因此,活动类将被添加到.class,而不是li.class

默认情况下,活动项处于启用状态。您是否检查了HTML中的
class=“active”
?即使
'active'=>$this->id=='default'?true:false
从项目中删除?是的,我检查了html,class=“active”未显示编辑在我的网站上正常工作,无需专门设置active属性。您可以查看activateParent属性(我完全忘记了它的名称)。你是否在某些子页面上变得活跃,但不是全部?
Html::addCssClass($linkOptions, 'active');