使用主题组件编辑帖子

我偶然想到了一个主意,允许拥有帖子编辑权限的用户(TL4+ 用户)选择文本并将其转换为代码块。

在参考了 Discourse AI 插件代码的一些部分并查看了传递给我的插件出口的数据后,我编写了获取所选文本的代码,并使用 quote-share-buttons-before 出口将其包装在代码围栏中。

然后,我现在有点卡住了。清单插件(不知何故)通过 checklistSyntax 函数中的一个名为 postDecorator 的参数来实现这一点,他们可以使用 .getModel() 获取模型(我认为是 post 模型?)。我不知道它是如何传递的,但我认为在我的设置中对我来说是不可用的?

如果清单插件中确实使用的是 post 模型,那么我似乎很难找到 models/post.js 中存在的简单的“保存”函数,除非我理解错了。

await postModel.save({
  raw: newRaw,
  edit_reason: i18n("checklist.edit_reason"),
});

我目前正在使用 this.args.outletArgs.data.editPost(this.post)(如果我没记错的话,它在 models/topic.js 中,但如果我错了请纠正我),它只打开作曲家来编辑帖子,而不是直接编辑。

所以我的问题是——我该如何像清单插件那样轻松地编辑帖子?如果我将按钮放在出口而不是清单所做的 api.decorateCookedElement 中,是否有办法做到这一点?最好不要使用 REST API?

我的仓库:

谢谢!

好的,我想我现在越来越近了。

我尝试了 this.post.save(),它“有效”——看起来 PUT 请求已经通过(底层使用了 ajax),但遇到了一个几乎没有信息的错误。但那是在这之前……

this.post.save() 有效。唯一的问题是下面列出的问题:

我的函数现在是这样的:

@action
async addCodeFences() {
  let selectedText = this.selectedText;
  let newText = "```" + "\n" + selectedText + "\n" + "```";

  let post = this.post;
  console.log(this.post.cooked); // 有效
  
  let rawPost = post.raw; // 不存在!!
  console.log(rawPost); // undefined!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // 错误,因为 rawPost 是 undefined!

  await this.post.save({
    raw: rawPost,
    edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
  });
}

不知何故,我无法获取帖子的原始内容,只能获取已烹饪的内容。除了进行 ajax 请求之外,还有其他方法可以做到吗?我似乎找不到 raw 作为帖子的属性之一……它不包含在内是有原因的吗?

附注:我正试图不求助于 Ask Discourse。我将非常感谢任何帮助!


编辑:我认为每个帖子都基于 此 API 请求?并且响应似乎没有 raw 作为 JSON 键之一 :face_exhaling:

是的,没错——我们在默认响应中不包含 raw。它对于正常渲染来说不是必需的,因此包含它在数据传输/速度方面有点浪费。

最好的办法是在需要时发出额外的 ajax 请求。正如你所发现的,checklist 插件就是这样一个很好的例子

1 个赞

好的,谢谢。我会处理那个 ajax 请求。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.