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