attj
1
您好,我目前正在开发一个特定的插件,但还没有找到切入点(我已经阅读了这里的介绍性材料,并安装了一些简单的插件并稍微研究了它们的源代码)。
**设置:**我有一个 CSV 文件,其中包含系统中的多个用户名以及他们相关的标签。例如,条目“user1, tag#1”表示“user1 了解 tag#1”。许多用户可以与一个标签相关联,一个用户也可以与多个标签相关联。此外,此 CSV 文件会不时更新(几乎每天一次)。该文件与托管 discourse 实例的服务器位于同一台服务器上。
**插件的理想工作方式:**我将通过一个示例 CSV 和一张图片来解释这一点。
CSV:
userOP, tag#1
userOP, tag#2
user2, tag#1
给定此 CSV,每当创建一个包含 CSV 中任何标签的主题时(主题作者可能不在列表中)。理想的输出应如下所示:
此外,用户可以在其用户面板上看到他们已知的标签,这些标签是可点击的链接,还有一个名为“已知标签”的附加选项卡:
理想情况下,可以通过左上角的菜单快速访问此选项卡:
也就是说,根据 CSV 中定义的关联,对于在他们相关的标签下发帖的任何用户(OP 或其他用户),都应该有一个小的文本或徽章。
我愿意接受有关如何实现这一目标的建议。
pfaffman
(Jay Pfaffman)
2
在 Rails 端,你需要将用户/标签关系添加到序列化器中,以便前端可以使用这些数据。查找其他调用 add_to_serializer 的插件,或者在 Discourse 源代码中搜索它,那里有详细的文档。
然后,你就可以在 Ember 中使用插件出口将其添加到页面中。主题组件文档中有相关示例。
我可能会添加一个路由来管理自定义用户字段,而不是使用 CSV 文件,但如果你想走 CSV 路线,你可能需要一个每小时读取一次的作业,所以请查找 jobs/scheduled 中的插件。
有一个名为 all_the_plugins 的 Discourse 仓库,我有时会用 grep 来查找示例。如果你浏览 github.com/discourse,应该能找到它。
attj
3
感谢您提供的信息。我目前的思路是,应该为标签(如 tag_description)添加一个名为 attached_users 的自定义字段。对于上面的例子,tag#1 应该有 attached_users: [“userOP”, “user1”]。
然后,我应该以某种方式将其添加到序列化器中,并找出如何在帖子中显示它。
在思考这个问题时,我还有另一个想法。如果我使用 discourse assign (Discourse Assign) 来根据标签将这些用户分配给主题。我已经可以从主题中检索到这些信息,并且我认为显示它会更容易。但是,discourse assign 不提供任何以编程方式添加用户的方法。
pfaffman
(Jay Pfaffman)
4
使用 assign 似乎是个好主意。我很确定你可以通过 API 添加用户。请参阅 如何逆向工程 Discourse API。
attj
5
我想知道这是否会给服务器带来太大负担。因为会有很多分配,而在之前的想法中,它本质上只是分配给标签,而不必单独分配给每个主题。
pfaffman
(Jay Pfaffman)
6
使用现有且受维护的插件将比开发和维护自己的插件容易得多。
angus
(Angus McLeod)
7
您可以使用一个简单的插件来完成此操作。
您需要做什么
该插件需要执行以下操作:
-
添加一个名为 known_tags 的用户自定义字段,它是一个字符串列表。
-
在用户个人资料中添加一个界面,供用户编辑 known_tags。我认为没有必要为此添加一个全新的个人资料选项卡,但您可以这样做。如果您不希望用户自己编辑,只需将其设置为仅管理员可编辑,然后进入用户个人资料并根据您的 CSV 文件进行更新。
-
添加一个事件挂钩,该挂钩使用 PostCreator 中的 before_create_post 或 post_created 事件,根据主题中的标签将所需内容添加到帖子中。
如何操作
第 1 部分和第 2 部分与下面链接主题中的其他模型示例插件非常相似。尝试通过类比来弄清楚。如果您真的卡住了,可以向我寻求提示。
第 3 部分也将放在您的 plugin.rb 文件中。它看起来会像这样
on(:post_created) |post, opts, user|
if post.is_first_post? && post.topic.tags.present?
user_ids = UserCustomField.where(name: 'known_tags', value: post.topic.tags).pluck(:user_id)
usernames = User.where(id: user_ids).pluck(:username)
new_raw = post.raw + "something something #{usernames}"
PostRevisor.new(post).revise!(
user,
{
raw: new_raw,
edit_reason: "some reason"
},
skip_validations: true,
bypass_bump: true
)
end
end
自己尝试一下。如果您真的卡住了,我会提供帮助。如果能有有力证据表明您正在自己尝试解决问题,我将更倾向于提供帮助 
2 个赞
attj
8
非常感谢您提供了一份非常好的路线图,我正在照此进行!一个小问题:
通过这种方法,这个部分是否必须手动完成(手动,我的意思是逐个通过界面添加条目)?理想情况下,我想使用我的管理员 API 密钥来添加此内容,因为 CSV 文件有点大,并且会随着时间的推移而增长。
angus
(Angus McLeod)
9
不,它不需要手动完成。您可以通过多种方式根据 CSV 填充用户自定义字段。这完全取决于您希望如何处理更新。我建议您先完成其他部分,然后用少量数据集进行测试。然后,如果您对它的工作方式感到满意,可以添加 CSV 的自动导入。使这部分高效是次要步骤。
1 个赞