%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/ |
Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/plugin.php |
<?php /* * Copyright 2004-2014, AfterLogic Corp. * Licensed under AGPLv3 license or AfterLogic license * if commercial version of the product was purchased. * See the LICENSE file for a full license statement. */ /** * @package Api */ class CApiPluginManager { /** * @var array */ private $_aHooks; /** * @var array */ private $_aServiceHooks; /** * @var array */ private $_aJsFiles; /** * @var array */ private $_aCssFiles; /** * @var array */ private $_aTemplates; /** * @var array */ private $_aTemplatesStrings; /** * @var array */ private $_aAddTemplates; /** * @var array */ private $_aJsonHooks; /** * @var array */ private $_aPlugins; /** * @var mixed */ private $_mState; /** * @var bool */ protected $bIsEnabled; /** * @var \ProjectSeven\Actions */ protected $_oActions; /** * @var \ProjectS */ protected $_oApiGlobalManager; public function __construct(CApiGlobalManager $oApiGlobalManager) { $this->_aHooks = array(); $this->_aServiceHooks = array(); $this->_aJsFiles = array(); $this->_aJsonHooks = array(); $this->_aCssFiles = array(); $this->_aPlugins = array(); $this->_aTemplates = array(); $this->_aAddTemplates = array(); $this->_mState = null; $this->_oApiGlobalManager = $oApiGlobalManager; $this->_oActions = null; $this->bIsEnabled = (bool) CApi::GetConf('plugins', false); if ($this->bIsEnabled) { $sPluginsPath = CApi::DataPath().'/plugins/'; if (@is_dir($sPluginsPath)) { if (false !== ($rDirHandle = @opendir($sPluginsPath))) { while (false !== ($sFile = @readdir($rDirHandle))) { if (0 < strlen($sFile) && '.' !== $sFile{0} && preg_match('/^[a-z0-9\-]+$/', $sFile) && (CApi::GetConf('plugins.config.include-all', false) || CApi::GetConf('plugins.'.$sFile, false)) && @file_exists($sPluginsPath.$sFile.'/index.php')) { $oPlugin = include $sPluginsPath.$sFile.'/index.php'; if ($oPlugin instanceof AApiPlugin) { $oPlugin->SetName($sFile); $oPlugin->SetPath($sPluginsPath.$sFile); $oPlugin->Init(); // $oPlugin->Log('INIT > '.get_class($oPlugin)); $this->_aPlugins[] = $oPlugin; } } } @closedir($rDirHandle); } } } } /** * @return CApiGlobalManager */ public function SetActions($oActions) { $this->_oActions = $oActions; } /** * @return \ProjectSeven\Actions|null */ public function Actions() { return $this->_oActions; } /** * @return CApiGlobalManager */ public function GlobalManager() { return $this->_oApiGlobalManager; } /** * @return string */ public function Hash() { $sResult = md5(CApi::Version()); foreach ($this->_aPlugins as $oPlugin) { $sResult = md5($sResult.$oPlugin->GetPath().$oPlugin->GetName().$oPlugin->GetHash()); } return $sResult; } /** * @param string $sHookName * @param mixed $mHookCallbak */ public function AddHook($sHookName, $mHookCallbak) { if ($this->bIsEnabled) { if (!isset($this->_aHooks[$sHookName])) { $this->_aHooks[$sHookName] = array(); } $this->_aHooks[$sHookName][] = $mHookCallbak; } } /** * @param string $sServiceName * @param mixed $mHookCallbak */ public function AddServiceHook($sServiceName, $mHookCallbak) { if ($this->bIsEnabled) { if (!isset($this->_aServiceHooks[$sServiceName])) { $this->_aServiceHooks[$sServiceName] = array(); } $this->_aServiceHooks[$sServiceName][] = $mHookCallbak; } } /** * @param string $sJsFileName */ public function AddJsFile($sJsFileName) { if ($this->bIsEnabled) { $this->_aJsFiles[] = $sJsFileName; } } /** * @param string $sCssFileName */ public function AddCssFile($sCssFileName) { if ($this->bIsEnabled) { $this->_aCssFiles[] = $sCssFileName; } } /** * @param string $sParsedTemplateID * @param string $sParsedPlace * @param string $sTemplateFileName */ public function IncludeTemplate($sParsedTemplateID, $sParsedPlace, $sTemplateFileName) { if ($this->bIsEnabled) { if (!isset($this->_aTemplates[$sParsedTemplateID])) { $this->_aTemplates[$sParsedTemplateID] = array(); } $this->_aTemplates[$sParsedTemplateID][] = array( $sParsedPlace, $sTemplateFileName ); } } /** * @param string $sParsedTemplateID * @param string $sParsedPlace * @param string $sTemplateString */ public function IncludeTemplateAsString($sParsedTemplateID, $sParsedPlace, $sTemplateString) { if ($this->bIsEnabled) { if (!isset($this->_aTemplatesStrings[$sParsedTemplateID])) { $this->_aTemplatesStrings[$sParsedTemplateID] = array(); } $this->_aTemplatesStrings[$sParsedTemplateID][] = array( $sParsedPlace, $sTemplateString ); } } /** * @param string $sTemplateName * @param string $sTemplateFileName */ public function AddTemplate($sTemplateName, $sTemplateFileName) { if ($this->bIsEnabled) { $this->_aAddTemplates[] = array( $sTemplateName, $sTemplateFileName ); } } /** * @return bool */ public function HasJsFiles() { return 0 < count($this->_aJsFiles); } /** * @return string */ public function CompileJs() { $aResult = array(); if ($this->bIsEnabled) { foreach ($this->_aJsFiles as $sFile) { if (file_exists($sFile)) { $aResult[] = file_get_contents($sFile); } } } return implode("\n", $aResult); } /** * @return bool */ public function HasCssFiles() { return 0 < count($this->_aCssFiles); } /** * @return string */ public function CompileCss() { $aResult = array(); if ($this->bIsEnabled) { foreach ($this->_aCssFiles as $sFile) { if (file_exists($sFile)) { $aResult[] = file_get_contents($sFile); } } } return implode("\n", $aResult); } /** * @return string */ public function ParseTemplate($sTemplateID, $sTemplateSource) { if ($this->bIsEnabled) { if (isset($this->_aTemplates[$sTemplateID]) && is_array($this->_aTemplates[$sTemplateID])) { foreach ($this->_aTemplates[$sTemplateID] as $aItem) { if (!empty($aItem[0]) && !empty($aItem[1]) && file_exists($aItem[1])) { $sTemplateSource = str_replace('{%INCLUDE-START/'.$aItem[0].'/INCLUDE-END%}', file_get_contents($aItem[1]).'{%INCLUDE-START/'.$aItem[0].'/INCLUDE-END%}', $sTemplateSource); } } } if (isset($this->_aTemplatesStrings[$sTemplateID]) && is_array($this->_aTemplatesStrings[$sTemplateID])) { foreach ($this->_aTemplatesStrings[$sTemplateID] as $aItem) { if (!empty($aItem[0]) && isset($aItem[1])) { $sTemplateSource = str_replace('{%INCLUDE-START/'.$aItem[0].'/INCLUDE-END%}', $aItem[1].'{%INCLUDE-START/'.$aItem[0].'/INCLUDE-END%}', $sTemplateSource); } } } } return $sTemplateSource; } /** * @param string $sFileName * * @return array|bool */ public function readLangFile($sFileName, &$aLang) { if (@file_exists($sFileName)) { $aSubLang = @parse_ini_file($sFileName, true); if (is_array($aSubLang)) { foreach ($aSubLang as $sKey => $mValue) { if (\is_array($mValue)) { foreach ($mValue as $sSecKey => $mSecValue) { $aLang[$sKey.'/'.$sSecKey] = $mSecValue; } } else { $aLang[$sKey] = $mValue; } } } } } public function ParseLangs($sLanguage, &$aLang) { if ($this->bIsEnabled && !empty($sLanguage)) { foreach ($this->_aPlugins as $oPlugin) { if ($oPlugin && $oPlugin->GetI18N()) { $sPluginLangs = rtrim(trim($oPlugin->GetPath()), '\\/').'/i18n/'; if (@is_dir($sPluginLangs)) { $this->readLangFile($sPluginLangs.'English.ini', $aLang); if ('English' !== $sLanguage) { $this->readLangFile($sPluginLangs.$sLanguage.'.ini', $aLang); } } } } } } /** * @return string */ public function GetPluginsTemplates() { $aTemplates = array(); if ($this->bIsEnabled) { $aTemplates = $this->_aAddTemplates; } return $aTemplates; } /** * @param string $sServiceNameLover * @param array $aParts */ public function RunServiceHandle($sServiceNameLover, $aParts) { if (isset($this->_aServiceHooks[$sServiceNameLover]) && is_array($this->_aServiceHooks[$sServiceNameLover])) { foreach ($this->_aServiceHooks[$sServiceNameLover] as $mCallbak) { call_user_func_array($mCallbak, $aParts); } } } /** * @deprecated * @param string $sAction * @param string $sRequest * @param mixed $mXmlHookCallbak */ public function AddXmlHook($sXmlHookName, $mXmlHookCallbak) { // @deprecated } /** * @param string $sHookName * @param mixed $mJsonHookCallback */ public function AddJsonHook($sHookName, $mJsonHookCallback) { if ($this->bIsEnabled) { if (!isset($this->_aJsonHooks[$sHookName])) { $this->_aJsonHooks[$sHookName] = array(); } $this->_aJsonHooks[$sHookName][] = $mJsonHookCallback; } } /** * @param string $sAction * @param array $aArg = array() */ public function RunHook($sAction, $aArg = array()) { if ($this->bIsEnabled) { if (isset($this->_aHooks[$sAction])) { foreach ($this->_aHooks[$sAction] as $mHookCallbak) { $this->logCallback('HOOK', $sAction, $mHookCallbak); call_user_func_array($mHookCallbak, is_array($aArg) ? $aArg : array()); } } } } /** * @param string $sHookName * @return bool */ public function HookExist($sHookName) { return isset($this->_aHooks[$sHookName]); } /** * @deprecated * @param string $sXmlHookName * @return bool */ public function XmlHookExist($sXmlHookName) { return false; } /** * @deprecated * @param CAppServer $oServer * @param string $sXmlHookName */ public function RunXmlHook(&$oServer, $sXmlHookName) { // deprecated } /** * @param string $sJsonHookName * @return bool */ public function JsonHookExists($sJsonHookName) { return isset($this->_aJsonHooks[$sJsonHookName]); } /** * @param \ProjectSeven\Actions $oServer * @param string $sJsonHookName */ public function RunJsonHook(&$oServer, $sJsonHookName) { if ($this->bIsEnabled) { if (isset($this->_aJsonHooks[$sJsonHookName])) { foreach ($this->_aJsonHooks[$sJsonHookName] as $mHookCallbak) { $this->logCallback('JSONHOOK', $sJsonHookName, $mHookCallbak); return call_user_func_array($mHookCallbak, array(&$oServer)); } } } return null; } /** * @param string $sLogPrefix * @param string $sName * @param mixed $mHookCallbak */ protected function logCallback($sLogPrefix, $sName, $mHookCallbak) { CApi::Log($sLogPrefix.' > '. (is_string($mHookCallbak) ? $mHookCallbak : (is_array($mHookCallbak) && is_object($mHookCallbak[0]) && is_string($mHookCallbak[1]) ? get_class($mHookCallbak[0]).'->'.$mHookCallbak[1] : 'action = '.$sName))); } } /** * @package Api */ abstract class AApiPlugin { /** * @var string */ protected $sName; /** * @var string */ protected $sPath; /** * @var bool */ protected $bI18N; /** * @var string */ protected $sVersion; /** * @var CApiPluginManager */ protected $oPluginManager; /** * @param string $sVersion * @param CApiPluginManager $oPluginManager */ public function __construct($sVersion, CApiPluginManager $oPluginManager) { $this->sVersion = (string) $sVersion; $this->oPluginManager = $oPluginManager; $this->sName = ''; $this->sPath = ''; $this->bI18N = false; } public function Init() { } /** * @staticvar string $oApiSieveManager * @return CApiSieveManager */ protected function getSieveManager() { static $oApiSieveManager = null; if (null === $oApiSieveManager) { $oApiSieveManager = CApi::Manager('sieve'); } return $oApiSieveManager; } /** * @param string $sName */ final public function SetName($sName) { $this->sName = $sName; } /** * @param string $sPath */ final public function SetPath($sPath) { $this->sPath = $sPath; } /** * @param bool $bI18N */ final public function SetI18N($bI18N) { $this->bI18N = !!$bI18N; } /** * @return string */ public function GetHash() { return ''; } /** * @return string */ public function GetName() { return $this->sName; } /** * @return bool */ public function GetI18N() { return $this->bI18N; } /** * @return string */ public function GetPath() { return $this->sPath; } /** * @return string */ public function GetVersion() { return $this->sVersion; } /** * @return string */ public function GetFullName() { return $this->sName.'-'.$this->sVersion; } /** * @param string $sHookName * @param string $sFunctionName */ public function AddHook($sHookName, $sFunctionName) { $this->oPluginManager->AddHook($sHookName, array(&$this, $sFunctionName)); } /** * @param string $sXmlHookName * @param string $sFunctionName */ public function AddXmlHook($sXmlHookName, $sFunctionName) { $this->Log('deprecated plugin function AddXmlHook', ELogLevel::Warning); //$this->oPluginManager->AddXmlHook($sXmlHookName, array(&$this, $sFunctionName)); } /** * @param string $sHookName * @param string $sFunctionName */ public function AddJsonHook($sHookName, $sFunctionName) { $this->oPluginManager->AddJsonHook($sHookName, array(&$this, $sFunctionName)); } /** * @param string $sServiceName * @param string $sFunctionName */ public function AddServiceHook($sServiceName, $sFunctionName) { $this->oPluginManager->AddServiceHook($sServiceName, array(&$this, $sFunctionName)); } /** * @param string $sJsFileName */ public function AddJsFile($sJsFileName) { if (file_exists($this->sPath.'/'.$sJsFileName)) { $this->oPluginManager->AddJsFile($this->sPath.'/'.$sJsFileName); } } /** * @param string $sCssFileName */ public function AddCssFile($sCssFileName) { if (file_exists($this->sPath.'/'.$sCssFileName)) { $this->oPluginManager->AddCssFile($this->sPath.'/'.$sCssFileName); } } /** * @param string $sParsedTemplateID * @param string $sParsedPlace * @param string $sTemplateFileName */ public function IncludeTemplate($sParsedTemplateID, $sParsedPlace, $sTemplateFileName) { if (0 < strlen($sParsedTemplateID) && 0 < strlen($sParsedPlace) && file_exists($this->sPath.'/'.$sTemplateFileName)) { $this->oPluginManager->IncludeTemplate($sParsedTemplateID, $sParsedPlace, $this->sPath.'/'.$sTemplateFileName); } } /** * @param string $sParsedTemplateID * @param string $sParsedPlace * @param string $sTemplateHtml */ public function IncludeTemplateAsString($sParsedTemplateID, $sParsedPlace, $sTemplateHtml) { if (0 < strlen($sParsedTemplateID) && 0 < strlen($sParsedPlace)) { $this->oPluginManager->IncludeTemplateAsString($sParsedTemplateID, $sParsedPlace, $sTemplateHtml); } } /** * @param string $sTemplateName * @param string $sTemplateFileName * @param string $sLayoutName = 'Layout' * @param string $sLayoutPosition = 'Screens-Middle' */ public function AddTemplate($sTemplateName, $sTemplateFileName, $sLayoutName = 'Layout', $sLayoutPosition = 'Screens-Middle') { if (0 < strlen($sTemplateName) && file_exists($this->sPath.'/'.$sTemplateFileName)) { $sTemplateName = 'Plugin_'.preg_replace('/[^a-zA-Z0-9_]/', '', str_replace(array('/', '\\'), '_', $sTemplateName)); $this->IncludeTemplateAsString($sLayoutName, 'Layout-'.$sLayoutPosition, '<div data-view-model="'.$sTemplateName.'" class="screen" style="display: none;"></div>'); $this->oPluginManager->AddTemplate($sTemplateName, $this->sPath.'/'.$sTemplateFileName); } } /** * @param string $sDesc * @param int $iLogLevel = ELogLevel::Full */ public function Log($sDesc, $iLogLevel = ELogLevel::Full) { CApi::Log('PLUGIN > '.$sDesc, $iLogLevel); } }