Discourse 动态组

:information_source: 摘要 自动管理组成员资格
:hammer_and_wrench: 仓库链接 https://github.com/communiteq/discourse-dynamic-groups
:open_book: 安装指南 如何在 Discourse 中安装插件

:warning: 此插件应被视为 Beta 版 :warning:

功能

Discourse 社区经常需要根据徽章所有权或现有组成员资格等条件来自动管理组成员资格。

常见用例包括:

  • 不在“订阅者”组中的用户

  • 未被禁止在 Marketplace 中发帖的用户

  • TL0 或 TL1 用户,但不是 TL2 用户

  • 已完成新用户教程或已成为会员一年以上

  • 属于 client_1、client_2 或 client_3 且不是实习生的用户

以前,解决这个问题需要定期同步组的自定义脚本。Dynamic Groups 插件消除了这种需求。

该插件在组设置中引入了一个布尔表达式字段,允许管理员定义动态确定组成员资格的规则。

示例:

  • 不在“订阅者”组中的用户
    trust_level_0 AND NOT subscribers

  • 未被禁止在 Marketplace 中发帖的用户
    trust_level_2 AND NOT banned_users

  • TL0 或 TL1 用户,但不是 TL2 用户
    trust_level_0 AND NOT trust_level_2

  • 已完成新用户教程或已成为会员一年以上
    badge:certified OR badge:anniversary

  • 属于 client 1、2 或 3 且不是实习生的用户
    (client_1 OR client_2 OR client_3) AND NOT interns

配置

安装并启用插件后,组管理界面中会出现一个新选项卡:

输入或更新布尔表达式后,系统将花费一些时间来填充匹配用户的组。从那时起,随着用户状态的变化,组成员资格将自动更新。

重要提示:
定义规则后,该组将被标记为 自动,禁用手动成员更改。要将组恢复为手动管理,只需清除表达式字段。现有成员将保留,您将重新获得手动控制权。

27 个赞

哇!理查德,干得漂亮!

这填补了 Discourse 中群组管理的一大空白。我非常满意,并期待着好好使用它。

我将主要使用它来实现功能性子群组。

4 个赞

绝对是 Discourse 功能的一个受欢迎的补充!

2 个赞

7 个帖子已合并到现有主题中:仅在使用 User first logged in 触发器时,第一个条目在多选字段中工作

您好,感谢您开发这款超级有用的插件!

我目前正在使用 Discourse Dynamic Groups 来自动将所有非匿名用户添加到一个特殊的组。我的布尔表达式是:

NOT anonymous_users
预期行为:
当一个新用户注册(不属于 anonymous_users 组)时,他们应该被自动添加到这个组,无需任何手动干预。

实际行为:
新注册的用户不会立即被添加到组中。只有在我手动重新保存在组设置中的布尔表达式后,他们才会被添加。
这意味着该组不会随着用户的加入而自动更新,除非我触发手动同步。

1 个赞

嗯… 抓得很好。我同意这应该是预期的行为。

从技术角度来看,插件只会在两种不同的情况下重新评估组成员身份:

  1. 保存组设置中的布尔表达式时
  2. 如果在布尔表达式中提到的组中添加或删除用户时。

当新用户注册时,以上两种情况都不是。

您可以尝试将表达式更改为 trust_level_0 AND NOT anonymous_users,然后反馈是否解决了问题吗?

3 个赞

您好,

当我尝试使用表达式

trust_level_0 AND NOT anonymous_users

时,出现以下错误:
Unknown keyword, group or badge: 'anonymous_users'(未知关键字、群组或徽章: ‘anonymous_users’)

如果我将群组名称更改为我的实际群组,例如:

trust_level_0 AND NOT interns

我仍然得到:
Unknown keyword, group or badge: 'interns'(未知关键字、群组或徽章: ‘interns’)

我已经仔细检查过,并且我是直接从群组管理页面复制群组的唯一名称,所以没有拼写错误。
是否遗漏了什么,或者我还需要配置其他内容才能使自定义群组在表达式中被识别?

4 个赞

感谢您报告此问题。

在尝试重现时,我发现了两个错误,其中一个可能影响了您。请将插件更新到最新版本 59640f1,看看是否能解决此问题。

该插件仍然不能很好地处理重命名组。如果您重命名一个组,您应该保存所有依赖于它的组的规则(只需在布尔表达式后输入一个空格,然后再删除它,以启用“保存”按钮)。这将在以后的版本中解决。

3 个赞

这是在使用您的 Category restrictor 插件还是独立于它运行?

一个很棒的插件,可以填补空白。

它是独立运行的。

1 个赞

您好,

我正在使用 Dynamic Groups 插件,并将我的条件设置为:

trust_level_0 AND NOT anon_group

但是,我注意到 trust_level_1 且 anon_group 中的用户也被添加到了这个动态组中。

您能否确认这是预期行为,还是一个错误?

信任级别为 1 的用户也是信任级别 0 组的成员。因此,该行为是符合预期的。您可以排除信任级别 1 组,只获取 TL0 用户。类似于第一个帖子中的示例

2 个赞

谢谢你的澄清

我绝对 :heart: 这个插件——它对多种用例都非常有帮助。再次向 Communiteq 团队致谢,感谢他们分享并维护这个插件!

用户体验方面——是否隐藏关键字段比隐藏整个“会员资格”标签页更好?

我注意到它会隐藏群组页面的“会员资格”标签页。就是这一页:

虽然我能理解这样做的理由,但这确实会在您想要调整默认标题、徽章和特效时带来一些问题。

可以通过 在浏览器控制台中显示该标签页,或者 删除“动态群组”标签页中的表达式,刷新页面,进行修改,再粘贴回去,然后再次刷新来绕过这个问题。

但我确实想知道,是否不如直接隐藏那些不常用的字段,而不是隐藏整个标签页。类似这样:

我同意你的建议,但是……

这是核心功能。
动态群组会被标记为“自动”,随后“成员”选项卡将消失。

这行不通,因为 Discourse 核心根本不会输出该选项卡。它并非被隐藏,而是不存在。

1 个赞

是的,我在你回复之前就已经想明白了!我之前没意识到你通过它直接挂钩到了核心功能——做得真漂亮。

我已经划掉了那个不正确的建议。

那么,我想我之前提到的另一个变通方案应该是可行的。

1 个赞

我此前也没意识到这一点!

我们计划在接下来一个月内对所有插件进行一次维护更新。或许我们需要重新审视“自动”标志,因为据我回忆,它最初只是禁用“添加/移除成员”功能的一种快捷方式。其他问题可能都是不希望出现的副作用。

2 个赞