【问题标题】:Yii CMenu active item not being setYii CMenu 活动项目未设置
【发布时间】:2012-07-09 00:02:29
【问题描述】:

我正在使用 Yii 的 CMenu 以如下方式生成菜单:

$this->widget('zii.widgets.CMenu', array(
        'items'=>$this->mainMenu,
        'lastItemCssClass'=>'mitem-last',
        'activeCssClass'=>'mitem-active',
        'activateParents'=>true
));

我正在页面 index.php?r=site/home 上显示此菜单,并希望以下菜单项具有 mitem-active 类:

[2] => Array
(
    [label] => test
    [url] => /index.php?r=site/home
)

但是该项目呈现为

<li><a href="/index.php?r=site/home">test</a></li>

如果我没记错的话index.php?r=site/home 有路由site/home(这也是$this-&gt;route 的输出),事实上链接是使用创建的

$link['url']=$this->createUrl(current($mitem['url']),$params);

其中current($mitem['url']) 输出site/home$params 只是array()

我错过了什么吗?

编辑: $this-&gt;mainMenu 是一个由多个 $links 组成的数组,这些 $links 内置在一个循环中(来自 xml)。

$this->mainMenu = array();
foreach($xml->mitem as $mitem){
    $link=array();

    ... compute some values like $link['label'], $params etc ...
    $link['url']=$this->createUrl(current($mitem['url']),$params);
    $this->mainMenu[]=$link;
}

【问题讨论】:

    标签: php yii


    【解决方案1】:

    对于CMenu,“items”数组格式为:

    array(
        array('label'=>'Home', 'url'=>array('site/index')),
        array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
        array('label'=>'Contact', 'url'=>array('/site/contact')),
    )
    

    不是

    array(
        array('label'=>'Home', 'url'=>'index.php?r=site/index'),
        array('label'=>'About', 'url'=>'index.php?r=site/page&page=about'),
        array('label'=>'Contact', 'url'=>'index.php?r=site/contact'),
    )
    

    如果您的商品如下所示:

    array('label'=>'Home', 'url'=>'index.php?r=site/home'),
    

    它不起作用。 您的商品必须是这样的:

    array('label'=>'Home', 'url'=>array('site/home')),
    

    【讨论】:

    • 完全正确 - 抱歉,我没有很好地提出这个问题 - 数组的格式是正确的,链接显示正确,带有正确的 href 和标签,只是不正确的类。我已经更新了我的问题,以更详细地解释数组是如何生成的。
    • 其实items中的'url'可以是字符串也可以是数组:yiiframework.com/doc/api/1.1/CMenu#items-detail
    • 是的@ernie,你是对的。但是查看第 #282 行 if($this-&gt;activateParents &amp;&amp; $hasActiveChild || $this-&gt;activateItems &amp;&amp; $this-&gt;isItemActive($item,$route)) $active=$items[$i]['active']=true; 上的 CMenu::normalizeLinks 方法,然后查看第 303 行的 CMenu::activateItems 方法,你会看到这个:if(isset($item['url']) &amp;&amp; is_array($item['url']) &amp;&amp; !strcasecmp(trim($item['url'][0],'/'),$route))。你看到这个条件了吗?:&& is_array($item['url'])
    • 如果您想从字符串“url”参数设置活动链接,您必须扩展类“CMenu”并重新定义方法CMenu::activateItems
    • 有趣。 . .奇怪的是文档建议您可以使用字符串或数组,但对于 CMenu::activateItems,它必须是数组。 . .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2021-11-28
    • 1970-01-01
    • 2010-11-17
    • 2017-01-09
    相关资源
    最近更新 更多