Апостроф-CMS PageBeforeSend, специфичный для модуля - PullRequest
1 голос
/ 19 мая 2019

У меня есть модуль, расширяющий апостроф-пользовательские страницы. Я пытаюсь добавить дополнительные данные в запрос страницы (асинхронно, предотвращая использование помощника).

Я надеялся подключиться к событию pageBeforeSend, но потом понял, что оно работает для КАЖДОГО запроса страницы, даже если он не попадает на страницы в модуле.

Существует ли эквивалентный метод для pageBeforeSend, который будет вызываться, только если запрашиваемая страница действительно находится в модуле, где определен метод?

В настоящее время я использую диспетчеризацию, чтобы справиться с этим, но я надеялся, что может быть лучший способ.

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Короткий ответ на ваш вопрос - нет. В Apostrophe 2.x (текущая стабильная версия) вы должны решить для себя, заинтересована ли ваша функция pageBeforeSend в конкретном документе, и немедленно возвратить или вызвать обратный вызов (если он у вас есть), если он не имеет значения.

Однако вот более длинный ответ, который может пролить больше света на этот вопрос для вас.

Метод pageBeforeSend является особенным: он вызывается для каждого модуля, в котором он существует . Это известно как callAll метод.

Таким образом, в методах callAll вы несете ответственность за решение, соответствует ли запрос или документ вашим интересам или нет. И если вы посмотрите на наши собственные обработчики методов callAll, вы заметите, что если есть какие-либо сомнения, мы всегда начинаем с немедленного вызова обратного вызова и возврата, если запрос или документ не релевантны.

Обратите внимание, что в новом коде вы должны , а не писать новые обработчики callAll. Вместо этого вы должны написать обработчики событий обещания . Это рекомендуется в 2.x, а в 3.x это будет единственным способом. Однако в 2.x ваш вопрос имеет тот же ответ при написании обработчиков событий обещания: вы должны определить, соответствует ли запрос или документ вашим интересам, а если нет, вежливо вернуться, ничего не делая.

В 3.x мы будем улучшать это. Код 3.x (в значительной степени незавершенная работа, не готов к проектам!) Генерирует события типа beforeInsert через модуль менеджера документов для рассматриваемого документа, но позволяет вам решить, перехватывать ли их по имени этого модуля, или через родительский класс, такой как apostrophe-doc-type-manager (соответствующий всем beforeInsert событиям для всех типов документов) или apostrophe-pieces (соответствующий всем beforeInsert событиям для частей, но не для страниц).

0 голосов
/ 22 мая 2019

Если вы хотите применить это поведение к вашему конкретному модулю, но не к другим страницам, вы должны добавить метод pageBeforeSend в этом модуле.

Вы можете увидеть аналогичный пример в документации с модулем, который расширяет апострофы, и они изменяют beforeSave, но только для этого модуля, не влияя на другой.

https://docs.apostrophecms.org/apostrophe/tutorials/getting-started/reusable-content-with-pieces#customizing-the-model-layer-setting-the-title-automatically

...