理想的には、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で。