如何以编程方式检索主题的external_id

大家好,

我需要以编程方式检索主题的 remote_id。背景是:我正在 api.onPageChange 上运行一个脚本,该脚本检索当前主题/类别/组的信息,然后对外部系统进行 Ajax 调用以获取更多特定于实体的​​信息。

我有一个(ember?)api.onPageChange 事件正在运行,并且似乎可以获取除 remote_id 值之外的所有我需要的信息(我使用的是 API 中的字段名称)。

我目前的代码:

const topicController = api.container.lookup(“controller:topic”);
if (topicController) {
const thisTopic = topicController.get(“model”);
if (thisTopic) {
console.log(thisTopic.category.id); // 仅作示例…完美运行。

.. 我可以获取各种字段,一切都运行得非常好.. 我找不到如何获取 Remote ID(我需要它)。我知道我可以通过 JSON 调用获取它(在当前页面 URL 后面添加 .json),但这似乎效率不高.. 或者我错了,我应该使用那种方法吗?还有其他建议吗?

提前感谢!

1 个赞

只是为了确认一下,remote_id 是您要查找的字段的实际名称吗?我不记得 Discourse 使用过该字段。

4 个赞

啊……抱歉 @simon(感谢你查看我的问题)……“external_id”是正确的名称,符合 API 的要求。

我想我实际上是在检查正确的名称(external_id),但在写问题时记错了……但我确实需要检查一下。我现在不能这样做,但我今天晚些时候会在这里回复。

再次感谢,我很感激!

1 个赞

所以……我错误地寻找了错误的字段/值,而不是正确的(external_id)。抱歉浪费时间……如果有什么安慰的话,我首先浪费了很多自己的时间 :frowning: :slight_smile:

坏消息是——我在 Ember 模型中找不到 external_id。我对 Ember 不熟悉,所以只是随便看看……我能找到很多其他非常有用的 Topic 信息,就是找不到 external_id(我已经将 Topic 模型记录到控制台,并且一直在翻找)。

有什么提示吗,@simon 或其他人?再次感谢。

1 个赞

external_idSingleSignOnRecord 模型的一个属性。当使用 DiscourseConnect 通过外部站点将用户登录到 Discourse 时,它用于将用户链接到外部站点。如果您要查找的是这个属性,它在 Topic 上是不可用的。据我所知,Discourse 只在前台为 CurrentUser 返回 external_id,所以如果您想获取 topic 作者的 external_id,可能会比较棘手。

如果您发布更多关于您想实现的目标的细节,这里可能会有人能够帮助您。可能有一些比您正在尝试的方法更简单的方法来解决这个问题。

没关系。这就是我们在这里的目的 :slight_smile:

4 个赞

非常感谢,各位!

因此,我希望运行多个 Discourse 实例,以及一个在后台运行的总体(非 Discourse)管理/协调系统。主题将通过以下两种方式之一添加到 Discourse 中 - 要么由用户通过常规的 Discourse 主题创建机制添加,要么由管理/协调系统通过 API 添加。

通过 API 创建主题的地方,它通常代表一个任务或类似的流程项,该项将已经拥有自己的非 Discourse ID…我们称之为“外部 ID”。

当主题由用户在 Discourse 中创建时,我们将使用 Webhook 触发一个 Azure 函数,在中央系统中创建一个存根状的克隆(以便 Discourse 消息能够连接到更广泛的内容流、任务等)。因此,同样,Discourse 主题间接会有一个唯一的“外部 ID”——我们建议通过 API 更新主题。

我们有一个定制的 Discourse 主题组件,当每个主题加载时,它将使用 Ajax 从中央系统检索非 Discourse 中心信息,并将其显示在主题屏幕上。

虽然我们可以使用 Discourse 主题 ID 来参数化 Ajax 调用并查找匹配的数据,但使用“外部 ID”进行此操作更有效(这更简洁,有多种原因——它避免了查找等)。

我们可以轻松地将“外部 ID”存储在自定义字段中——我们已经有一个用于其他数据——但我们注意到 Topics API 有一个“external_id”字段,它看起来正是我们需要的,并且我更愿意出于各种原因使用它……它只是让这个有些关键的字段更容易包含在报告、导出、未来的搜索等中。

请参阅 Discourse API Docs 的屏幕截图

我猜这是一个相当新的字段——论坛上的大多数建议似乎都与用户 external_id 字段有关,而这正是我现在需要的。如上所述,我正在检索主题的 Ember 模型(在我自定义的主题组件中),并且可以通过它获取关于主题的几乎所有信息……但无法获取 external_id 字段。

(如上所述——我正在使用这段代码获取主题,这段代码是从本网站的某个地方借来的,目前不知道是哪里:

            const topicController = api.container.lookup("controller:topic");
            if (topicController) {
                const thisTopic = topicController.get("model");      

所以,请求是——特定于主题的 external_id 字段是否隐藏在模型(“thisTopic”)的某个地方,或者我是否误解了这些概念,应该直接使用自定义字段来存储这个外部 ID(我知道我可以让这种方法奏效,并且知道如何做!……我只是更喜欢使用独立的 external_id 的简洁性和未来可扩展性,如果它确实可用的话)。

再次感谢您的帮助,我非常感激!

1 个赞

我以前从未注意到。几年前我曾寻找类似的东西来将 WordPress 的帖子 ID 与 Discourse 主题关联起来。

主题的 external_id 仅在主题具有 external_id 时才作为属性返回给客户端,因此如果主题没有,您将不会获得 null 值。对于确实具有 external_id 的主题,这对我来说是有效的:

<script type="text/discourse-plugin" version="0.11.0">
api.onPageChange (() => {
    const c = api.container.lookup("controller:topic");
    if (c) {
        const m = c.get("model");
        if (m && m.hasOwnProperty('external_id')) {
        console.log("the external_id is ", m.external_id);
        }
    }
});
</script>
3 个赞

就像这样,“不可能”变成了“太棒了” :slight_smile: .. 太棒了,这对我来说是个游戏规则的改变者。我没想到模型会是可变的,但这完全说得通。

非常感谢,@simon,包括你提供的优雅代码片段!

2 个赞