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
Вот такая некошерная цепочка вызовов. Намудрили разработчики…
=========================================================================
В 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
Вот такая некошерная цепочка вызовов. Намудрили разработчики…
Комментарии: 7
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
OnDocFormPrerender => OnDocFormRender
OnBeforeDocFormSave => OnDocFormSave
OnBeforeSnipFormSave => OnSnipFormSave
OnBeforeSnipSave => OnSnipSave
и так со всеми событиями.
Что касается событий OnDocFormPrerender и OnDocFormRender, то сначала должно генерироваться событие OnDocFormPrerender, затем OnDocFormRender. Именно так написано в справке:
и именно такая последовательность вызовов реализована в методах классов:
(core/model/modx/modmanagercontroller.class.php) modManagerController::render() сначала вызывает метод firePreRenderEvents(), затем firePostRenderEvents().
Речь о render-событиях?
Поскольку последовательность вызовов, описанная в первом посте, имеет место со всеми render-процессорами, то сабжевая картина будет наблюдаться со всеми render-событиями (и с ресурсами, и со сниппетами, и с шаблонами и с TV и пр.). Другое дело — является ли эта логика вызовов корректной (запланированной) или ошибочной…
github.com/modxcms/revolution/issues/9461
github.com/modxcms/revolution/issues/12260
Если я верно понял, в 2.3.3 должно быть исправлено…