Idealmente, quando personalizzi Discourse tramite temi o plugin, dovresti utilizzare CSS, l’API JavaScript per i plugin o i plugin outlets. Se nessuno di questi metodi funziona per il tuo caso d’uso, sentiti libero di aprire una PR nel codice principale di Discourse o di avviare un argomento Development qui su Meta. Siamo sempre felici di discutere l’aggiunta di nuovi outlet/API per rendere la personalizzazione più semplice.
Se hai esaurito tutte le altre opzioni, potresti dover ricorrere all’override dei template. Questa tecnica ti consente di sovrascrivere l’intero template di qualsiasi componente o route Ember dal tuo tema o plugin.
Questo non è un metodo consigliato per personalizzare Discourse. Le modifiche quotidiane nel codice principale di Discourse entreranno in conflitto con il tuo override di template, causando potenzialmente errori catastrofici durante il rendering del forum.
Se decidi di adottare questo approccio, assicurati di avere processi adeguati di testing automatizzato e QA per rilevare eventuali regressioni. Se distribuisci un tema o un plugin con override di template, assicurati che gli amministratori dei forum siano consapevoli dei rischi di stabilità associati al tuo tema o plugin.
![]()
![]()
Aggiornamento di ottobre 2023: Per le nuove funzionalità, Discourse sta sempre più passando all’uso di componenti scritti nel formato di file
.gjsdi Ember. I template per questi componenti sono definiti inline e non possono essere sovrascritti da temi o plugin.D’ora in poi, tutte le personalizzazioni dei template devono essere eseguite utilizzando Plugin Outlets
Capisco che questo si romperà in futuro, mostrami comunque la documentazione
Sovrascrittura dei template dei componenti
Per sovrascrivere un template di un componente Ember (cioè tutto ciò che si trova sotto components/* nel codice principale di Discourse), dovresti creare un file .hbs con lo stesso nome nel tuo tema o plugin. Ad esempio, per sovrascrivere il template del componente badge-button nel codice principale di Discourse, dovresti creare un file template nel tuo tema o plugin in questa posizione:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
L’override deve essere sempre annidato all’interno della directory /templates, anche se il componente principale ha un template ‘colocato’.
Sovrascrittura dei template delle route
La sovrascrittura dei template delle route (cioè tutti i template non componenti sotto templates/*) funziona allo stesso modo dei componenti. Crea un template con lo stesso nome nel tuo tema o plugin. Ad esempio, per sovrascrivere discovery.hbs nel codice principale, dovresti 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 o 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 l’id più alto)
- Override dei plugin (vince il nome del plugin più recente in ordine alfabetico)
- Codice principale
Questa precedenza significa anche che puoi sovrascrivere i template dei plugin dai temi. Tecnicamente puoi anche 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 priorizza i template nella classe DiscourseTemplateMap. Per i template dei componenti colocati, queste informazioni vengono utilizzate durante l’inizializzazione dell’app per sostituire le associazioni dei template principali. Per tutti gli altri template, la mappa viene utilizzata dal resolver a runtime per recuperare il template corretto.
Questo documento è sottoposto a controllo versione: suggerisci modifiche su GitHub.