我正在迁移,不再使用已弃用的 api.modifyClass("model:composer", ...)。
我当前对 Composer#save 的重写会根据条件改变保存行为,但其他情况下需要调用 super.save(opts)。
我看到了新的 addModelMethod / addModelCallback API,但我无法在核心代码中找到使用 addModelMethod 来重写现有方法同时保留对原始实现访问权限的示例。
addModelMethod 是否旨在用于像这样重写现有的模型方法?如果是,插件应如何委托给原始的 save() 实现?
或者,针对这种 Composer 用例,是否有其他扩展点应该使用?
我想这取决于你希望重写 save 方法来实现什么功能……
如果你希望基于某些条件阻止保存,可以使用我们的 composer-service-cannot-submit-post 值转换器
如果你想在帖子创建后执行某些操作,可以使用 api.onAppEvent("post:created")
如果你是想添加一个字段,可以使用 api.serializeOnCreate
这些方法中有符合你需求的吗?
谢谢!我已经在用 composer-service-cannot-submit-post 了——它处理服务级的检查。但是编辑器模型的 save() 方法也会检查 cantSubmitPost,其中包含 missingReplyCharacters > 0,所以空正文仍然会被拦截。
onAppEvent("post:created") 为时已晚,因为帖子根本没有被创建,而 serializeOnCreate 只是向请求中添加字段,所以它对正文长度验证没有帮助。
因此,剩下的问题是如何绕过 missingReplyCharacters / cantSubmitPost 以允许发布第一条帖子。是否有官方支持的扩展点来实现这一点?
以下是当前的初始化器供参考:
@david,如果你能就这里最佳的处理方式提供一些建议,我将不胜感激。
david
(David Taylor)
5
最佳方案是在 Discourse 核心中添加一个新的钩子(hook),以便你能够以受支持的方式实现所需的功能。类似这样的实现如何:
这样,你的插件就可以执行以下操作:
api.registerValueTransformer(
"composer-minimum-post-length",
({ value, context: { composer } }) => {
if (
composer.siteSettings.discourse_optional_topic_body_enabled &&
composer.topicFirstPost
) {
return 0;
}
return value; // 保留核心逻辑
}
);
如果这符合你的使用场景,请告诉我,我会将该 PR 从草稿状态移除,并推动其进行审查和合并。
谢谢 David!我测试了 composer-minimum-post-length 转换器,它运行正常——正文为空的帖子可以成功创建。
我注意到一点:编辑器仍然显示 “Post can’t be empty”(帖子不能为空),因为 composer-editor 中的 validation 包含一个硬编码的 replyLength < 1 检查,而该检查并未使用 minimumPostLength。
这个检查是否也能尊重转换器的设置,或者在 minimumPostLength 为 0 时被跳过?
现在完全正常了。非常感谢你添加了这一功能,@david!