我在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。
对于Home链接,我正试图让它链接到网站的根级别。显然,CMenu小部件首先通过html::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小部件创建指向"/"的链接?或者到基域?
当你使用array作为url
时,它将尝试根据你的路由器配置创建url,但如果你将string作为参数传递,它将按字面传递,即:
$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')),
),
));
array('label'=>'Home', 'url'=>Yii::app() -> request -> baseUrl)
另一个选项
array('label'=>'Home', 'url'=>Yii::app()->homeUrl)
如果你的baseUrl
不是你的homeUrl
,这有助于
获取一个绝对的webroot url,并删除http[s]://
array('label'=>'Home', 'url'=>Yii::app()->getBaseUrl(true)),