在使用 YIi的路徑管理工具時,發現了一個問題。
<?php
$this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'首頁', 'url'=>array('/site/index')),
array('label'=>'Products', 'url'=>array('product/index'), 'items'=>array(
array('label'=>'New Arrivals', 'url'=>array('product/new', 'tag'=>'new')),
array('label'=>'Most Popular', 'url'=>array('product/index', 'tag'=>'popular')),
)),
array('label'=>'系統設置', 'url'=>array('/setting),''),
),
));
?>
如上所示的菜單,因爲 CMENU 鏈接是模塊(modules)路徑的話,顯示出來的菜單就捕獲不到那個菜單當前是被激活的。可以通過簡單的修改插件代碼來解決這一問題:
1.打開代碼文件 : yiiframework/zii/widgets/CMenu.php
2.找到代碼第 226行,把isItemActive函數,替換爲以下代碼:
protected function isItemActive($item,$route)
{
//原版
//if(isset($item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))
//修改版
if(isset($item['url']) && is_array($item['url']) && strpos('/'.$route,trim($item['url'][0],'/'))>0)
{
if(count($item['url'])>=1)
{
foreach(array_splice($item['url'],1) as $name=>$value)
{
if(!isset($_GET[$name]) || $_GET[$name]!=$value)
return false;
}
}
return true;
}elseif(isset($item['url']) && strlen(strstr($item['url'],$route))>0){
return true;
}
return false;
}
3.原理只是修改了判斷代碼,使用strpos來判斷路由中,是否存在當前請求的模塊或控制器的路徑,從而達到獲取激活菜單項的目的。
================================================================
Yii 的Breadcrumbs,是Yii的路徑插件,使用方法 :
<?php $this->widget('zii.widgets.CBreadcrumbs', array('links'=>$this->breadcrumbs,)); ?>
在視圖裏設置路徑信息(在生成Yii程序裏,都會自動產生這些代碼,註冊掉的部分是自動生成的):
<?php
$this->breadcrumbs=array(
//$this->module->id,
'系統設置'
);
?>
但是因爲這個東東是老外寫的,所以路徑的開頭總是以 Home 開頭,就像這樣
Home » 系統設置
通過爲CBreadcrumbs添加一個屬性,可以很簡單的解決這個問題
1. 打開代碼文件 : yiiframework/zii/widgets/CBreadcrumbs.php
2.在打開文件 的第48行下方添加代碼: public $rootName = 'Home';
3.修改第104行代碼
$links[]=CHtml::link(Yii::t('zii','Home'),Yii::app()->homeUrl);
爲: $links[]=CHtml::link(Yii::t('zii',$this->rootName),Yii::app()->homeUrl);
4.調用方法 :<?php $this->widget('zii.widgets.CBreadcrumbs', array('rootName'=>'管理系統','links'=>$this->breadcrumbs,)); ?>
原理:其實就是爲插件添加了一件屬性,來代替之前固化的開始處字符。