OnDocFormRender генерир раньше OnDocFormPrerender

Удивительно, но это факт. При открытии окна редактирования ресурса вывожу сообщение в логи с текстом ($modx->event->name). Сначала получаем OnDocFormRender, затем OnDocFormPrerender.

=========================================================================
В core/model/modx/modmanagercontroller.class.php абстрактный класс modManagerController в методе render() сначала вызывает метод firePreRenderEvents() (ничего не делает), затем firePostRenderEvents() (ничего не делает).

В manager/controllers/default/resource/resource.class.php класс ResourceManagerController, наследующий modManagerController, в методе firePreRenderEvents() генерирует событие OnDocFormPrerender. При этом метода firePostRenderEvents() класс ResourceManagerController не имеет. Но зато имеет метод fireOnRenderEvent(), генерирующий событие OnDocFormRender и который нигде не вызывается.

В manager/controllers/default/resource/update.class.php класс ResourceUpdateManagerController, наследующий ResourceManagerController, имеет свой метод process(), который вызывает метод fireOnRenderEvent() => генерируется событие OnDocFormRender. Затем метод ResourceUpdateManagerController::process() ничего больше не генерирует и базовый process() не вызывает.

В итоге:
1) Объект modManagerResponse (core/model/modx/modmanagerresponse.class.php) в методе outputContent() вызывает $this->modx->controller->render()
2) Затем modManagerController::render() вызывает ResourceUpdateManagerController::process(), который вызывает ResourceUpdateManagerController::fireOnRenderEvent() => генерируется событие OnDocFormRender.
3) Далее по коду modManagerController::render() вызывает ResourceManagerController::firePreRenderEvents() => генерируется событие OnDocFormPrerender

Вот такая некошерная цепочка вызовов. Намудрили разработчики…
Cyrax_02
12 января 2015, 22:03
modx.pro
2 977
0

Комментарии: 7

Виталий Киреев
13 января 2015, 09:30
0
Там все события такие. OnSomething везде это самое начало действия Something.
    Cyrax_02
    13 января 2015, 12:16
    0
    Наоборот. On (без Pre и без Before) — это после (в конце) выполнения события:
    OnDocFormPrerender => OnDocFormRender
    OnBeforeDocFormSave => OnDocFormSave
    OnBeforeSnipFormSave => OnSnipFormSave
    OnBeforeSnipSave => OnSnipSave
    и так со всеми событиями.

    Что касается событий OnDocFormPrerender и OnDocFormRender, то сначала должно генерироваться событие OnDocFormPrerender, затем OnDocFormRender. Именно так написано в справке:
    Event: OnDocFormPrerender
    Fires before a Resource editing form is loaded in the manager.
    Event: OnDocFormRender
    Fires after a Resource editing form is loaded in the manager. Useful for inserting HTML into forms.
    и именно такая последовательность вызовов реализована в методах классов:
    (core/model/modx/modmanagercontroller.class.php) modManagerController::render() сначала вызывает метод firePreRenderEvents(), затем firePostRenderEvents().

    Там все события такие. OnSomething везде это самое начало действия Something.

    Речь о render-событиях?
    Поскольку последовательность вызовов, описанная в первом посте, имеет место со всеми render-процессорами, то сабжевая картина будет наблюдаться со всеми render-событиями (и с ресурсами, и со сниппетами, и с шаблонами и с TV и пр.). Другое дело — является ли эта логика вызовов корректной (запланированной) или ошибочной…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
7