Apostrophe-CMS PageBeforeSend 特定于模块

Apostrophe-CMS PageBeforeSend Specific to Module

我有一个扩展 apostrophe-custom-pages 的模块。我正在尝试将一些额外的数据添加到页面请求中(以异步方式,防止使用助手)。

我原本希望挂接到 pageBeforeSend 事件,但后来意识到它会针对每个页面请求运行,即使是那些实际上并未访问模块中的页面的请求。

是否有与 pageBeforeSend 等效的方法,只有当请求的页面实际上在定义该方法的模块中时才会被调用?

我目前正在使用 dispatch 来处理这个问题,但我希望有更好的方法。

如果您想将该行为应用于您的特定模块而不是其他页面,您应该在该模块中添加 pageBeforeSend 方法。

您可以在文档中看到一个类似的示例,其中包含一个扩展 apostrophe-pieces 的模块,它们修改了 beforeSave 但仅针对该模块而不干扰其他模块。

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

对您的问题的简短回答是否定的。在 Apostrophe 2.x(当前的稳定版本)中,您必须自己决定您的 pageBeforeSend 函数是否对特定文档感兴趣,并且 return 或立即调用回调(如果有的话)不相关。

然而,这里有一个更长的答案,可能会为您提供更多关于问题的信息。

pageBeforeSend 方法很特殊:它会为 它存在的每个模块 调用。这被称为 callAll 方法。

因此在 callAll 方法中,您负责决定请求或文档是否与您的兴趣相关。如果您查看我们自己的 callAll 方法处理程序,您会注意到,如果有任何疑问,我们总是首先立即调用回调,如果请求或文档不相关,则 returning。

请注意,在新代码中您应该而不是编写新的callAll处理程序。您应该改写 promise event handlers。在 2.x 中推荐这样做,在 3.x 中这将是唯一的方法。然而,在 2.x 中,你的问题在编写 promise 事件处理程序时有相同的答案:你必须确定请求或文档是否与你的兴趣相关,如果不相关,礼貌地 return 什么都不做。

在3.x中,我们将对此进行改进。 3.x 代码(非常重要的工作正在进行中,尚未为项目做好准备!)通过文档管理器模块针对相关文档发出 beforeInsert 之类的事件,但让您决定是否通过该模块捕获它们模块的名称,或通过父级 class,如 apostrophe-doc-type-manager(匹配所有文档类型的所有 beforeInsert 事件)或 apostrophe-pieces(匹配片段的所有 beforeInsert 事件,但不适用于页面)。