我使用以下代码显示菜单项。
默认情况下,应激活“主页”链接。所以我使用了代码
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 但我不知道如何使用这些参数。请帮忙
答案 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