/**
  * Запускает на выполнение экшен
  * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
  *
  */
 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();
         }
     }
 }
Example #2
0
 /**
  * Запускает на выполнение экшен
  * Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
  *
  */
 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();
         }
     }
 }