/** * Запускает на выполнение экшен * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой * */ public function ExecAction() { $this->DefineActionClass(); /** * Сначала запускаем инициализирующий евент */ $this->Hook_Run('init_action'); $sActionClass = $this->DefineActionClass(); /** * Определяем наличие делегата экшена */ if ($aChain = $this->Plugin_GetDelegationChain('action', $sActionClass)) { if (!empty($aChain)) { $sActionClass = $aChain[0]; } } self::$sActionClass = $sActionClass; /** * Если класс экешна начинается с Plugin*_, значит необходимо загрузить объект из указанного плагина */ if (!preg_match('/^Plugin([\\w]+)_Action([\\w]+)$/i', $sActionClass, $aMatches)) { require_once Config::Get('path.root.server') . '/classes/actions/' . $sActionClass . '.class.php'; } else { require_once Config::Get('path.root.server') . '/plugins/' . strtolower($aMatches[1]) . '/classes/actions/Action' . ucfirst($aMatches[2]) . '.class.php'; } $sClassName = $sActionClass; $this->oAction = new $sClassName($this->oEngine, self::$sAction); /** * Инициализируем экшен */ $this->Hook_Run("action_init_" . strtolower($sActionClass) . "_before"); $sInitResult = $this->oAction->Init(); $this->Hook_Run("action_init_" . strtolower($sActionClass) . "_after"); if ($sInitResult === 'next') { $this->ExecAction(); } else { /** * Замеряем время работы action`а */ $oProfiler = ProfilerSimple::getInstance(); $iTimeId = $oProfiler->Start('ExecAction', self::$sAction); $res = $this->oAction->ExecEvent(); self::$sActionEventName = $this->oAction->GetCurrentEventName(); $this->Hook_Run("action_shutdown_" . strtolower($sActionClass) . "_before"); $this->oAction->EventShutdown(); $this->Hook_Run("action_shutdown_" . strtolower($sActionClass) . "_after"); $oProfiler->Stop($iTimeId); if ($res === 'next') { $this->ExecAction(); } } }
/** * Запускает на выполнение экшен * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой * */ public function ExecAction() { $this->DefineActionClass(); /** * Сначала запускаем инициализирующий евент */ $this->Hook_Run('init_action'); $sActionClass = $this->DefineActionClass(); /** * Определяем наличие делегата экшена */ if ($aChain = $this->Plugin_GetDelegationChain('action', $sActionClass)) { if (!empty($aChain)) { $sActionClass = $aChain[0]; } } self::$sActionClass = $sActionClass; $sClassName = $sActionClass; $this->oAction = new $sClassName(self::$sAction); /** * Инициализируем экшен */ $this->Hook_Run("action_init_" . strtolower($sActionClass) . "_before"); $sInitResult = $this->oAction->Init(); $this->Hook_Run("action_init_" . strtolower($sActionClass) . "_after"); if ($sInitResult === 'next') { $this->ExecAction(); } else { $mRes = $this->oAction->ExecEvent(); self::$sActionEventName = $this->oAction->GetCurrentEventName(); $this->Hook_Run("action_shutdown_" . strtolower($sActionClass) . "_before"); $this->oAction->EventShutdown(); $this->Hook_Run("action_shutdown_" . strtolower($sActionClass) . "_after"); if ($mRes === 'next') { $this->ExecAction(); } } }
/** * Запускает на выполнение экшен * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой * */ 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'); }