別のテーマコンポーネントからテーマコンポーネント設定にアクセスする方法

テーマコンポーネントの設定を別のテーマコンポーネントからアクセスする方法はありますか? settings には、それが含まれているテーマコンポーネントの設定のみが含まれているようです。

別のテーマコンポーネントからテーマコンポーネントの設定にアクセスできない場合、最善の方法は何ですか?

  • 単一のテーマコンポーネントを持つ?
  • 設定をプライマリテーマに移動する(ただし、それらは利用可能ですか?まだテストしていません)。
「いいね!」 4
これは技術的には可能ですが、デビッドが以下に述べたように、使用しないでください

興味深い質問だったので、見てみました!:+1:

テーマ設定はdiscourse/lib/theme-settings-store の場所に保存されており、getObjectForThemegetSetting のようなエクスポートされた関数を使用できます。
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

これが最も信頼性の高い方法であるかどうかはわかりません。存在しない場合は、ヘルパーがあると便利です。

「いいね!」 4

異なるテーマ/テーマコンポーネントの設定は意図的に分離されています。テーマ/テーマコンポーネント間に依存関係があると、開発とサポートが非常に困難になります。

@Arkshine が実証したように、データを取得するためにハッキングすることは技術的に可能ですが、強くお勧めしません。この戦略は、管理者が管理者パネルでテーマの名前を変更した場合に壊れ、将来のコアの変更でランダムに壊れる可能性も非常に高いです。

「いいね!」 6

私のミスです。提供したコードが信頼できない可能性があることに気づきました。ここに表示する内容には本当に注意する必要があります。ハッキングは楽しいですが、望ましくない使用法や将来の問題につながるまで続きます。:worried:

「いいね!」 4

お気になさらないでください、@Arkshine さん。実験することは常に良いことです。投稿に [details] の注記を入れておけば、人々がリスクを理解していることを確認できます :chefs_kiss:

もし、このような設定をプラグイン間やテーマコンポーネント間で共有することが一般的な要件になるのであれば、より堅牢なオプションを検討することができます。このトピックで、使用例を提示することもできるかもしれません。

私の直感では、テーマが別のテーマの設定を使用しようとしている場合…おそらく、それらを単一のリポジトリにマージすべきではないでしょうか?

「いいね!」 5

このトピックは、最後の返信から30日後に自動的にクローズされました。新しい返信は許可されていません。