理想的には、Discourseをテーマやプラグインでカスタマイズする場合、CSS、JavaScriptプラグインAPI、またはプラグインアウトレットを使用する必要があります。これらがユースケースで機能しない場合は、DiscourseコアにPRを開くか、Metaで#devトピックを開始してください。カスタマイズを容易にするために新しいアウトレット/APIを追加することについては、いつでも喜んで議論します。
他のすべてのオプションを使い果たした場合、テンプレートの上書きに頼る必要があるかもしれません。この手法により、テーマ/プラグインからEmberコンポーネントまたはルートのテンプレート全体を上書きできます。
これはDiscourseをカスタマイズするための推奨される方法ではありません。 Discourseコアでの日々の変更は、最終的にテンプレートの上書きと競合し、フォーラムのレンダリング時に壊滅的なエラーを引き起こす可能性があります。
このアプローチを採用する場合は、十分な自動テストとQAプロセスがあることを確認して、リグレッションを検出してください。テンプレートの上書きを含むテーマ/プラグインを配布する場合は、フォーラム管理者にテーマ/プラグインが持つ安定性のリスクを認識していることを確認してください。
![]()
![]()
2023年10月の更新: 新機能については、DiscourseはEmberの
.gjsファイル形式を使用して作成されたコンポーネントの使用にますます移行しています。これらのコンポーネントのテンプレートはインラインで定義されており、テーマ/プラグインによって上書きすることはできません。今後、すべてのテンプレートのカスタマイズはプラグインアウトレットを使用して行う必要があります。
近い将来壊れることは理解していますが、それでもドキュメントを見せてください
コンポーネントテンプレートの上書き
Emberコンポーネントのテンプレート(つまり、Discourseコアのcomponents/*の下にあるものすべて)を上書きするには、テーマ/プラグイン内に同じ名前の.hbsファイルを作成する必要があります。たとえば、Discourseコアのbadge-buttonコンポーネントのテンプレートを上書きするには、テーマ/プラグイン内の次の場所にテンプレートファイルを作成します。
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
上書きは、コアコンポーネントのテンプレートが「コロケートされている」場合でも、常に/templatesディレクトリ内にネストする必要があります。
ルートテンプレートの上書き
ルートテンプレートの上書き(つまり、templates/*の下にあるすべての非コンポーネントテンプレート)は、コンポーネントと同じ方法で機能します。テーマ/プラグイン内に同じ名前のテンプレートを作成します。たとえば、コアのdiscovery.hbsを上書きするには、次のようなファイルを作成します。
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
「生の」テンプレート(.hbr)の上書き
Discourseの「生の」テンプレートシステムは、まもなく通常のEmberコンポーネントに置き換えられます。しかし、それまでは、生のテンプレートの上書きはEmberテンプレートと同じように機能します。たとえば、コアのtopic-list-item.hbrを上書きするには、次のようなファイルを作成できます。
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
複数のテーマ/プラグイン間の相互作用
複数のインストールされたテーマ/プラグインが同じテンプレートを上書きする場合、「勝者」は次のリストで番号が最も小さいランキングを持つものになります。
- テーマの上書き(テーマの ‘id’ が大きい方が勝ちます)
- プラグインの上書き(最新のアルファベット順のプラグイン名が勝ちます)
- コア
この優先順位は、テーマからプラグインのテンプレートを上書きできることも意味します。技術的には、他のテーマからテーマのテンプレートを、また他のプラグインからプラグインのテンプレートを上書きすることも可能ですが、プラグイン名とテーマIDへの依存関係のため、動作は驚くべきものになる可能性があります。
これはどのように機能しますか?
Discourseは、DiscourseTemplateMapクラスでテンプレートを組み立て、優先順位を付けます。コロケートされたコンポーネントテンプレートの場合、その情報はアプリ初期化中に使用され、コアテンプレートの関連付けを置き換えます。他のすべてのテンプレートについては、マップが実行時のリゾルバによって使用され、正しいテンプレートが取得されます。
このドキュメントはバージョン管理されています - 変更の提案はgithubで行ってください。