理想的には、テーマ/プラグインを介して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で変更を提案してください。