Idealmente, quando si personalizza Discourse tramite temi/plugin, si dovrebbe usare CSS, l’API dei Plugin JavaScript o gli outlet dei plugin. Se nessuno di questi funziona per il tuo caso d’uso, sentiti libero di aprire una PR nel core di Discourse o di avviare un argomento Dev qui su Meta. Siamo sempre felici di discutere l’aggiunta di nuovi outlet/API per facilitare la personalizzazione.
Se hai esaurito tutte le altre opzioni, potresti dover ricorrere alla sovrascrittura dei template. Questa tecnica ti consente di sovrascrivere l’intero template di qualsiasi Componente Ember o Route dal tuo tema/plugin.
Questo non è un modo consigliato per personalizzare Discourse. Le modifiche quotidiane nel core di Discourse entreranno in conflitto con la tua sovrascrittura del template alla fine, causando potenzialmente errori catastrofici durante il rendering del forum.
Se decidi di adottare questo approccio, assicurati di disporre di processi di test automatizzati e di QA sufficienti per rilevare le regressioni. Se distribuisci un tema/plugin con sovrascritture di template, assicurati che gli amministratori del forum siano consapevoli dei rischi per la stabilità che il tuo tema/plugin comporta.
![]()
![]()
Aggiornamento di Ottobre 2023: Per le nuove funzionalità, Discourse si sta muovendo sempre più verso l’utilizzo di componenti creati utilizzando il formato di 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 dovrebbero essere eseguite utilizzando Plugin Outlets
Capisco che questo si romperà nel prossimo futuro, mostrami comunque la documentazione
Sovrascrittura dei Template dei Componenti
Per sovrascrivere un template di Componente Ember (cioè qualsiasi cosa sotto components/* nel core di Discourse), dovresti creare un file .hbs con lo stesso nome nel tuo tema/plugin. Ad esempio, per sovrascrivere il template per il componente badge-button nel core di Discourse, creeresti un file di template nella tua posizione del tema/plugin:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
La sovrascrittura deve essere sempre annidata all’interno della directory /templates, anche se il componente core ha un template “colocato”.
Sovrascrittura dei Template delle Route
La sovrascrittura dei template delle route (cioè tutti i template non-componente sotto templates/*) funziona allo stesso modo dei componenti. Crea un template con lo stesso nome nel tuo tema/plugin. Ad esempio, per sovrascrivere discovery.hbs nel core, creeresti un file come
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Sovrascrittura dei Template “Raw” (.hbr)
Il sistema di template “raw” di Discourse sarà presto sostituito dai normali componenti Ember. Ma nel frattempo, la sovrascrittura dei template raw funziona allo stesso modo dei template Ember. Ad esempio, per sovrascrivere topic-list-item.hbr nel core, potresti creare un file come:
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
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:
- Sovrascritture dei temi (vince l’ID del tema più alto)
- Sovrascritture dei plugin (vince il nome del plugin alfabetico più recente)
- Core
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 prioritizza i template nella classe DiscourseTemplateMap. Per i template dei componenti colocati, tali 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 a runtime per recuperare il template corretto.
Questo documento è controllato tramite versione - suggerisci modifiche su github.