diff --git a/engine/classes/Plugin.class.php b/engine/classes/Plugin.class.php index 1e09188d..f7064804 100644 --- a/engine/classes/Plugin.class.php +++ b/engine/classes/Plugin.class.php @@ -48,7 +48,6 @@ abstract class Plugin extends Object { * */ public function Init() { - } /** @@ -56,6 +55,30 @@ abstract class Plugin extends Object { * Вызывается Engine перед инициализацией плагина */ final function Delegate() { + /** + * Получаем название плагина + */ + preg_match('/^Plugin([\w]+)$/i',get_class($this),$aMatches); + $sPluginName=strtolower($aMatches[1]); + /** + * Получаем список объектов, подлежащих делегации + */ + $aObjects=$this->Plugin_GetDelegateObjectList(); + + /** + * Считываем данные из XML файла описания + */ + $sPluginXML = Config::Get('path.root.server').'/plugins/'.$sPluginName.'/'.LsPlugin::PLUGIN_README_FILE; + if($oXml = @simplexml_load_file($sPluginXML)) { + foreach($aObjects as $sObjectName) { + if(is_array($data=$oXml->xpath("delegate/{$sObjectName}/item"))) { + foreach($data as $aDelegate) { + $this->Plugin_Delegate($sObjectName,$aDelegate->from,$aDelegate->to,get_class($this)); + } + } + } + } + if(is_array($this->aDelegates) and count($this->aDelegates)) { foreach ($this->aDelegates as $sObjectName=>$aParams) { if(is_array($aParams) and count($aParams)) { diff --git a/engine/modules/plugin/Plugin.class.php b/engine/modules/plugin/Plugin.class.php index f6b3f1c5..1985bde4 100644 --- a/engine/modules/plugin/Plugin.class.php +++ b/engine/modules/plugin/Plugin.class.php @@ -75,7 +75,7 @@ class LsPlugin extends Module { $aList=array_map('basename',glob($this->sPluginsDir.'*',GLOB_ONLYDIR)); $aActivePlugins=$this->GetActivePlugins(); - foreach($aList as $sPlugin) { + foreach($aList as $sPlugin) { $this->aPluginsList[$sPlugin] = array( 'code' => $sPlugin, 'is_active' => in_array($sPlugin,$aActivePlugins) @@ -318,7 +318,7 @@ class LsPlugin extends Module { 'sign'=>$sSign ); } - + /** * Возвращает делегат модуля, экшена, сущности. * Если делегат не определен, отдает переданный в качестве sender`a параметр @@ -354,6 +354,15 @@ class LsPlugin extends Module { return isset($this->aDelegates[$sType][$sFrom]['delegate']); } + /** + * Возвращает список объектов, доступных для делегирования + * + * @return array + */ + public function GetDelegateObjectList() { + return array_keys($this->aDelegates); + } + /** * При завершении работы модуля *