Как получить доступ к настройкам компонента темы из другого компонента темы

Существует ли способ получить доступ к настройкам одного компонента темы из другого компонента темы? Кажется, что settings содержит только настройки того компонента темы, в котором он находится.

Если получить доступ к настройкам одного компонента темы из другого невозможно, какой будет лучший способ это сделать?

  • использовать один единственный компонент темы?
  • переместить настройки в основную тему (но доступны ли они? Я пока не проверял это).
Технически это возможно, но, как указал Дэвид ниже, пожалуйста, не используйте это

Я посмотрел, потому что вопрос довольно интересный! :+1:

В discourse/lib/theme-settings-store есть место, где хранятся настройки темы и экспортируются функции, такие как getObjectForTheme или getSetting.

Вы можете получить значение настройки для любого компонента темы, если знаете его ID.
Однако я не смог найти простой способ получить сопоставление ID перевода ↔ имени.

Тем не менее, можно использовать следующую уловку:

// Извлекает сопоставление имени темы <-> ID из тегов <link> для активных компонентов темы
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

Не уверен, что это самый надежный способ; были бы полезны какие-то вспомогательные функции, если их пока нет.

Настройки из разных тем/компонентов тем намеренно изолированы. Наличие взаимозависимостей между темами/компонентами тем значительно усложняет их разработку и поддержку.

Как показал @Arkshine, технически возможно взломать систему и найти эти данные, но я НАСТОЯТЕЛЬНО рекомендую этого не делать. Такой подход перестанет работать, если администратор изменит имя темы в панели управления, а также с высокой вероятностью случайно сломается при будущих изменениях в ядре.

Моя ошибка, я понял, что предоставленный мной код может быть ненадёжным. Мне действительно стоит быть осторожнее с тем, что я публикую здесь. Хакерство — это весело, но это продолжается только до тех пор, пока не приведёт к нежелательному использованию и проблемам в будущем. :worried:

О, не переживайте, @Arkshine — экспериментировать всегда полезно. Наличие пометки [details] в вашем сообщении — это хорошо, чтобы люди понимали, на какие риски идут :chefs_kiss:

Если совместное использование таких настроек между плагинами и/или компонентами темы станет распространённым требованием, мы, безусловно, сможем разработать более надёжные варианты. Возможно, мы можем использовать эту тему, чтобы описать примеры использования.

Мое интуитивное ощущение таково: если тема пытается использовать настройки другой темы, то, возможно, их следует объединить в единый репозиторий?