/**
 * 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;
}
Esempio n. 2
0
 /**
  * Передает информацию о делегатах в модуль 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));
         }
     }
 }
Esempio n. 3
0
/**
 * @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;
}
Esempio n. 5
0
 /**
  * Возвращает отрендеренный шаблон виджета
  *
  * @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);
 }
Esempio n. 6
0
 /**
  * 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);
 }
Esempio n. 7
0
/**
 * 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;
}
Esempio n. 8
0
 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');
 }
Esempio n. 9
0
 /**
  * Устанавливает какой шаблон выводить
  *
  * @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;
 }
Esempio n. 10
0
 /**
  * Автозагрузка классов
  *
  * @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;
 }
Esempio n. 11
0
 /**
  * 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);
 }
Esempio n. 12
0
 /**
  * Запускает на выполнение экшен
  * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
  *
  */
 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');
 }
Esempio n. 13
0
 /**
  * Запускает на выполнение экшен
  * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
  *
  */
 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');
 }
Esempio n. 14
0
 /**
  * Получить число сущностей по связанной таблице
  *
  * @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;
 }
Esempio n. 15
0
 /**
  * @param bool $bEncode
  *
  * @return mixed|null
  */
 public function GetId($bEncode = false)
 {
     $sResult = $this->getProp('id');
     if ($bEncode) {
         $sResult = E::ModulePlugin()->EncodeId($sResult);
     }
     return $sResult;
 }
Esempio n. 16
0
 /**
  * Проксирует вызов методов в модуль сущности
  *
  * @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);
 }