- PVSM.RU - https://www.pvsm.ru -
Здравствуйте, хабрапользователи!
В этой публикации мы расскажем о нашей новой нароботке Events class.
Новый класс реализовывает некую систему событий для ImageCMS. Это механизм, который предоставляет возможность разработчику реагировать на возникновение определенных ситуаций в системе, что станет неотъемлемой составляющей для написания более гибких модулей.
Дальше расскажем подробно о том, как мы видим инженерию и вектор будущих развитий.
Начнем с описания общих понятий, которые мы для себя определили; они также будут встречаться в статье дальше. Это:
За каждым участником закреплен некий набор возможных действий. Последовательность может быть изменена, но отклонения, в основном, не значительны, поэтому будем рассматривать смоделированные ниже ситуации как плановые.
Слушатели:
Система:
Запуск обработчиков:
CMSFactoryEvents::runFactory()
— метод, который обходит слушателей с триггером на исполнение (те, которые дождались своего события), и запускает объявленные методы — обработчики;Теперь немного по этапам. И так:
1) На первом этапе пользователь натыкается на роутер и попадает на нужный контроллер. Мы упускаем этот момент, так как его суть не столь важна для понимания принципов работы. Нас интересует лишь момент, когда своим поведением пользователь спровоцирует событие. В таком случае мы добавим к общему пулу данные о самом событии и сопровождающие данные. На этом роль пользователя закончена. А теперь, что не увидел пользователь? Случилось на самом деле два действия, стоящих внимания разработчика.
2) Сработали методы autoload
тех модулей, для которых разрешен запуск (включение автозагрузки осуществляется из администраторской панели переключением тумблера). Именно на этот этап мы решили повесить возможность объявления об ожидании того или иного действия от пользователя. Модули добавляют информацию о готовности принять данные на нужный метод в общий пул. Добавление происходит с помощью конструкции
CMSFactoryEvents::create()
->setListener('callback');
здесь "callback
" и есть тем методом, который будет вызван при состоявшемся событии. Но при каком именно? Есть два пути. Либо указать доступным из перечисленного списка методом связывания данных, например:
CMSFactoryEvents::create()
->onAddToCart()
->setListener('callback');
здесь "onAddToCart
" будет указателем на событие “Добавление в корзину товара”. Другой способ подразумевает передачу вторым параметром метода "setListener
" ключа. Ключ состоит из комбинации класса и метода, разделенных двоеточием. Например, чтобы указать тот же “Добавление в корзину товара”, нужно указать ключ "Cart:add
"
CMSFactoryEvents::create()
->setListener('callback', 'Cart:add');
Разобрались. А куда нас это приведет?
3) По завершению работы контроллера отработают хуки CodeIgniter’a. Система инициирует обход слушателей, и запуск тех, которые дождались «своего» события.
Полный список, доступный на данный момент, мы выложили на wiki [1]
Вот несколько событий для примера:
onAdminPageUpdate — вызывается при изменении статьи;
onAdminPageCreate — вызывается при создании статьи;
onAdminСategoryCreate — вызывается при создании категории;
onAdminСategoryUpdate — вызывается при изменении категории;
onShopProductUpdate — вызывается при изменении товара;
onAddComment — вызывается, когда пользователь оставил комментарий,
и другие…
Модуль «Trash», который добавляет запись о редиректе 301 на категорию, с удаленного продукта. Смотрите
public static function adminAutoload()
https://github.com/imagecms/ImageCMS/blob/development/application/modules/trash/trash.php [2]
Events Class on Github:
https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/BaseEvents.php [3]
https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/Events.php [4]
На данный момент функционал находится на стадии тестирования и доработки. Так же остались нерешенными некоторые вопросы и пути их реализации. Например, триггеры «before/pre» и «after/post» для событий, приоритеты запуска обработчиков и др.
Присоединяйтесь, у нас еще много работы, в том числе по описанию и добавлению событий (GitHub [5]). Оставляя свои комментарии и делясь идеями, вы помогаете развиваться продукту, а также напоминаете себе приятный факт, что являетесь частью ImageCMS OpenSource ;)
P.S. Напомним: ImageCMS Corporate [6] — бесплатная OpenSource система для разработки и управления сайтами, функционал которой решает 95% типичных проблем для корпоративных сайтов.
ImageCMS Shop — система для профессиональной разработки Интернет-магазинов с расширенными возможностями.
Автор: mrKaero
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/cms/35429
Ссылки в тексте:
[1] wiki: http://wiki.imagecms.net/Event_Class#.D0.A1.D0.BE.D0.B1.D1.8B.D1.82.D0.B8.D1.8F
[2] https://github.com/imagecms/ImageCMS/blob/development/application/modules/trash/trash.php: https://github.com/imagecms/ImageCMS/blob/development/application/modules/trash/trash.php
[3] https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/BaseEvents.php: https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/BaseEvents.php
[4] https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/Events.php: https://github.com/imagecms/ImageCMS/blob/development/application/modules/CMSFactory/Events.php
[5] GitHub: https://github.com/imagecms/ImageCMS
[6] ImageCMS Corporate: http://www.imagecms.net/products/imagecms
[7] Источник: http://habrahabr.ru/post/181285/
Нажмите здесь для печати.