К содержимому

Как устроены события (хуки) в InstantCMS 2

Записываю для себя, как устроены события в InstantCMS — пока разбирался, пришлось перечитать код ядра. Если коротко: почти всё расширение без правки ядра держится на событиях. Ядро и компоненты вызывают событие, а любой контроллер может на него подписаться.

Как подписаться

Подписка хранится в таблице

  1. cms_events
: имя события и имя контроллера-слушателя. Сам обработчик лежит в папке
  1. system/controllers/<контроллер>/hooks/
, имя файла совпадает с именем события.

  1. // system/controllers/mystore/hooks/content_before_item.php
  2. class onMystoreContentBeforeItem extends cmsAction {
  3.  
  4. public function run($data) {
  5. list($ctype, $item, $fields) = $data;
  6. // ...меняем данные...
  7. return [$ctype, $item, $fields];
  8. }
  9. }

Два вида вызова

    1. cmsEventsManager::hook()
    — данные проходят по цепочке обработчиков, каждый возвращает изменённый результат.
    1. cmsEventsManager::hookAll()
    — каждый обработчик возвращает свой кусок, результаты собираются в массив (например, HTML для вставки в страницу).

Главное правило: обработчик должен вернуть данные в том же формате, в каком получил, иначе сломает цепочку для остальных.

Пригодилось? Можно сказать спасибо

Дополнения бесплатные. Если какое-то сэкономило вам время — можно закинуть на кофе. Это необязательно, но очень приятно и мотивирует делать дальше.

100 ₽ · 300 ₽ · 500 ₽
—
26
Нет комментариев. Ваш будет первым!