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
Там все события такие. OnSomething везде это самое начало действия Something.
Наоборот. On (без Pre и без Before) — это после (в конце) выполнения события:
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 и пр.). Другое дело — является ли эта логика вызовов корректной (запланированной) или ошибочной…
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 и пр.). Другое дело — является ли эта логика вызовов корректной (запланированной) или ошибочной…
Пиши в modx.com
Т.е. логика вызовов некорректна?
Думаю нет. Pre должен быть раньше.
Пиши в modx.comУже в процессе:
github.com/modxcms/revolution/issues/9461
github.com/modxcms/revolution/issues/12260
Если я верно понял, в 2.3.3 должно быть исправлено…
Да, чето я перепутал, сам же писал в github.com/modxcms/revolution/issues/9461 про after.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.