Idealerweise solltest du beim Anpassen von Discourse über Themes/Plugins CSS, die JavaScript-Plugin-API oder Plugin-Outlets verwenden. Wenn keines dieser Verfahren für deinen Anwendungsfall funktioniert, kannst du gerne einen PR an den Discourse-Core öffnen oder hier auf Meta ein #dev-Thema starten. Wir freuen uns immer darauf, über die Hinzufügung neuer Outlets/APIs zu diskutieren, um die Anpassung zu erleichtern.
Wenn du alle anderen Möglichkeiten ausgeschöpft hast, musst du möglicherweise auf Template-Overrides zurückgreifen. Mit dieser Technik kannst du das gesamte Template jeder Ember-Komponente oder Route aus deinem Theme/Plugin überschreiben.
Dies ist keine empfohlene Methode zur Anpassung von Discourse. Alltägliche Änderungen im Discourse-Core werden früher oder später mit deinem Template-Override in Konflikt geraten und können potenziell zu katastrophalen Fehlern bei der Darstellung des Forens führen.
Wenn du dich für diesen Ansatz entscheidest, stelle sicher, dass du ausreichende automatisierte Tests und QA-Prozesse hast, um Regressionen zu erkennen. Wenn du ein Theme/Plugin mit Template-Overrides verteilst, stelle bitte sicher, dass die Foren-Admins sich der Stabilitätsrisiken bewusst sind, die dein Theme/Plugin mit sich bringt.
![]()
![]()
Update Oktober 2023: Für neue Funktionen setzt Discourse zunehmend auf Komponenten, die im
.gjs-Dateiformat von Ember erstellt werden. Die Templates für diese Komponenten sind inline definiert und können nicht von Themes/Plugins überschrieben werden.Künftig sollten alle Template-Anpassungen über Plugin-Outlets erfolgen.
Ich verstehe, dass dies in naher Zukunft nicht mehr funktionieren wird, zeig mir trotzdem die Doku
Überschreiben von Komponententemplates
Um ein Ember-Komponententemplate zu überschreiben (d. h. alles unter components/* im Discourse-Core), solltest du in deinem Theme/Plugin eine .hbs-Datei mit demselben Namen erstellen. Zum Beispiel: Um das Template für die badge-button-Komponente im Discourse-Core zu überschreiben, würdest du eine Template-Datei an diesem Ort in deinem Theme/Plugin erstellen:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Der Override muss immer im /templates-Verzeichnis verschachtelt sein, selbst wenn die Core-Komponente ein „colocated“ (beigefügtes) Template hat.
Überschreiben von Routen-Templates
Das Überschreiben von Routen-Templates (d. h. alle Nicht-Komponenten-Templates unter templates/*) funktioniert auf die gleiche Weise wie bei Komponenten. Erstelle ein Template mit demselben Namen in deinem Theme/Plugin. Zum Beispiel: Um discovery.hbs im Core zu überschreiben, würdest du eine Datei wie folgt erstellen:
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Interaktion zwischen mehreren Themes/Plugins
Wenn mehrere installierte Themes/Plugins dasselbe Template überschreiben, ist der „Sieger“ derjenige mit der niedrigsten Nummerierung in dieser Liste:
- Theme-Overrides (das Theme mit der höchsten „id“ gewinnt)
- Plugin-Overrides (der alphabetisch letzte Plugin-Name gewinnt)
- Core
Diese Priorisierung bedeutet auch, dass du Plugin-Templates aus Themes heraus überschreiben kannst. Technisch kannst du auch Theme-Templates aus anderen Themes und Plugin-Templates aus anderen Plugins überschreiben, aber das Verhalten kann überraschend sein, aufgrund der Abhängigkeit vom Plugin-Namen und der Theme-ID.
Wie funktioniert das?
Discourse stellt Templates zusammen und priorisiert sie in der DiscourseTemplateMap-Klasse. Für colocated Komponententemplates werden diese Informationen während der App-Initialisierung verwendet, um die Core-Template-Assoziationen zu ersetzen. Für alle anderen Templates wird die Map von dem Resolver zur Laufzeit verwendet, um das richtige Template abzurufen.
Dieses Dokument ist versioniert - schlage Änderungen auf GitHub vor.