Экшены (Action) LiveStreet

Экшены (Action) предназначены для обработки определенных URL. Например при запросе http://site.com/action_name/event_name/ будет запущен экшен с именем action_name. Соответствие имени экшена и его класса определяется в конфиге роутинга. Классы экшенов расположены в каталоге /classes/actions/ и наследуются от класса Action(/engine/classes/Action.class.php). Название файла экшена должно формироваться из названия класса, например, для класса ActionTest файл будет иметь имя ActionTest.class.php. При запуске экшен пытается найти необходимый эвент по event_name и если находит, то запускает его. Эвент представляет из себя обычный метод класса, которому определено соответствие с именем эвента, в нашем примере это event_name. Пример простого экшена:

<?php

class ActionTest extends Action {
        /**
         * Инициализация экшена
         *
         */
        public function Init() {                
                $this->SetDefaultEvent('index');                
        }
        /**
         * Регистрация эвентов
         *
         */
        protected function RegisterEvent() {
                $this->AddEvent('index','EventIndex');
                $this->AddEvent('edit','EventEdit');            
        }
        /**
         * Метод эвуента index
         *
         */
        protected function EventIndex() {               
                $this->SetTemplateAction('index');
        }
        /**
         * Метод эвента edit
         *
         */
        protected function EventEdit() {
                $this->Viewer_Assign('iSomeNumber',12345);
                $this->SetTemplateAction('some_tamplate');
        }       
        /**
         * Вызывается автоматически после выполнения эвента
         *
         */
        public function EventShutdown() {
                $this->Viewer_Assign('sText','Event complete');
        }
}

В данном примере мы создаем экшен ActionTest с двумя эвентами: index и edit. Обязательные методы, которые должны присутствовать в любом экшене, это Init() и RegisterEvent(), в первом происходит инициализация экшена, например, установка дефолтного эвента, а во втором регистрация всех используемых эвентов в данном экшене. Также предусмотрены два дополнительных метода, которые определять не обязательно, этоEventShutdown() и EventNotFound(), первый автоматически вызывается после выполнения текущего эвента, второй вызывается в том случаи, если не найден необходимый эвент. По умолчанию EventNotFound() переадресует управление на экшен error, который показывает 404 HTTP ошибку:

<?php

protected function EventNotFound() {
        $this-&gt;Message_AddErrorSingle($this->Lang_Get('system_error_404'),'404');
        return Router::Action('error');
}

Эвенты (Event)

Регистрация евентов происходит в методе RegisterEvent(), существует два способа зарегистрировать евент, это AddEvent() и AddEventPreg(), второй использует для этого регулярные выражения. Регистрация евентов:

<?php

// Стандартный способ
$this->AddEvent('event_name','EventMethod');

// Через регулярные выражение
/**
* соответствует site.com/action/123.html и site.com/action/123.html/blabla/
*/
$this->AddEventPreg('/^(\d+)\.html$/i','EventMethod');

/**
* соответствует site.com/action/123.html, но не соответствует site.com/action/123.html/blabla/
*/
$this->AddEventPreg('/^(\d+)\.html$/i','/^$/i','EventMethod');

/**
* соответствует site.com/action/123/, site.com/action/123/page1/ ,
* но не соответствует site.com/action/123/blabla/
*/
$this->AddEventPreg('/^(\d+)$/i','/^(page\d+)?$/i','/^$/i','EventMethod');

В примерах выше при запросе правильного URL будет вызван метод EventMethod(), в противном случаи метод EventNotFound(). В AddEvent('event_name','EventMethod') первый аргумент определяет имя эвента, а второй метод, который будет вызван. В AddEventPreg('/^(\d+)\.html$/i','/^$/i','EventMethod')первый параметр определят регулярное выражение для имени эвента, а второй и последующие (кроме последнего) регулярное выражение для параметров. Последний параметр определят название метода для вызова. После выполнения эвента в браузер выводится шаблон, по умолчанию совпадающий с именем эвента. Например, для эвента AddEvent('event_name','EventMethod') будет использоваться шаблон event_name.tpl, расположенный в /templates/skin/skin_name/actions/ActionTest/, где skin_name название скина(общего шаблона), а ActionTest название класса экшена в котором зарегистрирован эвент. Шаблон этот можно переопределить используя метод SetTemplateAction('some_tamplate'), в таком случаи будет использован шаблон /templates/skin/skin_name/actions/ActionTest/some_tamplate.tpl. Также есть возможность из одного эвента передать управление на другой (внутренний реврайт), или даже на другой экшен. Делается это с помощью роутера:

<?php

protected function EventEdit() {
        // некоторый код
        //.....

        return Router::Action('test','edit');
}

В данном примере передается управление в экшен test с эвентом edit, т.е. происходит эмуляция URL http://site.com/test/edit/. Для передачи в шаблон каких-либо данный используется метод Assign($sName,$value) системного модуля Viewer, где $sName будущее имя переменной в шаблоне, а $value её значение:

<?php

$this->Viewer_Assign('iSomeNumber',12345);

Доступные методы Action

  • AddEvent($sEventName,$sEventFunction) - регистрация эвента по имени
  • AddEventPreg($sEventPregName,..,$sParamPregN,..,$sEventFunction) - регистрация евента через регулярные выражения
  • SetDefaultEvent($sEvent) - устанавливает эвент по умолчанию, т.е. тот который будет вызван при URL http://site.com/action/. Данные метод должен вызываться из методаInit()
  • GetDefaultEvent() - возвращает эвент по умолчанию, например, index
  • GetEventMatch($iItem=null) - возвращает элемент совпадения евента по регулярному выражению. Например, если для евента AddEventPreg('/^(page(\d+))$/i','EventMethod')вызвать метод GetEventMatch(2), то он вернет числовое значение равное номеру страницы
  • GetParamEventMatch($iParamNum,$iItem=null) - возвращает элемент совпадения по регулярному выражению для параметров евента. Например, если для евентаAddEventPreg('/^blog$/i','/^new$/','/^page(\d+)$/i','EventMethod') вызвать метод GetParamEventMatch(1,1), то он вернет числовое значение равное номеру страницы
  • GetParam($iOffset,$default=null) - возвращает параметр по его номеру/смещению, $default определяет дефолтное значение в случаи если параметра не существует. Например, для http://site.com/user/ort/edit/fast/ GetParam(0) вернет значение edit
  • GetParams() - возвращает массив текущих параметров, которые были переданные через URL. Например, для http://site.com/user/ort/edit/fast/ вернет значение array('edit','fast')
  • SetParam($iOffset,$value) - устанавливает значение параметра, например, SetParam(0,'add')
  • SetTemplate($sTemplate) - устанавливает шаблон для вывода, используя путь относительно общего каталога шаблонов. Например, SetTemplate('index.tpl') указывает на шаблон /templates/skin/skin_name/index.tpl
  • SetTemplateAction($sTemplate) - устанавливает шаблон для вывода, используя путь относительно каталога шаблонов экшена. Например, SetTemplateAction('index')указывает на шаблон /templates/skin/skin_name/actions/ActionTest/index.tpl. Внимание! При указании шаблона использовать расширение .tpl не нужно!
  • GetTemplate() - возвращает пусть до шаблона относительно общего каталога шаблонов, например, actions/ActionTest/index.tpl
  • GetActionClass() - возвращает имя класса экшена, например, ActionTest

Comments

Login with GitHub to leave a comments