Выносим обработку евентов в отдельный файл
В транковой версии на github.com появилась возможность выносить объемную обработку евентов из экшена в отдельные файлы.
Эти файлы размещаются в каталоге
Рассмотрим более подробно.
Пусть у нас будет экшен
Здесь мы используем новый метод
Сам класс
Как видно из примера, внутри обработчика евента мы имеем свободный доступ кпубличным свойствам и методам, которые объявлены внутри основного экшена. Что очень удобно, это позволит «общаться» внутри кода обработчиков так, как будто сами обработчики находятся внутри класса экшена. Дополнительно из обработчика евента доступны НЕ публичные системные методы, такие как
Надеюсь с новым функционал писать объемные экшены станет гораздо проще. Функционал актуален и для плагинов.
Эти файлы размещаются в каталоге
/classes/actions/[action]/Event[Name].class.php
, где [action]
— это название экшена, которому принадлежит евент, [Name]
— название внешнего обработчика евента.Рассмотрим более подробно.
Пусть у нас будет экшен
ActionBlog.class.php
:<?php class ActionBlog extends Action { public $oUserCurrent=null; public function Init() { $this->oUserCurrent=$this->User_GetUserCurrent(); $this->SetDefaultEvent('index'); } /** * Регистрируем евенты * */ protected function RegisterEvent() { /** * Регистрируем внешние обработчики евентов */ $this->RegisterEventExternal('Topic','ActionBlog_EventTopic'); $this->AddEvent('index','EventIndex'); $this->AddEventPreg('/^topic$/i','/^(\d+)\.html$/i','/^$/i','Topic::EventShowTopic'); $this->AddEventPreg('/^topic$/i','/^list$/i','/^$/i','Topic::EventList'); } protected function EventIndex() { /** * Устанавливаем шаблон для вывода */ $this->SetTemplateAction('index'); } } ?>
Здесь мы используем новый метод
RegisterEventExternal
, он производит регистрацию внешних обработчиков(классов) евентов. Первый параметр — это название(alias) обработчика, второй — полное имя класса обработчика евента. А самое интересное происходит в методах регистрации евентов — вместо простого указания имени метода, который будет вызываться для обработки евента, мы указывает конструкцию вида "Topic::EventShowTopic"
. Где Topic — это и есть название внешнего обработчика, а через :: следует название метода этого обработчика. Здесь важна последовательность — сначала нужно зарегистрировать все обработчики, а уже потом использовать их при регистрации евентов.Сам класс
ActionBlog_EventTopic
находится в файле /classes/actions/blog/EventTopic.class.php
:<?php class ActionBlog_EventTopic extends Event { public function EventShowTopic() { if ($this->oUserCurrent) { var_dump('User id: '.$this->oUserCurrent->getId()); } var_dump('Topic id: '.$this->GetParamEventMatch(0,1)); $this->SetTemplate(false); } public function EventList() { $this->SetTemplateAction('topic_list'); } }
Как видно из примера, внутри обработчика евента мы имеем свободный доступ к
$this->GetParamEventMatch()
и подобные.Надеюсь с новым функционал писать объемные экшены станет гораздо проще. Функционал актуален и для плагинов.
25 комментариев
Т.е. если в ActionBlog.class.php определяется какое-то свойство, то в «дочернем» ивенте ActionBlog_EventTopic->EventList() оно не доступно?
Но свойства-то, как правило, protected объявляются. Как и методы, обращение к которым планируется внутри экшена. Что нарушает принцип инкапсуляции.
Но можно сделать и доступ к protected, это не сложно. Вопрос в практической необходимости.
Но дело даже не в этом. Сейчас, по-моему, во всем движке в экшенах все свойства объявлены, как protected, и нет ни одного объявления public-свойств.
Т.е. если я надумаю написать плагин, использующий внешний ивент, то из этого ивента я не смогу обращаться ни к существующим protected-свойствам, ни к protected-методам. Переопределить тип свойства или метода я тоже не могу. Менять сейчас объявления в движке — это тотально ломать совместимость с плагинами.
Следовательно, в нынешней реализации это годится только в ограниченных случаях, когда на самом деле «внешнему» ивенту не нужно обращаться к свойствам и ко всем методам «родителя».
Требования к минимальной версии PHP изменены официально и окончательно?
будет адаптация к 5.2
Пруф: www.php.net/archive/2010.php#id2010-12-16-1
Пришлось писать такие грабли: Выложил сегодня плагин. Прошло пару и часов и вдруг вижу такую фичу… Спасибо.
То есть по сути требуется сделать множественное наследование. В LS это реализовано путем наследования по цепочке.