Idealerweise sollten Sie beim Anpassen von Discourse über Themes/Plugins CSS, die JavaScript Plugin API oder Plugin-Outlets verwenden. Wenn keine dieser Optionen für Ihren Anwendungsfall funktioniert, können Sie gerne einen PR an Discourse-Core öffnen oder hier auf Meta ein #dev-Thema starten. Wir diskutieren gerne über das Hinzufügen neuer Outlets/APIs, 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, das gesamte Template 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 zwangsläufig zu Konflikten mit Ihrer Template-Überschreibung führen und potenziell 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 die 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 mit dem
.gjs-Dateiformat von Ember erstellt wurden. Templates für diese Komponenten werden inline definiert und können nicht von Themes/Plugins überschrieben werden.Zukünftig sollten alle Template-Anpassungen über Plugin-Outlets erfolgen.
Ich verstehe, dass dies bald kaputt gehen wird, zeigen Sie mir trotzdem die Dokumentation
Überschreiben von Komponenten-Templates
Um ein Ember-Komponenten-Template zu überschreiben (d. h. alles unter components/* im Discourse-Kern), sollten Sie eine gleichnamige .hbs-Datei in Ihrem Theme/Plugin erstellen. Um beispielsweise das Template für die badge-button-Komponente im Discourse-Kern zu überschreiben, würden Sie eine Template-Datei in Ihrem Theme/Plugin an diesem Ort erstellen:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Die Überschreibung muss immer im Verzeichnis /templates verschachtelt sein, auch wenn die Kernkomponente ein “kolokalisiertes” Template hat.
Überschreiben von Routen-Templates
Das Überschreiben von Routen-Templates (d. h. aller Nicht-Komponenten-Templates unter templates/*) funktioniert genauso wie bei Komponenten. Erstellen Sie ein gleichnamiges Template in Ihrem Theme/Plugin. Um beispielsweise discovery.hbs im Kern zu überschreiben, würden Sie eine Datei wie diese erstellen:
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Überschreiben von “Raw”-Templates (.hbr)
Das “Raw”-Template-System von Discourse wird bald durch reguläre Ember-Komponenten ersetzt. Aber in der Zwischenzeit funktioniert das Überschreiben von Raw-Templates genauso wie bei Ember-Templates. Um beispielsweise topic-list-item.hbr im Kern zu überschreiben, könnten Sie eine Datei wie diese erstellen:
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
Interaktion zwischen mehreren Themes / Plugins
Wenn mehrere installierte Themes/Plugins dasselbe Template überschreiben, gewinnt das mit der niedrigsten Nummer in dieser Liste:
- Theme-Überschreibungen (höchste Theme-‘ID’ gewinnt)
- Plugin-Überschreibungen (neuester alphabetischer Plugin-Name gewinnt)
- Kern
Diese Priorität bedeutet auch, dass Sie Plugin-Templates aus Themes überschreiben können. Technisch gesehen können Sie auch Theme-Templates aus anderen Themes und Plugin-Templates 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 Templates in der Klasse DiscourseTemplateMap. Für kolokalisierte Komponenten-Templates werden diese Informationen während der App-Initialisierung verwendet, um die Kern-Template-Zuordnungen zu ersetzen. Für alle anderen Templates wird die Map vom Resolver zur Laufzeit verwendet, um das richtige Template abzurufen.
Dieses Dokument wird versioniert - schlagen Sie Änderungen auf GitHub vor.