通知横幅

@gormus,我尝试安装时遇到了这个错误:

An error occurred: Error creating upload asset: splide_css. Original filename Sorry, the file you are trying to upload is not authorized (authorized extensions: wasm, jpg, jpeg, png, woff, woff2, svg, eot, ttf, otf, gif, webp, avif, js).

更新:成功了,我之前忘了添加 CSS 到扩展名里。

3 个赞

我将两个横幅添加到同一个出口并为两者都选择轮播。但它们只显示堆叠。我是否遗漏了什么才能使轮播正常工作?

1 个赞

您好 @manuel,轮播图需要至少在同一出处(outlet)中放置 2 个横幅(banner);当然,所有横幅都必须启用“在轮播图中显示”选项。如果只启用了一个横幅,轮播图将不会渲染。

另外;

  1. 您的浏览器控制台中是否出现任何 JavaScript 错误?其中是否有任何错误引用了通知横幅?
  2. 考虑到可能存在冲突;您是否通过禁用其他主题、组件和插件,或者使用安全模式,将问题隔离到了通知横幅?

或者,您是否愿意分享您的设置?这样我就可以导入并在我的环境中进行尝试……

  1. 在“Discourse Notification Banners”(Discourse 通知横幅)管理页面上,点击页面底部的“Settings Editor”(设置编辑器)按钮。
  2. 复制 JSON 数据
  3. 移除您可能拥有的任何敏感数据
  4. 在此处回复中分享 JSON 数据,或私信我
2 个赞

感谢 @gormus!我不确定为什么它之前不起作用……我在两个独立的实例上都进行了设置,但两个都无法正常工作。现在我从头开始,两个实例都工作正常了! :+1: :upside_down_face:

2 个赞

您好,关于受众定位,似乎无法定位 TL0 用户,是吗?因为每个人都是 TL0?

1 个赞

恐怕你说得对,@patrickemin。信任级别是累加的,最终它会将所有登录用户默认设置为TL0,即使他们被手动提升到TL4。

所以,目前如果你选择TL0作为受众,基本上就是选择了所有登录用户。我认为这本身是有价值的,但这可能会引起误解。

我想我会更新受众字段的逻辑,并为所有信任级别定义一个新规则。谢谢你给我这个想法 : )

2 个赞

您好 @gormus,我已按照您在此处针对 nolo 的回复中的说明进行操作,但不知何故,我无法让通知以轮播方式运行。它们只是堆叠显示。我有两条测试消息,并且两者都启用了轮播,它们位于同一个出口。控制台中没有与 js 相关的错误,并且我禁用了所有其他组件,但似乎都没有效果。有什么想法吗?

@marksalter,听起来你已经检查了常见问题。我唯一能想到的就是尝试使用你的设置导出重现问题。请私信我你的导出文件,如有必要请清理数据。不过我还要 10 天才能回来 : )

您好,我在更新横幅消息时遇到此错误:

JSON 指针属性 “/0/enabled_groups” 必须是有效组 ID 的数组。

您是否在“受众”字段中引用了已删除(或重命名)的用户组?

1 个赞

谢谢,就是这样。我以为组只通过它们的 ID 来识别,名称无关紧要。

1 个赞

我一直在考虑一个利用信任等级来更好地定位受众的想法:

我认为我有一个可以供大家检查的东西。

不过,我建议先在非生产环境中测试此功能,因为它引入了破坏性更改

要安装此版本,请使用 Notification Bannersstaging 分支:

破坏性更改

当使用受众字段值评估横幅可见性时,除最高级别外,访问者的所有 trust_level_* 角色都将被忽略。

例如,假设一个用户具有以下角色:support_teamblogtrust_level_0trust_level_1trust_level_2

受众字段将仅考虑用户具有 support_teamblogtrust_level_2

因此,如果横幅需要定位 TL2 用户,则受众字段应设置为 trust_level_2。其他信任等级的用户将看不到该横幅。

我还更新了受众字段的描述以澄清此更改。

我计划进一步测试这些更改,并可能在 9 月底发布新版本。我非常感谢您提供的任何反馈。

谢谢!

2 个赞

v1.3.0 现已发布。

请确保在部署到生产环境之前进行测试。

值得注意的更改:

  • 横幅现在将按照它们在设置页面上的显示方式进行排序。现在您可以使用原生的 重新排序 按钮来排序横幅,而不是使用“显示顺序”字段。

  • 更改了“受众”字段的行为:

    选择哪些用户组可以看到此横幅。您必须至少选择一个组。

    要向所有用户和访客显示: 选择 everyone 组。

    关于信任等级的重要提示: 选择一个信任等级(例如 trust_level_3)将向处于该确切级别的用户显示横幅。它不包括更高或更低级别的用户。

  • 更改了默认的 Splide 轮播选项:
    之前:

    { "arrows": false, "autoHeight": true, "autoplay": true, "direction": "ttb", "focus": "center", "height": "15vh", "gap": 0, "type": "loop" }
    

    之后:

    { "autoHeight": true, "height": "8rem", "arrows": false, "autoplay": true, "direction": "ttb", "focus": "center", "gap": 0, "type": "loop" }
    
