Idealerweise sollten Sie bei der Anpassung von Discourse über Themes/Plugins CSS, die JavaScript Plugin API oder Plugin Outlets verwenden. Wenn keine dieser Methoden für Ihren Anwendungsfall funktioniert, können Sie gerne einen PR für den Discourse-Kern öffnen oder ein #dev-Thema hier auf Meta starten. Wir freuen uns immer, über das Hinzufügen neuer Outlets/APIs zu diskutieren, 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 jeder 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 irgendwann mit Ihrer Template-Überschreibung in Konflikt geraten 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 Qualitätssicherungsprozesse verfügen, um Regressionen zu erkennen. Wenn Sie ein Theme/Plugin mit Template-Überschreibungen verteilen, stellen Sie bitte sicher, dass die Forum-Administratoren sich der Stabilitätsrisiken bewusst sind, die Ihr Theme/Plugin mit sich bringt.
![]()
![]()
Update vom Oktober 2023: Für neue Funktionen verlagert sich Discourse zunehmend auf die Verwendung von Komponenten, die mit dem
.gjs-Dateiformat von Ember erstellt wurden. Templates für diese Komponenten werden inline definiert und können nicht durch Themes/Plugins überschrieben werden.Zukünftig sollten alle Template-Anpassungen über Plugin Outlets erfolgen.
Ich verstehe, dass dies in naher Zukunft fehlschlagen wird, zeigen Sie mir trotzdem die Dokumentation
Überschreiben von Komponententemplates
Um ein Ember-Komponententemplate zu überschreiben (d. h. alles unter components/* im Discourse-Kern), sollten Sie eine identisch benannte .hbs-Datei in Ihrem Theme/Plugin erstellen. Um beispielsweise das Template für die Komponente badge-button im Discourse-Kern zu überschreiben, würden Sie eine Template-Datei in Ihrem Theme/Plugin an folgendem Ort erstellen:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Die Überschreibung muss immer innerhalb des /templates-Verzeichnisses verschachtelt sein, auch wenn die Kernkomponente ein „lokalisiertes“ Template hat.
Überschreiben von Routentemplates
Das Überschreiben von Routentemplates (d. h. alle Nicht-Komponenten-Templates unter templates/*) funktioniert genauso wie bei Komponenten. Erstellen Sie ein identisch benanntes Template in Ihrem Theme/Plugin. Um beispielsweise discovery.hbs im Kern zu überschreiben, würden Sie eine Datei wie erstellen
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Überschreiben von „Raw“-Templates (.hbr)
Discourse’s „Raw“-Template-System 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 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 dasjenige mit der niedrigsten Rangfolge in dieser Liste:
- Theme-Überschreibungen (höchste Theme-‘id’ gewinnt)
- Plugin-Überschreibungen (neuester alphabetischer Plugin-Name gewinnt)
- Kern
Diese Reihenfolge bedeutet auch, dass Sie Plugin-Templates von Themes überschreiben können. Technisch gesehen können Sie auch Theme-Templates von anderen Themes und Plugin-Templates von anderen Plugins überschreiben, aber das Verhalten kann aufgrund der Abhängigkeit vom Plugin-Namen und der Theme-ID überraschend sein.
Wie funktioniert das?
Discourse setzt Templates in der DiscourseTemplateMap zusammen und priorisiert sie. Für lokal platzierte Komponententemplates werden diese Informationen während der App-Initialisierung verwendet, um die Kern-Template-Zuordnungen zu ersetzen. Für alle anderen Templates wird die Map zur Laufzeit vom Resolver verwendet, um das korrekte Template abzurufen.
Dieses Dokument wird versioniert – Änderungen auf github vorschlagen.