(非推奨) テーマまたはプラグインからDiscourseテンプレートをオーバーライドする

理想的には、テーマ/プラグインを介してDiscourseをカスタマイズする場合、CSS、JavaScriptプラグインAPI、またはプラグインのアウトレットを使用する必要があります。これらのいずれもユースケースに合わない場合は、DiscourseコアにPRを開くか、Metaで#devトピックを開始してください。カスタマイズを容易にするために、新しいアウトレット/APIを追加することについては、いつでも喜んで議論します。

他のすべてのオプションを使い果たした場合は、テンプレートのオーバーライドに頼る必要があるかもしれません。この手法により、テーマ/プラグインからEmberコンポーネントまたはルートのテンプレート全体をオーバーライドできます。

:rotating_light:**これはDiscourseをカスタマイズするための推奨される方法ではありません。**Discourseコアの日常的な変更は、最終的にテンプレートのオーバーライドと競合し、フォーラムのレンダリング時に壊滅的なエラーを引き起こす可能性があります。

このアプローチを選択する場合は、リグレッションを検出するための十分な自動テストとQAプロセスがあることを確認してください。テンプレートのオーバーライドを含むテーマ/プラグインを配布する場合は、フォーラム管理者に、テーマ/プラグインがもたらす安定性のリスクを認識していることを確認してください。

:rotating_light::rotating_light::rotating_light:2023年10月のアップデート: 新機能については、DiscourseはEmberの.gjsファイル形式を使用して作成されたコンポーネントの使用にますます移行しています。これらのコンポーネントのテンプレートはインラインで定義されており、テーマ/プラグインでオーバーライドすることはできません。

今後、すべてのテンプレートカスタマイズはプラグインのアウトレットを使用して行う必要があります。

近日中に壊れる可能性があることは理解していますが、それでもドキュメントを表示してください

コンポーネントテンプレートのオーバーライド

