srbac版本:srbac_1.2
原SRBAC.Components.Helper.php文件中的以下两个方法:
/**
* Find a module searching in application modules and if it's not found there
* looks in modules' modules
* @param String $moduleID The model to find
* @return The module, if it's found else null
*/
public static function findModule($moduleID) {
if (Yii::app()->getModule($moduleID)) {
return Yii::app()->getModule($moduleID);
}
$modules = Yii::app()->getModules();
foreach ($modules as $mod=>$conf) {
if (Yii::app()->getModule($mod)) {
return self::findInModule(Yii::app()->getModule($mod), $moduleID);
}
}
return null;
}
/**
* Search for a child module
* @param String $parent The parent module
* @param String $moduleID The module to find
* @return The module, if it's not found returns null
*/
private static function findInModule($parent, $moduleID) {
if ($parent->getModule($moduleID)) {
return $parent->getModule($moduleID);
} else {
$modules = $parent->getModules();
foreach ($modules as $mod => $conf) {
return $this->findInModule($parent->getModule($mod), $moduleID);
}
}
return null;
}
在遍历子模块时,个人认为有问题。将以上方法改为如下:
/**
* Find a module searching in application modules and if it's not found there
* looks in modules' modules
* @param String $moduleID The model to find
* @return The module, if it's found else null
*/
public static function findModule($moduleID)
{
if (Yii::app()->getModule($moduleID))
return Yii::app()->getModule($moduleID);
$modules = Yii::app()->getModules();
foreach ($modules as $mod=>$conf) {
$module=Yii::app()->getModule($mod);
if ($module)
{
$childModule=self::findInModule($module, $moduleID);
if($childModule!==null)
return $childModule;
}
}
return null;
}
/**
* Search for a child module
* @param String $parent The parent module
* @param String $moduleID The module to find
* @return The module, if it's not found returns null
*/
private static function findInModule($parent, $moduleID)
{
if ($parent->getModule($moduleID))
return $parent->getModule($moduleID);
else
{
$modules = $parent->getModules();
foreach ($modules as $mod => $conf){
$module=$parent->getModule($mod);
if ($module) {
$childModule=self::findInModule($module, $moduleID);
if($childModule!==null && $module->id.'/'.$moduleID==$childModule->id)
return $childModule;
}
}
}
return null;
}