2

我在 Yii 中整理了一个菜单(我第一个使用它的项目),如下所示:

$this->widget('zii.widgets.CMenu',array(
    'items'=>array(
        array('label'=>'Home', 'url'=>array('/')),
        array('label'=>'Examples', 'url'=>array('/examples')),
        array('label'=>'Contact', 'url'=>array('/contact')),
        array('label'=>'FAQ', 'url'=>array('/faq')),
        array('label'=>'Blog', 'url'=>array('/blog')),
        array('label'=>'Order', 'url'=>array('/order')),
    ),
));

这些 URL 路径中的每一个,例如/examples都是在我的配置中定义的路由,因此它看起来不像site/examples

对于主页链接,我试图让它只链接到网站的根级别。显然,CMenu 小部件首先通过CHtml::normalizeUrl()传递 URL ,最终使其指向当前页面。因此,如果我在示例页面上,主页链接指向/examples

这就是 normalizeUrl() 所说的:

如果输入参数为空字符串,则返回当前请求的 URL。

如果输入参数是非空字符串,则将其视为有效 URL,将不作任何更改地返回。

如果输入参数是一个数组,则将其视为控制器路由和 GET 参数列表,并调用 CController::createUrl 方法创建 URL。

我尝试传递一个空字符串,它最终按预期指向当前请求 URL。我试过传递“/”,它是一个非空字符串,它仍然指向当前的请求 URL。我也尝试将它传递给一个数组,但它会trim() expects parameter 1 to be string, array given因为 CMenu 需要一个字符串而死掉。

我正在尝试以 Yii 的方式做事,但如果它不能解决像返回主页这样简单的问题,我真的打算让菜单保持静态。

TL;DR如何让 Yii 中的 CMenu 小部件创建指向“/”或基域的链接?

4

4 回答 4

4

当您使用数组时,url它将尝试根据您的路由器配置创建 url,但如果您将字符串作为参数传递,它将按字面意思传递,即:

$this->widget('zii.widgets.CMenu',array(
    'items'=>array(
        // Root hardcoded
        array('label'=>'Home', 'url'=>'/'),
        // Root dynamic (works also if not in domain root)
        array('label'=>'Home', 'url'=>Yii::app()->baseUrl),
        // External url
        array('label'=>'Examples', 'url'=> 'http://example.com/'),
        // current url
        array('label'=>'Contact', 'url'=> ''),
        array('label'=>'FAQ', 'url'=>array('/faq')),
        array('label'=>'Blog', 'url'=>array('/blog')),
        array('label'=>'Order', 'url'=>array('/order')),
    ),
));

哦,这就是你可以使用 url 的所有地方的规则。

于 2013-04-12T12:28:48.733 回答
2
array('label'=>'Home', 'url'=>Yii::app() -> request -> baseUrl)
于 2013-04-12T12:30:00.063 回答
2

另外的选择

array('label'=>'Home', 'url'=>Yii::app()->homeUrl)

如果您baseUrl不是您的homeUrl.

于 2013-04-12T12:44:43.310 回答
0

获取一个绝对的 webroot url,并去掉 http[s]://

array('label'=>'Home', 'url'=>Yii::app()->getBaseUrl(true)),
于 2014-05-01T22:44:11.367 回答