1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-26 03:30:48 +03:00

Plugin: возможность делегирования (подмены) модуля\экшена\сущности из плагина.

This commit is contained in:
Alexey Kachayev 2010-01-10 14:26:44 +00:00
parent 02060212c3
commit b0e8a7696a
4 changed files with 68 additions and 3 deletions

View file

@ -314,7 +314,7 @@ class Engine extends Object {
* @param array $aArgs
* @return unknown
*/
public function _CallModule($sName,$aArgs) {
public function _CallModule($sName,$aArgs) {
$sArgs='';
$aStrArgs=array();
foreach ($aArgs as $sKey => $arg) {
@ -352,7 +352,11 @@ class Engine extends Object {
$sModuleName=$aName[0].'_'.$aName[1];
$sMethod=$aName[2];
}
/**
* Подхватыем делегат модуля (в случае наличия такового)
*/
if($sModuleName!='Plugin') $sModuleName=$this->Plugin_GetDelegate('module',$sModuleName);
if (isset($this->aModules[$sModuleName])) {
$oModule=$this->aModules[$sModuleName];
} else {
@ -393,6 +397,10 @@ class Engine extends Object {
* @return mixed
*/
public static function GetEntity($sName,$aParams=array()) {
/**
* Определяем наличие делегата сущности
*/
$sName=self::getInstance()->Plugin_GetDelegate('entity',$sName);
/**
* Сущности, имеющие такое же название как модуль,
* можно вызывать сокращенно. Например, вместо User_User -> User
@ -414,7 +422,7 @@ class Engine extends Object {
list($sPlugin,$sModule,$sEntity)=explode('_',$sName);
$sPlugin = substr($sPlugin,6);
} else {
throw new Exception("Unknown entity '{$sName}' given.");
throw new Exception("Unknown entity '{$sName}' given.");
}
break;

View file

@ -155,6 +155,10 @@ class Router extends Object {
$oActionInit->InitAction();
$sActionClass=$this->DefineActionClass();
/**
* Определяем наличие делегата экшена
*/
$sActionClass=$this->Plugin_GetDelegate('action',$sActionClass);
/**
* Если класс экешна начинается с Plugin*_, значит необходимо загрузить объект из указанного плагина

View file

@ -47,6 +47,17 @@ class LsPlugin extends Module {
*/
protected $aPluginsList=array();
/**
* Список engine-rewrite`ов (модули, экшены, сущности)
*
* @var array
*/
protected $aDelegate=array(
'module' => array(),
'action' => array(),
'entity' => array()
);
/**
* Инициализация модуля
*
@ -188,6 +199,42 @@ class LsPlugin extends Module {
}
}
/**
* Перенаправление вызовов на модули, экшены, сущности
*
* @param string $sType
* @param string $sFrom
* @param string $sTo
*/
public function Delegate($sType,$sFrom,$sTo) {
if(!in_array($sType,array('module','action','entity')) or !$sFrom or !$sTo) return null;
$this->aDelegate[$sType][trim($sFrom)]=trim($sTo);
}
/**
* Возвращает делегат модуля, экшена, сущности.
* Если делегат не определен, отдает переданный в качестве sender`a параметр
*
* @param string $sType
* @param string $sFrom
* @return string
*/
public function GetDelegate($sType,$sFrom) {
return $this->isDelegated($sType,$sFrom)?$this->aDelegate[$sType][$sFrom]:$sFrom;
}
/**
* Возвращает true, если установлено правило делегирования
*
* @param string $sType
* @param string $sFrom
* @return bool
*/
public function isDelegated($sType,$sFrom) {
if(!in_array($sType,array('module','action','entity')) or !$sFrom) return false;
return isset($this->aDelegate[$sType][$sFrom]);
}
/**
* При завершении работы модуля
*

View file

@ -24,5 +24,11 @@ class PluginProfiler extends Plugin {
$this->ExportSQL(dirname(__FILE__).'/sql.sql');
return true;
}
/**
* Инициализация плагина Profiler
*/
public function Init() {
}
}
?>