在保存草稿时包含 Composer 自定义字段

最近,我开始调查 Events 插件中的一个问题:如果帖子被保存为草稿,作曲器中显示的活动数据就会丢失。

我尝试修复该问题,但很快发现 Discourse 并没有提供允许我们实现此功能的 API。

我认为从用户体验的角度来看,这是一个重要的功能,并且除了我目前遇到的情况外,还有许多潜在的使用场景。

为此,我提交了一个 PR,通过在 Composer 模型中引入一个新的方法 serializeToDraft 来解决这个问题。该方法会在将帖子保存为草稿时添加这些自定义字段。此外,当草稿重新打开时,这些字段也会被设置到作曲器模型中。

@angus 正在帮助我审查此 PR 的代码,并提出重要的改进建议。

我想了解 Discourse 团队对此功能的看法。

我同意,我们应该为插件提供一个清晰的机制,以便添加和检索与帖子相关的草稿信息。

我和 @angus 已经为此提交了一个拉取请求(PR),详见此处:

有几件事我不太理解:为什么 serializeToDraft 是插件 API 的一部分,而 serializeOnCreateserializeToTopic 却不是?在什么情况下,serializeToDraft 在没有另外两个方法时仍然有用,反之亦然?是否应该提供一个封装器,同时处理帖子/主题和草稿的序列化?

是的,同意。你也可以为这些提交 PR。

我遇到了另一个问题:saveDraft() 方法该如何处理?似乎需要为通过 serializeToDraft() 添加的字段设置一个观察者,类似于这个:

否则,如果仅自定义草稿字段发生变化,草稿将不会被发送到端点。
因此,saveDraft() 也应该成为 API 的一部分,或者实际上应该以某种方式将其抽象化。
我还在 composermodel 中发现了这个 dataChanged 观察者。我认为很奇怪,我们竟然有两个观察者在监视同一件事。该观察者内部的逻辑很可能也需要针对自定义草稿字段触发。我也想知道这两个观察者中哪一个会先运行,以及会产生什么影响。