随着主题变得越来越宏大,我们一直在寻找允许它们操纵核心 服务器端 行为的方法。虽然它们永远不会获得与插件相同的控制级别,但我们可以为主题提供一些预定义的钩子来进行操作。
隆重推出:主题修饰符 
它们在主题的 about.json 文件中使用 modifiers 键指定。
有关修饰符的 100% 最新列表,请查看 theme_modifier_set.rb 底部的内容数据库架构,但以下是我们目前拥有的快速摘要:
-
serialize_topic_excerpts 布尔值 (默认 false) - 在序列化主题列表时始终包含摘录
-
csp_extensions 字符串数组 - 向 CSP 添加指令。其工作方式与旧的 “extend_content_security_policy” 主题设置方法相同。但请记住,简单的 <script src=""> 标签会自动被允许。
-
svg_icons 字符串数组 - 应包含在图标子集中的图标列表
-
topic thumbnails 尺寸数组 - 请求主题缩略图集中的其他分辨率。请注意,它们是异步生成的,因此如果请求的大小不可用,您必须回退到原始图像。更多信息请参阅提交消息
-
serialize_post_user_badges 字符串数组 - 与帖子数据一起序列化的徽章名称列表(与 badges 表中的条目匹配)。配置后,系统会在每个帖子中包含指定的徽章,以便进行客户端渲染。
一个大量使用这些新钩子的主题是 Topic List Thumbnails - 查看代码了解其工作原理。
依赖于设置的修饰符
主题修饰符也可以配置为从主题设置中拉取其值,允许站点管理员在不编辑主题代码的情况下覆盖修饰符行为。要使修饰符依赖于设置,请在 about.json 中使用此语法:
{
"modifiers": {
"modifier_name": {
"type": "setting",
"value": "setting_name"
}
}
}
例如,如果您有一个名为 show_excerpts 的主题设置,并希望它控制 serialize_topic_excerpts 修饰符:
在 settings.yml 中:
show_excerpts:
default: false
在 about.json 中:
{
"modifiers": {
"serialize_topic_excerpts": {
"type": "setting",
"value": "show_excerpts"
}
}
}
当更改 show_excerpts 设置时,修饰符值将自动更新以匹配。这为站点管理员通过管理界面自定义主题行为提供了灵活性。
此文档是版本控制的 - 在 github 上 建议更改。
35 个赞
David,我这样问可能有点懒,但有没有办法在插件中访问这个功能:
主题可以通过在其 about.json 文件中使用修饰符来请求额外的缩略图尺寸:
我打算将 TLP 插件迁移到这个新的架构,因此至少在过渡期间,能够以插件形式访问相同的功能会很有帮助。
2 个赞
David,批量重新生成缩略图的正确方法是什么?
我刚刚在一个网站上尝试使用,它似乎只处理了大约 10% 的主题……然后就放弃了(或者对剩下的不屑一顾)。我认为它是前者,因为那些生成了缩略图的主题正是最新的 10%。
重新烘焙帖子似乎不起作用。事实上,我确实运行了一次批量重新烘焙,不知道这是否导致了问题……
我注意到 image_url 可以填充,但没有生成缩略图。
任何建议,不胜感激!
1 个赞
david
(David Taylor)
7
该列没有任何作用,并且很快就会被移除。你需要的是 image_upload_id。
这完全没有必要。我特意这样设计,以便人们可以安装新主题而无需在控制台上进行任何操作。缩略图会在需要时异步生成。例如:
- 你添加了一个新主题,该主题请求新的分辨率
- 用户请求某个主题时,我们提供已存在的缩略图。如果某些尺寸不存在,我们会调度一个 Sidekiq 任务
- 下次有人请求该主题时,正确的缩略图就会存在
如果请求的缩略图尺寸大于原始图片尺寸,我们将不会生成该缩略图。
因此,要实现这一功能,关键要记住的是:
我在自己制作的缩略图主题组件中展示了这种回退逻辑的示例——欢迎直接从中借鉴逻辑。
5 个赞
回退值被序列化为 thumbnailsl[0] 吗?是的,我已经处理了这种情况。(顺便说一句,实现得很棒,处理起来非常方便)
是否有些图片“未达标”或不符合条件?
我们在 TLP 插件中的行为会抓取单盒缩略图。据我所知,这里并非所有情况都如此。
例如,如果您有时间,可以看看这些示例:
我认为这些缩略图不符合要求。缩略图被序列化为 null。
david
(David Taylor)
9
是的,这是有意为之——我们收到不少请求,要求移除小型 onebox 缩略图。例如,用户有时会发现他们的 GitHub 头像被用作主题缩略图,而这通常并非本意。
请注意,对于图像本身就是实际内容的 onebox(如 Instagram、Twitter 等平台的照片),这些图像仍会被选中。
至于 YouTube 视频的问题,我昨天已经修复了。
5 个赞
太好了,谢谢确认。
这有点奇怪,构建版本更新了一些,但似乎仍有一些被遗漏了。
是的,这也是我最终为自动化选择不理想的情况实现缩略图选择器的原因之一。我可能仍想修改这一行为,但我会尝试在插件中实现。
感谢你的时间,David!
2 个赞
好的,我弄明白了。经过一番徒劳的 byebug 调试后,我无法弄清楚为什么旧的 YouTube 帖子没有缩略图。
后来我突然想到,这是因为这个:
所以我建议,实际上在将此值设置为一个较大的数字(例如 365)之后,可能需要重新生成缓存。
我想我没错,如果某样东西没有本地上传,就不会生成缩略图?…
4 个赞
david
(David Taylor)
13
正确,这仅适用于本地上传……我们可能需要重新考虑那个“最大天数”的设置 
8 个赞
david
(David Taylor)
15
我有个计划,会尝试在本周内实现。有一个问题——您是否需要这些值是动态的?
即:分辨率是在启动时定义,还是在运行时(例如通过站点设置)定义?
前者更容易实现……但后者也有可能实现 
2 个赞
感谢查看。
我只需要一个像主题组件那样固定的方案。
不过,如果能有一个站点设置就更完美了。
为求完全透明:我希望能迁移出该插件,因此与主题组件方案保持一致就足够了。
2 个赞
david
(David Taylor)
17
@merefield 给你:
希望提交信息能解释其工作原理,但如果你有任何问题,请随时告诉我。
7 个赞
太好了。刚刚将其添加到 TLP 中,看起来运行正常!感谢您的帮助!
4 个赞
david
(David Taylor)
拆分了此话题
19
我们能否也支持来自远程服务器的图片?例如来自 Blogger、Picasa 或 Amazon S3 的图片?
由于 Discourse 支持将大型图片托管在 Amazon S3 上,如果所有图片都必须直接托管在本地服务器上,那么这种设计方法似乎成了一个缺点。
有了这个更新,对于我的网站来说修复起来并不容易,因为我们使用的是其他服务器来托管图片。现在,要将拥有大量帖子的网站迁移到关联服务器变得非常困难,而本地服务器又无法承载如此大的数据量。
david
(David Taylor)
21
此功能仅设计用于 Discourse 的“上传”内容。如果您使用
这些上传内容可以存储在 S3 或其他服务上。
我们建议使用 download_remote_images 站点设置,以自动下载从其他网站热链接的图片。
4 个赞
你好 David,要确保 Pro 图标能在 TC 中使用,有什么特别需要注意的吗?
1 个赞
david
(David Taylor)
23
没什么特别的,不会。它应该和在其他地方使用专业图标一样生效。我猜你正在使用这个插件来启用专业图标?
如果不起作用,请告诉我,我会帮忙看看 
2 个赞