如何从另一个主题组件访问主题组件设置

是否有办法从一个主题组件访问另一个主题组件的设置?看起来 settings 只包含其所在主题组件的设置。

如果无法从一个主题组件访问另一个主题组件的设置,那么最好的方法是什么?

  • 有一个单一的主题组件?
  • 将设置移至主主题(但那些可用吗?我还没有测试过)。
4 个赞
技术上可行,但正如 David 在下面所说,请不要使用它

我之所以看了一下,是因为这是一个非常有趣的问题!:+1:

discourse/lib/theme-settings-store 中有一个存储主题设置的地方,可以使用诸如 getObjectForThemegetSetting 之类的导出函数。
只要有 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");

image

我不确定这是最可靠的方法;如果不存在,一些辅助函数会很有用。

4 个赞

不同主题/主题组件的设置是刻意隔离的。主题/主题组件之间存在相互依赖会使它们非常难以开发和支持。

正如 @Arkshine 所演示的,从技术上讲,可以通过黑客手段找到数据,但我强烈建议不要这样做。如果管理员在管理面板中更改了主题名称,该策略就会失效,并且在将来的核心更改中也很可能随机失效。

6 个赞

抱歉,我意识到我提供的代码可能并不可靠。我应该对在这里显示的内容非常小心。黑客很有趣,但它会持续到导致未来不必要的用法和问题。:worried:

4 个赞

哦,完全不用担心 @Arkshine - 尝试总是好的。在你的帖子里加上 [details] 注释,可以确保人们知道他们正在承担的风险 :chefs_kiss:

如果跨插件和/或主题组件共享设置成为普遍要求,那么我们当然可以制定一些更强大的选项。也许我们可以利用这个话题来列出一些用例。

我的直觉是,如果一个主题试图使用另一个主题的设置……那么也许它们应该合并到一个存储库中?

5 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。