我在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')),
),
));
这些网址路径中的每一个,例如 / examples 都是在我的配置中定义的路线,因此它看起来不像网站/示例。
对于Home链接,我试图将其链接到站点的根级别。显然,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小部件创建指向“/”或基本域的链接?
答案 0 :(得分: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')),
),
));
哦,当你可以使用网址时,这就统治了所有地方。
答案 1 :(得分:2)
array('label'=>'Home', 'url'=>Yii::app() -> request -> baseUrl)
答案 2 :(得分:2)
另一个选择
array('label'=>'Home', 'url'=>Yii::app()->homeUrl)
如果您的baseUrl
不是您的homeUrl
。
答案 3 :(得分:0)
获取绝对的webroot网址,并删除http [s]://
array('label'=>'Home', 'url'=>Yii::app()->getBaseUrl(true)),