Idealerweise sollten Sie beim Anpassen von Discourse über Themes oder Plugins CSS, die JavaScript-Plugin-API oder Plugin-Outlets verwenden. Wenn keine dieser Optionen für Ihren Anwendungsfall geeignet ist, können Sie gerne einen PR für den Discourse-Kern einreichen oder hier auf Meta ein #dev-Thema starten. Wir freuen uns immer über Gespräche darüber, wie neue Outlets/APIs hinzugefügt werden können, um die Anpassung zu erleichtern.
Wenn Sie alle anderen Optionen ausgeschöpft haben, müssen Sie möglicherweise auf Template-Überschreibungen zurückgreifen. Diese Technik ermöglicht es Ihnen, die gesamte Vorlage einer beliebigen Ember-Komponente oder Route aus Ihrem Theme/Plugin zu überschreiben.
Dies ist keine empfohlene Methode zur Anpassung von Discourse. Tägliche Änderungen im Discourse-Kern werden Ihre Template-Überschreibung früher oder später konfliktreich machen und möglicherweise katastrophale Fehler beim Rendern des Forums verursachen.
Wenn Sie sich für diesen Ansatz entscheiden, stellen Sie sicher, dass Sie über ausreichende automatisierte Test- und QA-Prozesse verfügen, um Regressionen zu erkennen. Wenn Sie ein Theme/Plugin mit Template-Überschreibungen verteilen, stellen Sie bitte sicher, dass Forum-Administratoren über die Stabilitätsrisiken informiert sind, die Ihr Theme/Plugin mit sich bringt.
![]()
![]()
Update Oktober 2023: Für neue Funktionen bewegt sich Discourse zunehmend in Richtung der Verwendung von Komponenten, die im
.gjs-Dateiformat von Ember erstellt wurden. Vorlagen für diese Komponenten werden inline definiert und können von Themes/Plugins nicht überschrieben werden.Zukünftig sollten alle Template-Anpassungen über Plugin-Outlets erfolgen.
Ich verstehe, dass dies in naher Zukunft nicht mehr funktionieren wird, zeige mir die Dokumentation trotzdem
Überschreiben von Komponentenvorlagen
Um eine Ember-Komponentenvorlage zu überschreiben (d. h. alles unter components/* im Discourse-Kern), sollten Sie eine gleichnamige .hbs-Datei in Ihrem Theme/Plugin erstellen. Um beispielsweise die Vorlage für die badge-button-Komponente im Discourse-Kern zu überschreiben, erstellen Sie eine Vorlagendatei in Ihrem Theme/Plugin an folgendem Speicherort:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Die Überschreibung muss immer im /templates-Verzeichnis verschachtelt sein, auch wenn die Kernkomponente eine ‘colocated’-Vorlage hat.
Überschreiben von Routenvorlagen
Das Überschreiben von Routenvorlagen (d. h. alle Nicht-Komponentenvorlagen unter templates/*) funktioniert auf die gleiche Weise wie bei Komponenten. Erstellen Sie eine gleichnamige Vorlage in Ihrem Theme/Plugin. Um beispielsweise discovery.hbs im Kern zu überschreiben, erstellen Sie eine Datei wie:
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Interaktion zwischen mehreren Themes / Plugins
Wenn mehrere installierte Themes/Plugins dieselbe Vorlage überschreiben, gewinnt diejenige mit der niedrigsten Rangnummer in dieser Liste:
- Theme-Überschreibungen (höhere Theme-ID gewinnt)
- Plugin-Überschreibungen (alphabetisch späterer Plugin-Name gewinnt)
- Kern
Diese Priorität bedeutet auch, dass Sie Plugin-Vorlagen aus Themes überschreiben können. Technisch können Sie auch Theme-Vorlagen aus anderen Themes und Plugin-Vorlagen aus anderen Plugins überschreiben, aber das Verhalten kann aufgrund der Abhängigkeit vom Plugin-Namen und der Theme-ID überraschend sein.
Wie funktioniert das?
Discourse sammelt und priorisiert Vorlagen in der Klasse DiscourseTemplateMap. Für colocated-Komponentenvorlagen wird diese Information während der App-Initialisierung verwendet, um die Kernvorlagenassoziationen zu ersetzen. Für alle anderen Vorlagen wird die Karte von dem Resolver zur Laufzeit verwendet, um die richtige Vorlage abzurufen.
Dieses Dokument ist versionskontrolliert – schlagen Sie Änderungen auf GitHub vor.