/** * Plugin for Smarty * * @param array $aParams * @param Smarty_Internal_Template $oSmartyTemplate * * @return string|null */ function smarty_function_widget_template($aParams, $oSmartyTemplate) { if (!isset($aParams['name'])) { trigger_error('Parameter "name" does not define in {widget ...} function', E_USER_WARNING); return null; } $sWidgetName = $aParams['name']; $aWidgetParams = isset($aParams['params']) ? $aParams['params'] : array(); $oEngine = Engine::getInstance(); // Проверяем делигирование $sTemplate = E::ModulePlugin()->GetDelegate('template', $sWidgetName); if ($sTemplate) { if ($aWidgetParams) { foreach ($aWidgetParams as $sKey => $sVal) { $oSmartyTemplate->assign($sKey, $sVal); } if (!isset($aWidgetParams['params'])) { /* LS-compatible */ $oSmartyTemplate->assign('params', $aWidgetParams); } $oSmartyTemplate->assign('aWidgetParams', $aWidgetParams); } $sResult = $oSmartyTemplate->fetch($sTemplate); } else { $sResult = null; } return $sResult; }
/** * Передает информацию о делегатах в модуль ModulePlugin * Вызывается Engine перед инициализацией плагина * * @see Engine::LoadPlugins */ final function Delegate() { $aDelegates = $this->GetDelegates(); foreach ($aDelegates as $sObjectName => $aParams) { foreach ($aParams as $sFrom => $sTo) { E::ModulePlugin()->Delegate($sObjectName, $sFrom, $sTo, get_class($this)); } } $aInherits = $this->GetInherits(); foreach ($aInherits as $aParams) { foreach ($aParams as $sFrom => $sTo) { E::ModulePlugin()->Inherit($sFrom, $sTo, get_class($this)); } } }
/** * @param array $aParams * @param Smarty_Internal_Template $oSmartyTemplate * * @return string|null; */ function smarty_function_include_once($aParams, $oSmartyTemplate) { if (!array_key_exists('file', $aParams)) { trigger_error('include_once: missing "name" parameter', E_USER_WARNING); return null; } $sTemplate = E::ModulePlugin()->GetDelegate('template', $aParams['file']); $aIncluded = (array) $oSmartyTemplate->smarty->getTemplateVars('_included_files'); if (!in_array($sTemplate, $aIncluded)) { unset($aParams['file']); if ($aParams) { $oSmartyTemplate->smarty->assign($aParams); } $sResult = $oSmartyTemplate->smarty->fetch($sTemplate); $oSmartyTemplate->smarty->append('_included_files', $sTemplate); } else { $sResult = ''; } return $sResult; }
/** * Plugin for Smarty * * @param array $aParams * @param Smarty_Internal_Template $oSmartyTemplate * * @return string|null */ function smarty_function_widget_template($aParams, $oSmartyTemplate) { if (!isset($aParams['name'])) { trigger_error('Parameter "name" does not define in {widget ...} function', E_USER_WARNING); return null; } $sWidgetName = $aParams['name']; $sWidgetTemplate = !empty($aParams['template']) ? $aParams['template'] : $sWidgetName; $aWidgetParams = isset($aParams['params']) ? array_merge($aParams['params'], $aParams) : $aParams; // Проверяем делигирование $sTemplate = E::ModulePlugin()->GetDelegate('template', $sWidgetTemplate); if ($sTemplate) { if ($aWidgetParams) { $oSmartyTemplate->smarty->assign($aWidgetParams); $oSmartyTemplate->smarty->assign('aWidgetParams', $aWidgetParams); /* LS-compatible */ $oSmartyTemplate->smarty->assign('params', $aWidgetParams); } $sResult = $oSmartyTemplate->smarty->fetch($sTemplate); } else { $sResult = null; } return $sResult; }
/** * Возвращает отрендеренный шаблон виджета * * @param string $sTemplate - Шаблон для рендеринга * @param array $aVars - Переменные для локального рендеринга * @param array $aOptions - Опции рендеринга * * @return string */ public function FetchWidget($sTemplate, $aVars = array(), $aOptions = array()) { // * Проверяем наличие делегата $sDelegateTemplate = E::ModulePlugin()->GetDelegate('template', $sTemplate); $sRenderTemplate = ''; if ($sDelegateTemplate == $sTemplate && !$this->TemplateExists($sTemplate)) { $sWidgetTemplate = 'widgets/widget.' . $sTemplate; $sWidgetTemplate = E::ModulePlugin()->GetDelegate('template', $sWidgetTemplate); if ($sTemplatePath = $this->TemplateExists($sWidgetTemplate)) { $sRenderTemplate = $sTemplatePath; } if (!$sRenderTemplate) { // * LS-compatible *// $sWidgetTemplate = 'blocks/block.' . $sTemplate; $sWidgetTemplate = E::ModulePlugin()->GetDelegate('template', $sWidgetTemplate); if ($sTemplatePath = $this->TemplateExists($sWidgetTemplate)) { $sRenderTemplate = $sTemplatePath; } } if (!$sRenderTemplate) { $sRenderTemplate = $sWidgetTemplate; } } if (!$sRenderTemplate) { $sRenderTemplate = $sDelegateTemplate; } return $this->Fetch($sRenderTemplate, $aVars, $aOptions); }
/** * populate Source Object with meta data from Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { $source->name = E::ModulePlugin()->GetDelegate('template', $source->name); parent::populate($source, $_template); }
/** * Plugin for Smarty * * @param array $aParams * @param Smarty_Internal_Template $oSmartyTemplate * * @return string|null */ function smarty_function_widget_exec($aParams, $oSmartyTemplate) { if (!isset($aParams['name'])) { trigger_error('Parameter "name" does not define in {widget ...} function', E_USER_WARNING); return null; } $sWidgetName = $aParams['name']; $sPlugin = !empty($aParams['plugin']) ? $aParams['plugin'] : ''; $aWidgetParams = isset($aParams['params']) ? array_merge($aParams['params'], $aParams) : $aParams; $sWidget = ucfirst(basename($sWidgetName)); $sTemplate = ''; $sDelegatedClass = E::ModulePlugin()->GetDelegate('widget', $sWidget); if ($sDelegatedClass == $sWidget) { // Пробуем получить делегата по старинке, для совместимости с LS // * LS-compatible * // $sDelegatedClass = E::ModulePlugin()->GetDelegate('block', $sWidget); } // Если делегатов нет, то определаем класс виджета if ($sDelegatedClass == $sWidget) { // Проверяем наличие класса виджета штатными средствами $sWidgetClass = E::ModuleWidget()->FileClassExists($sWidget, $sPlugin, true); if ($sWidgetClass) { // Проверяем делегирование найденного класса $sWidgetClass = E::ModulePlugin()->GetDelegate('widget', $sWidgetClass); if ($sPlugin) { $sPluginTplDir = Plugin::GetTemplateDir($sPlugin); $sTemplate = $sPluginTplDir . 'tpls/widgets/widget.' . $sWidgetName . '.tpl'; if ($sFound = F::File_Exists('/widgets/widget.' . $sWidgetName . '.tpl', array($sPluginTplDir . 'tpls/', $sPluginTplDir))) { $sTemplate = $sFound; } else { // * LS-compatible * // $sLsTemplate = Plugin::GetTemplateDir($sPlugin) . '/blocks/block.' . $sWidgetName . '.tpl'; if (F::File_Exists($sLsTemplate)) { $sTemplate = $sLsTemplate; } } } else { $sTemplate = E::ModulePlugin()->GetDelegate('template', 'widgets/widget.' . $sWidgetName . '.tpl'); $sTemplate = F::File_Exists($sTemplate, $oSmartyTemplate->smarty->getTemplateDir()); if (!$sTemplate) { // * LS-compatible * // $sLsTemplate = E::ModulePlugin()->GetDelegate('template', 'blocks/block.' . $sWidgetName . '.tpl'); if (F::File_Exists($sLsTemplate, $oSmartyTemplate->smarty->getTemplateDir())) { $sTemplate = $sLsTemplate; } } } } else { // * LS-compatible * // // Класс не найден if ($sPlugin) { // Если класс виджета не найден, то пытаемся по старинке задать класс "LS-блока" $sWidgetClass = 'Plugin' . ucfirst($sPlugin) . '_Block' . $sWidget; } else { // Если класс виджета не найден, то пытаемся по старинке задать класс "LS-блока" $sWidgetClass = 'Block' . $sWidget; } // Проверяем делигирование найденного класса $sWidgetClass = E::ModulePlugin()->GetDelegate('block', $sWidgetClass); if (!$sTemplate) { $sLsTemplate = E::ModulePlugin()->GetDelegate('template', 'blocks/block.' . $sWidgetName . '.tpl'); if (F::File_Exists($sLsTemplate, $oSmartyTemplate->smarty->getTemplateDir())) { $sTemplate = $sLsTemplate; } } } } else { $sWidgetClass = $sDelegatedClass; } // * Подключаем необходимый обработчик /** @var Widget $oWidgetHandler */ $oWidgetHandler = new $sWidgetClass($aWidgetParams); // * Запускаем обработчик $sResult = $oWidgetHandler->Exec(); // Если обработчик ничего не вернул, то рендерим шаблон if (!$sResult && $sTemplate) { if ($aWidgetParams) { $oSmartyTemplate->smarty->assign('aWidgetParams', $aWidgetParams); } $sResult = $oSmartyTemplate->smarty->fetch($sTemplate); } return $sResult; }
protected function _eventPluginsAdd() { if ($aZipFile = $this->GetUploadedFile('plugin_arc')) { if ($sPackFile = F::File_MoveUploadedFile($aZipFile['tmp_name'], $aZipFile['name'] . '/' . $aZipFile['name'])) { E::ModulePlugin()->UnpackPlugin($sPackFile); F::File_RemoveDir(dirname($sPackFile)); } } $this->_setTitle(E::ModuleLang()->Get('action.admin.plugins_title')); $this->SetTemplateAction('site/plugins_add'); E::ModuleViewer()->Assign('sMode', 'add'); }
/** * Устанавливает какой шаблон выводить * * @param string $sTemplate Путь до шаблона относительно каталога шаблонов экшена */ protected function SetTemplateAction($sTemplate) { if (substr($sTemplate, -4) != '.tpl') { $sTemplate = $sTemplate . '.tpl'; } $sActionTemplatePath = $sTemplate; if (!F::File_IsLocalDir($sActionTemplatePath)) { // If not absolute path then defines real path of template $aDelegates = E::ModulePlugin()->GetDelegationChain('action', $this->GetActionClass()); foreach ($aDelegates as $sAction) { if (preg_match('/^(Plugin([\\w]+)_)?Action([\\w]+)$/i', $sAction, $aMatches)) { // for LS-compatibility $sActionNameOriginal = $aMatches[3]; // New-style action templates $sActionName = strtolower($sActionNameOriginal); $sTemplatePath = E::ModulePlugin()->GetDelegate('template', 'actions/' . $sActionName . '/action.' . $sActionName . '.' . $sTemplate); $sActionTemplatePath = $sTemplatePath; if (!empty($aMatches[1])) { $aPluginTemplateDirs = array(Plugin::GetTemplateDir($sAction)); if (basename($aPluginTemplateDirs[0]) !== 'default') { $aPluginTemplateDirs[] = dirname($aPluginTemplateDirs[0]) . '/default/'; } if ($sTemplatePath = F::File_Exists('tpls/' . $sTemplatePath, $aPluginTemplateDirs)) { $sActionTemplatePath = $sTemplatePath; break; } if ($sTemplatePath = F::File_Exists($sTemplatePath, $aPluginTemplateDirs)) { $sActionTemplatePath = $sTemplatePath; break; } // LS-compatibility if (E::ModulePlugin()->IsActivePlugin('ls')) { $sLsTemplatePath = E::ModulePlugin()->GetDelegate('template', 'actions/Action' . ucfirst($sActionName) . '/' . $sTemplate); if ($sTemplatePath = F::File_Exists($sLsTemplatePath, $aPluginTemplateDirs)) { $sActionTemplatePath = $sTemplatePath; break; } $sLsTemplatePath = E::ModulePlugin()->GetDelegate('template', 'actions/Action' . ucfirst($sActionNameOriginal) . '/' . $sTemplate); if ($sTemplatePath = F::File_Exists($sLsTemplatePath, $aPluginTemplateDirs)) { $sActionTemplatePath = $sTemplatePath; break; } } } } } } $this->sActionTemplate = $sActionTemplatePath; }
/** * Автозагрузка классов * * @param string $sClassName Название класса * * @return bool */ public static function Autoload($sClassName) { if ($sParentClass = Config::Get('classes.alias.' . $sClassName)) { return self::_classAlias($sParentClass, $sClassName); } if (self::_autoloadDefinedClass($sClassName)) { return true; } if (class_exists('Engine', false) && E::GetStage() >= E::STAGE_INIT) { $aInfo = E::GetClassInfo($sClassName, E::CI_CLASSPATH | E::CI_INHERIT); if ($aInfo[E::CI_INHERIT]) { $sInheritClass = $aInfo[E::CI_INHERIT]; $sParentClass = E::ModulePlugin()->GetParentInherit($sInheritClass); return self::_classAlias($sParentClass, $sClassName); } elseif ($aInfo[E::CI_CLASSPATH]) { return self::_includeFile($aInfo[E::CI_CLASSPATH], $sClassName); } } if (self::_autoloadPSR($sClassName)) { return true; } return false; }
/** * Load data from XML file * * @param string $sPluginXmlFile * @param array $aData */ public function LoadFromXmlFile($sPluginXmlFile, $aData = null) { $sPluginXmlString = E::ModulePlugin()->GetPluginManifestFrom($sPluginXmlFile); $this->LoadFromXml($sPluginXmlString, $aData); }
/** * Запускает на выполнение экшен * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой * */ public function ExecAction() { $this->DefineActionClass(); // Hook before action E::ModuleHook()->Run('action_before'); $sActionClass = $this->DefineActionClass(); // * Определяем наличие делегата экшена if ($aChain = E::ModulePlugin()->GetDelegationChain('action', $sActionClass)) { if (!empty($aChain)) { $sActionClass = $aChain[0]; } } static::$sActionClass = $sActionClass; if (!class_exists($sActionClass)) { throw new Exception('Cannot load class "' . $sActionClass . '"'); } $this->oAction = new $sActionClass(static::$sAction); // * Инициализируем экшен $sInitResult = $this->oAction->Init(); if ($sInitResult === 'next') { $this->ExecAction(); } else { // Если инициализация экшена прошла успешно и метод провеки доступа вернул // положительный результат то запускаем запрошенный ивент на исполнение. if ($sInitResult !== false && $this->oAction->Access(self::GetActionEvent()) !== false) { $res = $this->oAction->ExecEvent(); static::$sActionEventName = $this->oAction->GetCurrentEventName(); $this->oAction->EventShutdown(); if ($res === 'next') { $this->ExecAction(); } } else { if (!F::AjaxRequest()) { static::$sAction = $this->aConfigRoute['config']['action_not_found']; static::$sActionEvent = '404'; $this->ExecAction(); } } } // Hook after action E::ModuleHook()->Run('action_after'); }
/** * Запускает на выполнение экшен * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой * */ public function ExecAction() { $this->DefineActionClass(); // Hook before action E::ModuleHook()->Run('action_before'); $sActionClass = $this->DefineActionClass(); // * Определяем наличие делегата экшена if ($aChain = E::ModulePlugin()->GetDelegationChain('action', $sActionClass)) { if (!empty($aChain)) { $sActionClass = $aChain[0]; } } static::$sActionClass = $sActionClass; if (!class_exists($sActionClass)) { throw new Exception('Cannot load class "' . $sActionClass . '"'); } $this->oAction = new $sActionClass(static::$sAction); // * Инициализируем экшен $sInitResult = $this->oAction->Init(); if ($sInitResult === 'next') { $this->ExecAction(); } else { // Если инициализация экшена прошла успешно, // то запускаем запрошенный ивент на исполнение. if ($sInitResult !== false) { $xEventResult = $this->oAction->ExecEvent(); static::$sActionEventName = $this->oAction->GetCurrentEventName(); $this->oAction->EventShutdown(); if ($xEventResult === 'next') { $this->ExecAction(); } } } // Hook after action E::ModuleHook()->Run('action_after'); }
/** * Получить число сущностей по связанной таблице * * @param array $aJoinData Фильтр * @param string $sEntityFull Название класса сущности * * @return int */ public function GetCountItemsByJoinTable($aJoinData = array(), $sEntityFull = null) { if (is_null($sEntityFull)) { $sEntityFull = E::GetPluginPrefix($this) . 'Module' . E::GetModuleName($this) . '_Entity' . E::GetModuleName(get_class($this)); } elseif (!substr_count($sEntityFull, '_')) { $sEntityFull = E::GetPluginPrefix($this) . 'Module' . E::GetModuleName($this) . '_Entity' . $sEntityFull; } // Если параметр #cache указан и пуст, значит игнорируем кэширование для запроса if (array_key_exists('#cache', $aJoinData) && !$aJoinData['#cache']) { $iCount = $this->oMapper->GetCountItemsByJoinTable($aJoinData, $sEntityFull); } else { $sEntityFullRoot = E::ModulePlugin()->GetRootDelegater('entity', $sEntityFull); $sCacheKey = $sEntityFullRoot . '_count_items_by_join_table_' . serialize($aJoinData); $aCacheTags = array(); $iCacheTime = 60 * 60 * 24; // скорее лучше хранить в свойстве сущности, для возможности выборочного переопределения // переопределяем из параметров if (isset($aJoinData['#cache'][0])) { $sCacheKey = $aJoinData['#cache'][0]; } if (isset($aJoinData['#cache'][1])) { $aCacheTags = $aJoinData['#cache'][1]; } if (isset($aJoinData['#cache'][2])) { $iCacheTime = $aJoinData['#cache'][2]; } $aCacheTags[] = 'm2m_' . $aJoinData['#relation_key'] . $aJoinData['#by_key'] . $aJoinData['#by_value']; if (false === ($iCount = E::ModuleCache()->Get($sCacheKey))) { $iCount = $this->oMapper->GetCountItemsByJoinTable($aJoinData, $sEntityFull); E::ModuleCache()->Set($iCount, $sCacheKey, $aCacheTags, $iCacheTime); } } return $iCount; }
/** * @param bool $bEncode * * @return mixed|null */ public function GetId($bEncode = false) { $sResult = $this->getProp('id'); if ($bEncode) { $sResult = E::ModulePlugin()->EncodeId($sResult); } return $sResult; }
/** * Проксирует вызов методов в модуль сущности * * @param string $sName Название метода * * @return mixed */ protected function _Method($sName) { $sModuleName = E::GetModuleName($this); $sEntityName = E::GetEntityName($this); $sPluginPrefix = E::GetPluginPrefix($this); /** * If Module not exists, try to find its root Delegater */ $aClassInfo = E::GetClassInfo($sPluginPrefix . 'Module_' . $sModuleName, Engine::CI_MODULE); if (empty($aClassInfo[E::CI_MODULE]) && ($sRootDelegater = E::ModulePlugin()->GetRootDelegater('entity', get_class($this)))) { $sModuleName = E::GetModuleName($sRootDelegater); $sPluginPrefix = E::GetPluginPrefix($sRootDelegater); } $aCallArgs = array($this); return E::GetInstance()->_CallModule("{$sPluginPrefix}{$sModuleName}_{$sName}{$sEntityName}", $aCallArgs); }