特定于模块的Apostrophe-CMS PageBeforeSend

时间:2019-05-18 21:01:49

标签: apostrophe-cms

我有一个扩展撇号自定义页面的模块。我正在尝试向页面请求中添加一些额外的数据(以异步方式,以防止使用帮助器)。

我原本希望挂接到pageBeforeSend事件,但是后来意识到它可以为每个页面请求运行,即使那些实际上没有触及模块中页面的事件也是如此。

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

我目前正在使用调度程序来处理此问题,但我希望可能会有更好的方法。

2 个答案:

答案 0 :(得分:1)

您的问题的简短答案是“否”。在Apostrophe 2.x(当前的稳定版本)中,您必须自己确定pageBeforeSend函数是否对特定文档感兴趣,如果不相关,则立即返回或调用回调(如果有)。< / p>

但是,这里的答案较长,可能会为您解答更多问题。

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

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

请注意,在新代码中,您应该编写新的callAll处理程序。您应该改写promise event handlers。在2.x中建议这样做,而在3.x中则是唯一方法。但是,在2.x版本中,编写promise事件处理程序时,您的问题具有相同的答案:您必须确定请求或文档是否与您的兴趣相关,否则,请不做任何事情而礼貌地返回。

在3.x中,我们将对此进行改进。 3.x代码(很多工作仍在进行中,还没准备好进行项目!)通过相关文档的文档管理器模块发出诸如beforeInsert之类的事件,但是让您决定是否通过该模块的名称来捕获它们。 ,或通过类似apostrophe-doc-type-manager(匹配所有doc类型的所有beforeInsert事件)或apostrophe-pieces(匹配所有beforeInsert的事件,而不是页面)的父类。

答案 1 :(得分:0)

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

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

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