是否有办法从一个主题组件访问另一个主题组件的设置?看起来 settings 只包含其所在主题组件的设置。
如果无法从一个主题组件访问另一个主题组件的设置,那么最好的方法是什么?
- 有一个单一的主题组件?
- 将设置移至主主题(但那些可用吗?我还没有测试过)。
是否有办法从一个主题组件访问另一个主题组件的设置?看起来 settings 只包含其所在主题组件的设置。
如果无法从一个主题组件访问另一个主题组件的设置,那么最好的方法是什么?
我之所以看了一下,是因为这是一个非常有趣的问题!![]()
在 discourse/lib/theme-settings-store 中有一个存储主题设置的地方,可以使用诸如 getObjectForTheme 或 getSetting 之类的导出函数。
只要有 ID,就可以检索任何主题组件的设置值。
但是,我找不到一种简单的方法来检索翻译 ID <=> 名称映射。
话虽如此,你可以这样做:
// 从 <link> 标签检索当前主题组件的名称 <=> ID 映射
const themesComponents = Array.from(
document.querySelectorAll("link[data-theme-name]")
).reduce((acc, link) => {
acc[link.dataset.themeName] = parseInt(link.dataset.themeId, 10);
return acc;
}, {});
// 根据组件名称获取主题 ID
const themeId = themesComponents["discotoc"];
// 获取所有设置
const themeSettings = getObjectForTheme(themeId);
// 获取特定设置
const themeSetting = getSetting(themeId, "anchor_icon");
![]()
我不确定这是最可靠的方法;如果不存在,一些辅助函数会很有用。
不同主题/主题组件的设置是刻意隔离的。主题/主题组件之间存在相互依赖会使它们非常难以开发和支持。
正如 @Arkshine 所演示的,从技术上讲,可以通过黑客手段找到数据,但我强烈建议不要这样做。如果管理员在管理面板中更改了主题名称,该策略就会失效,并且在将来的核心更改中也很可能随机失效。
抱歉,我意识到我提供的代码可能并不可靠。我应该对在这里显示的内容非常小心。黑客很有趣,但它会持续到导致未来不必要的用法和问题。![]()
哦,完全不用担心 @Arkshine - 尝试总是好的。在你的帖子里加上 [details] 注释,可以确保人们知道他们正在承担的风险 ![]()
如果跨插件和/或主题组件共享设置成为普遍要求,那么我们当然可以制定一些更强大的选项。也许我们可以利用这个话题来列出一些用例。
我的直觉是,如果一个主题试图使用另一个主题的设置……那么也许它们应该合并到一个存储库中?
此主题在上次回复后 30 天自动关闭。不再允许回复。