Idealmente, quando si personalizza Discourse tramite temi/plugin, si dovrebbero 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 topic Dev qui su Meta. Siamo sempre lieti di discutere l’aggiunta di nuovi outlet/API per semplificare la personalizzazione.
Se hai esaurito tutte le altre opzioni, potresti dover ricorrere alle sostituzioni di template. Questa tecnica ti consente di sostituire 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 sostituzione di template alla fine, causando potenzialmente errori catastrofici durante il rendering del forum.
Se decidi di adottare questo approccio, assicurati di disporre di sufficienti test automatizzati e processi di QA per rilevare le regressioni. Se distribuisci un tema/plugin con sostituzioni di template, assicurati che gli amministratori del forum siano consapevoli dei rischi di stabilità che il tuo tema/plugin comporta.
![]()
![]()
Aggiornamento di Ottobre 2023: Per le nuove funzionalità, Discourse si sta muovendo sempre più verso l’uso di componenti creati utilizzando il formato di file
.gjsdi Ember. I template per questi componenti sono definiti inline e non possono essere sostituiti da temi/plugin.In futuro, tutte le personalizzazioni dei template dovrebbero essere eseguite utilizzando Plugin Outlets
Capisco che questo si romperà a breve, mostrami comunque la documentazione
Sostituzione dei Template dei Componenti
Per sostituire un template di Componente Ember (ovvero tutto ciò che si trova sotto components/* nel core di Discourse), dovresti creare un file .hbs con lo stesso nome nel tuo tema/plugin. Ad esempio, per sostituire il template del componente badge-button nel core di Discourse, creeresti un file di template nella tua posizione di tema/plugin:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
La sostituzione deve essere sempre nidificata all’interno della directory /templates, anche se il componente core ha un template ‘colocato’.
Sostituzione dei Template delle Route
La sostituzione dei template delle route (ovvero 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 sostituire discovery.hbs nel core, creeresti un file come
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Sostituzione dei Template ‘Raw’ (.hbr)
Il sistema di template “raw” di Discourse sarà presto sostituito dai normali componenti Ember. Ma nel frattempo, la sostituzione dei template raw funziona allo stesso modo dei template Ember. Ad esempio, per sostituire 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 temi/plugin multipli
Se temi/plugin installati multipli sostituiscono lo stesso template, il ‘vincitore’ è quello con il ranking numerico più basso in questo elenco:
- Sostituzioni del tema (vince l’ID del tema più alto)
- Sostituzioni del plugin (vince il nome del plugin alfabetico più recente)
- Core
Questa precedenza significa anche che puoi sostituire i template dei plugin dai temi. Tecnicamente puoi anche sostituire 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 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 in versione - suggerisci modifiche su github.