Idealmente, quando si personalizza Discourse tramite temi/plugin, si dovrebbe utilizzare CSS, l’API dei plugin JavaScript o le plugin outlets. Se nessuna di queste opzioni è adatta al proprio caso d’uso, non esitate a aprire una PR su Discourse core o a iniziare un topic Development qui su Meta. Siamo sempre lieti di discutere l’aggiunta di nuove outlets/API per rendere la personalizzazione più semplice.
Se si sono esaurite tutte le altre opzioni, potrebbe essere necessario ricorrere agli override dei template. Questa tecnica consente di sovrascrivere l’intero template di qualsiasi Componente o Route Ember dal proprio tema/plugin.
Questo non è un metodo consigliato per personalizzare Discourse. I cambiamenti quotidiani in Discourse core causeranno inevitabilmente conflitti con il vostro override del template, potenzialmente generando errori catastrofici durante il rendering del forum.
Se si decide di adottare questo approccio, assicuratevi di avere processi di test automatizzati e QA sufficienti per rilevare i regression. Se si distribuisce un tema/plugin con override dei template, si prega di assicurarsi che gli amministratori del forum siano a conoscenza dei rischi di stabilità associati al vostro tema/plugin.
![]()
![]()
Aggiornamento di ottobre 2023: Per le nuove funzionalità, Discourse si sta sempre più orientando verso l’utilizzo di componenti creati utilizzando il formato file
.gjsdi Ember. I template per questi componenti sono definiti inline e non possono essere sovrascritti da temi/plugin.In futuro, tutte le personalizzazioni dei template dovranno essere effettuate utilizzando le Plugin Outlets
Ho capito che questo si romperà in futuro, mostrami comunque la documentazione
Sovrascrittura dei template dei componenti
Per sovrascrivere un template di un componente Ember (ovvero qualsiasi cosa sotto components/* in Discourse core), è necessario creare un file .hbs con lo stesso nome nel proprio tema/plugin. Ad esempio, per sovrascrivere il template del componente badge-button in Discourse core, si dovrebbe creare un file di template nel proprio tema/plugin in questa posizione:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
L’override deve sempre essere annidato all’interno della directory /templates, anche se il componente core ha un template ‘collocato’ (colocated).
Sovrascrittura dei template delle route
La sovrascrittura dei template delle route (ovvero tutti i template non-componenti sotto templates/*) funziona allo stesso modo dei componenti. Creare un template con lo stesso nome nel proprio tema/plugin. Ad esempio, per sovrascrivere discovery.hbs nel core, si dovrebbe creare un file come
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Interazione tra più temi / plugin
Se più temi/plugin installati sovrascrivono lo stesso template, il ‘vincitore’ è quello con il ranking numerico più basso in questa lista:
- Override dei temi (vince il tema con ‘id’ più alto)
- Override dei plugin (vince il nome del plugin più recente in ordine alfabetico)
- Core
Questa priorità significa anche che è possibile sovrascrivere i template dei plugin dai temi. Tecnicamente è anche possibile sovrascrivere i template dei temi da altri temi, e i template dei plugin da altri plugin, ma il comportamento può essere sorprendente a causa della dipendenza dal nome del plugin e dall’id del tema.
Come funziona?
Discourse assembla e dà priorità ai template nella classe DiscourseTemplateMap. Per i template dei componenti collocati, queste informazioni vengono utilizzate durante l’inizializzazione dell’app per sostituire le associazioni dei template core. Per tutti gli altri template, la mappa viene utilizzata da il resolver in runtime per recuperare il template corretto.
Questo documento è sottoposto a controllo di versione - suggerisci modifiche su github.