2 个赞

您好,最新的更新破坏了我的网站(只加载了网站标题),不得不停用 TC,一切都恢复正常了。看看是不是只有我遇到了这个问题,不着急 :grinning_face_with_smiling_eyes:

1 个赞

感谢 @patrickemin 的报告以及您提供的详细信息。

我之前部署的热修复程序 (v1.3.1) 应该已经修复了我在 v1.3.0 中引入的问题。对于给各位带来的不便,我深表歉意。

我正在尝试让这个组件正常工作。但我创建的测试横幅没有显示。我使用的是非常新的 Discourse 版本(大约三天前),组件版本是 1.3.1。

我很确定选项设置得很好。我也尝试了显示测试横幅的所有三个位置。但都没有显示。

是另一个 bug 还是用户问题?我可以在哪里查找?

您在控制台中看到任何错误了吗?

如果控制台中没有错误,您是否可以私信发送您的配置(使用设置编辑器)?
请清除消息字符串中的任何敏感信息。

只有弃用通知。另外(仅在 Opera 中,不在 Firefox 中,并且我已将 Content security policy script src 设置为 'unsafe-eval' 很长时间):

您网站的内容安全策略阻止在 JavaScript 中使用“eval”

内容安全策略 (CSP) 可防止将任意字符串评估为 JavaScript,以增加攻击者在您的网站上注入未经授权代码的难度。

要解决此问题,请避免使用 eval()new Function()setTimeout([string], ...)setInterval([string], ...) 来评估字符串。

如果您绝对必须这样做:可以通过在 script-src 指令中添加 unsafe-eval 作为允许的源来启用字符串评估。

谢谢。我也可以在这里发布,因为目前只有一个测试横幅处于活动状态:

[
	{
		"setting": "banners",
		"value": [
			{
				"title": "测试横幅标题",
				"message": "测试横幅文本测试横幅文本",
				"date_after": "2025-11-01 12:00:00Z",
				"date_before": "2025-12-01 12:00:00Z",
				"dismissable": true,
				"plugin_outlet": "top-notices",
				"enabled_groups": [
					1
				]
			}
		]
	},
	{
		"setting": "splide_options__above_site_header",
		"value": "{ \"autoHeight\": true, \"height\": \"8rem\", \"arrows\": false, \"autoplay\": true, \"direction\": \"ttb\", \"focus\": \"center\", \"gap\": 0, \"type\": \"loop\" }"
	},
	{
		"setting": "splide_options__below_site_header",
		"value": "{ \"autoHeight\": true, \"height\": \"8rem\", \"arrows\": false, \"autoplay\": true, \"direction\": \"ttb\", \"focus\": \"center\", \"gap\": 0, \"type\": \"loop\" }"
	},
	{
		"setting": "splide_options__top_notices",
		"value": "{ \"autoHeight\": true, \"height\": \"8rem\", \"arrows\": false, \"autoplay\": true, \"direction\": \"ttb\", \"focus\": \"center\", \"gap\": 0, \"type\": \"loop\" }"
	}
]

我还尝试过不设置开始和结束日期以及另外两个插件出口。我还尝试过使用 everyone 而不是 Administrators 来在未登录网站的情况下在 Firefox 中看到效果。并且我没有修改 splide 选项。

1 个赞

感谢您的报告@Roi。

您的配置未包含任何类别的选择,NB 错误地拒绝访问横幅。

我刚刚推送了一个修复程序并发布了 v1.3.2。请更新通知横幅。

1 个赞

是的,太好了,现在可以用了!

是的,我将类别选择留空了,因为我认为它会显示在任何地方。所以这是组件的一个错误,它需要一个选项?无论如何,现在已经修复了。谢谢! :slight_smile:

由于我是这个组件的新手,我可以问一些问题吗?

我想通知/提醒我们的用户参与社区。最初的想法是每隔 4 到 8 周左右弹出一个横幅,一次又一次地提醒用户。一旦用户关闭它,它就不再可见了。到目前为止,一切都很好。

我可以更改开始和结束日期,然后在保存后,横幅会再次显示给已关闭它的用户吗?(这到底是如何工作的?我的猜测是 Cookie?)或者我需要创建一个全新的横幅?

有人在这个主题中提到了一个周期。所以每 8 周显示一次横幅。这将是一个很好的选择,因为它完全无需维护 - 如果您不想更改其他内容。但问题仍然是,当新周期开始时,横幅是否会再次显示给已关闭它的用户?