主题ID作为变量?

是否可以在主题内将主题 ID 作为变量获取?

用例,我们有支持和错误跟踪工单的类别。我想像这样使用模板设置它们。
这个:

> **不要**删除此行:支持请求 #$(topicid)

看起来像这样:

不要删除此行:支持请求 #246

欢迎其他获取信息的方式。只是不确定如何做到这一点。

1 个赞

您是想把主题ID放在主题的原始帖子中吗?

这会解决什么问题?

1 个赞

这将解决我告诉支持人员他们需要先创建一个新主题,然后保存它,然后查看 URL 并获取 ID #,然后返回并编辑主题以便手动将 # 放入正文中的问题。

您在此用例中在 OP 正文中使用主题 ID# 是为了什么?

1 个赞

票证/错误的唯一ID #。

那个工单/bug 在哪里?ID 在 URL 中;它在那里是持久的且永远不会出错。在主题的文本中有主题 ID 有什么用?而且,正如你指出的那样,如果它在消息的正文中,任何人都可以更改、删除或输入错误。

有什么东西在使用主题 ID 吗?如果是,是什么以及如何使用?

1 个赞

创建自定义组件以将其附加到正确帖子会比填充模板更容易。

如果您在 admin > themes & components 下编辑主题的代码……并将其添加到 JS 选项卡,经过一些调整后,应该就能实现您想要的效果:

import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // 主题中的第一帖
    const desiredCategories = [45, 3]; // 您希望显示此内容的类别 ID 的逗号分隔列表
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- 您可以编辑下面的内容,{{this.topicId}} 将会填充主题 ID -->
      此主题的 ID 是
      {{this.topicId}}
      <!-- 您可以编辑上面的内容 -->
    {{/if}}
  </template>
}

export default apiInitializer((api) => {
  api.decorateCookedElement((element, helper) => {
    const wrapper = document.createElement("div");
    wrapper.className = "custom-topic-id"

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});

您可以从 URL 中找到类别 ID 来配置 desiredCategories,例如,Meta 上的支持类别 ID 为 6。

您可以使用 CSS 来根据需要设置样式,例如:

.custom-topic-id {
  display: inline-block;
  background: yellow;
}

3 个赞

是的,可能会拼写错误。因此,如果您使用变量,则不必担心拼写错误。

这很有帮助,因为我是用户,并且我希望我的工作流程就这样设置。

您目前无法按主题 ID 搜索 Discourse。如果 # 存在于主题的正文中,那么它现在就是搜索结果的一部分。

所以,我可以告诉同事:“嘿,搜索 bug #138 并告诉我你的想法。”

这样,南希就可以轻松地访问该网站并搜索 138 并获得结果。

2 个赞

你不需要搜索:

/t/-/id – 但实际上 /t/id 也可以。

他们可以只输入 /t/138 而不必搜索。但是,如果你在与人交谈,说“搜索关于‘他们知道的某些词’的 bug”在对话中比使用数字更有意义,不是吗?

这也将是我的另一个建议。

我认为我会使用 renderInOutlet 而不是 decorateCookedElement,但这可能是因为我不完全理解 decorateCookedElement

但这不会让你按 topic_id 搜索 bug/主题。

1 个赞

我会测试一下。感谢提供信息。那是身体的哪个部分会变得可搜索?

但我需要搜索。这样更方便。
去网站,然后在窗口顶部的 URL 后面加上 /t/id,而不是去网站然后把 ID 输入到页面中央的搜索框里。

如果我和别人交谈,或者在写消息,是的,数字比“搜索可能长达 5 个词的精确标题”更简洁,出错的可能性也更小。

我会研究一下,但如果它会影响在搜索字段中使用,那么它对我来说就行不通。

我真的很喜欢 Discourse,并且从这里的所有人那里得到了大量有用的反馈和帮助。
我不明白的是,有时人们会告诉我“你不应该那样做,因为这样做更好。”嗯,不,这样做对你更好,但那样做对我更好。两者都没有错。

3 个赞

是的,那就不必费心了,不幸的是,它只会在主题呈现时将内容附加到主题中……它不会将其添加到数据库以使其可搜索。我认为您最终需要一个自定义插件或一个添加到 Discourse Automation 的自定义脚本才能实现完全自动化。

按主题 ID 搜索或将其包含在模板中并不是一个常见的请求,因此我们不直接支持。

我认为这是因为这里的常客知道我们目前没有这个功能,所以我们试图通过找出一些潜在的变通方法来支持你。

2 个赞

而且,如果你回顾一下,你可能会找到一个更好的解决方案。

如果你真的想在文本中嵌入主题ID以便在搜索中找到它,那么你需要一个插件,它可以将ticket123添加到原始文本中(我认为搜索会查看原始文本?)。主题ID在你创建主题之前就不存在,所以你无法在创建时插入它。

哦!也许你想要的是一个插件,当某个bug类别中的主题被创建时,它会添加一个标签bug123。然后你可以将它称为#bug123,并在你提到它的任何地方链接它,并且能够搜索。如果你是自托管或企业版,那并不难。我想在#marketplace有人会以250到500美元的价格为你做这件事。

或者,如果你想通过编号“搜索”bug,你可以添加一个主题组件,让你在“bug框”中输入它并直接跳转到那里。也许那是一个可行的解决方案,而且不需要插件。

1 个赞

我最终得到了一个更不显眼的显示主题 ID 的方法。它仍然无法搜索,但只要我真正需要的功能还没有实现,我就会接受它。

<script type="text/discourse-plugin" version="0.5">
api.decorateWidget('post-meta-data:after', dec => {
  if (dec.attrs.post_number === 1) {
    const topic = dec.getModel().get('topic');
    return dec.rawHtml(`<div class="post-info topic-id"><b>&nbsp#${topic.get('id')}</b></div>`);
  }
});
</script>

问题是这段代码现在已经过时了,我不知道如何修复它。
为了兼容,它应该更新成什么?

我创建了 GitHub - literatecomputing/discourse-custom-components 作为执行此操作的示例。

这是一个插入组件的简单示例。因此,您将在 \u003ctemplate\u003e 之前添加一些代码来获取主题 ID 和显示逻辑。

我认为您可能希望使用 topic-list-before-link 作为插件插口。

我什么都不懂。我不是程序员。
我发布的代码的作用是:


用你的代码怎么实现呢?

如果我没记错的话,在搜索栏中输入 topic:id 应该会在结果中显示该主题。

例如,搜索 topic:374168 this 只会显示此主题中的帖子。

我想知道……一个发送 ajax 请求来更新主题原始文本的 TC 是否足够?

1 个赞

这只适用于当前主题,试试另一个随机主题。尝试搜索“one two four two four zero”,这是标签横幅的主题 ID。

您的意思是 topic:124240? 填充词(“hello”)只是一个例子。在“Tag Banners”的情况下,“hi”可以。也许如果您在支持工单中有常用词,或者只是一个常用词,您可以尝试一下?

你试过 Topic ID as a variable? - #7 by awesomerobot 上的代码了吗?

另外,如果你想做的是“搜索”一个主题 ID,那么你或许可以创建一个组件,它接受一个主题 ID,然后直接跳转到该主题。

1 个赞