Emberコンポーネントのテンプレート(つまり、Discourseコアのcomponents/*の下にあるものすべて)をオーバーライドするには、テーマ/プラグインに同じ名前の.hbsファイルを作成する必要があります。たとえば、Discourseコアのbadge-buttonコンポーネントのテンプレートをオーバーライドするには、テーマ/プラグインの次の場所にテンプレートファイルを作成します。

:art: {theme}/javascripts/discourse/templates/components/badge-button.hbs

:electric_plug: {plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs

コアコンポーネントに「コロケーションされた」テンプレートがある場合でも、オーバーライドは常に/templatesディレクトリ内にネストする必要があります。

ルートテンプレートのオーバーライド

ルートテンプレート(つまり、templates/*の下にあるコンポーネント以外のすべてのテンプレート)のオーバーライドは、コンポーネントの場合と同じように機能します。テーマ/プラグインに同じ名前のテンプレートを作成します。たとえば、コアのdiscovery.hbsをオーバーライドするには、次のようなファイルを作成します。

:art: {theme}/javascripts/discourse/templates/discovery.hbs

:electric_plug: {plugin}/assets/javascripts/discourse/templates/discovery.hbs

「生の」テンプレート(.hbr)のオーバーライド

Discourseの「生の」テンプレートシステムは、通常のEmberコンポーネントに置き換えられる予定です。しかし、それまでの間、生のテンプレートのオーバーライドはEmberテンプレートと同じように機能します。たとえば、コアのtopic-list-item.hbrをオーバーライドするには、次のようなファイルを作成できます。

:art: {theme}/javascripts/discourse/templates/list/topic-list-item.hbr

:electric_plug: {plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr

複数のテーマ/プラグイン間の相互作用

複数のインストール済みテーマ/プラグインが同じテンプレートをオーバーライドする場合、「勝者」は次のリストで最も低い番号のランキングを持つものです。

  1. テーマのオーバーライド(最も高いテーマの「id」が勝ちます)
  2. プラグインのオーバーライド(最新のアルファベット順のプラグイン名が勝ちます)
  3. コア

この優先順位は、テーマからプラグインテンプレートをオーバーライドできることも意味します。技術的には、他のテーマからテーマテンプレートをオーバーライドしたり、他のプラグインからプラグインテンプレートをオーバーライドしたりすることもできますが、プラグイン名とテーマidへの依存のため、動作は驚くべきものになる可能性があります。

仕組みは?

Discourseは、DiscourseTemplateMapクラスでテンプレートをアセンブルおよび優先順位付けします。コロケーションされたコンポーネントテンプレートの場合、その情報はアプリの初期化中にコアテンプレートの関連付けを置き換えるために使用されます。他のすべてのテンプレートについては、マップは実行時のリゾルバによって正しいテンプレートを取得するために使用されます。


このドキュメントはバージョン管理されています - githubで変更を提案してください。

「いいね!」 17

モバイルテンプレートについてはどうですか?コアのテンプレートを書き直すためのディレクトリ構造は何ですか?

それは全く同じように機能するはずです。コアテンプレートの名前を一致させます。したがって、/mobile がある場合は、オーバーライドに含めてください。

モバイルの login.hbs テンプレートを書き直そうとしていますが、うまくいきません Imgur: The magic of the Internet

スクリーンショットでは、完全なパスが表示されていないように見えます。テキストとしてここに貼り付けていただけますか。

themeroot/javascripts/mobile/modal/login.hbs

パスにdiscourse/templatesがありません

したがって、この場合は{theme}/javascripts/discourse/templates/mobile/modal/login.hbsになります。

「いいね!」 2

これはまだ当てはまりますか?

多くのコードを上書きする機能が削除されるのは少し残念です。

Widget システムをある程度置き換えるのは理にかなっていますが、これにより複数のレベルで既存のコードにフックすることができ、次のようなことを可能にする巧妙な方法で小さなブロックのみを対象とすることで、多くの破壊的変更のリスクを軽減できました。

  • 機能を追加する
  • 他のものを邪魔しない。

たとえば、Discourse Journal から 2 つの重要な機能を削除しなければなりませんでした。これはウィジェットのきめ細かなオーバーライドに基づいていたためですが、Glimmer でそれらを再作成する唯一の方法は、テンプレートのオーバーライドのペア (.gjs ファイルの変更を試みるものを含む) を介して行うことでしたが、これはサポートされなくなったようです。

たとえこれがサポートされていたとしても、ウィジェットフレームワークの下よりも大きなコードのストレッチをオーバーライドすることになり、コアの変更がオーバーライドと競合するリスクが増加します。

これはプラットフォームの拡張性にとって健全ではありません。

何かできることはありますか?

「いいね!」 7

ええ、わかります。ウィジェットの拡張性APIには良い点もありました。

しかし、その一方で、ウィジェットベースのUIのコア部分を少しでも変更するのが非常に困難でした。なぜなら、人々がどのようなランダムなメソッドやデコレーションを導入しているかわからなかったからです。そのため、ウィジェットのカスタマイズは比較的安定しているように見えました。コアの実装に触れるのが怖すぎたのです。

今後のための私たちの解決策は、Wrapper Plugin Outlets です。これらは、テーマやプラグインがテンプレートの非常に小さなチャンクを独自のインプリメンテーションでオプションでオーバーライドできるようにします。

例えば、Chatがどのように条件付きでホームロゴをオーバーライドしているか を見てください。カスタムコンポーネント で。これは、既存のウィジェットベースのヘッダーと、新しいGlimmerベースのヘッダー(近日公開予定!:tm:)の両方で機能します。

私たちは、さまざまな場所に新しいラッパーアウトレットを追加するPRを一般的に受け入れています。特定のユースケースについて不明な点がある場合は、お気軽に詳細を添えて#devトピックを開いてください!

「いいね!」 10

わかりました、それは前進するための方法のようですね。ありがとうございます。

その影響を消化し、それに沿った戦略に調整する必要があります。

ご回答に感謝します!

「いいね!」 6