Idéalement, lors de la personnalisation de Discourse via des thèmes/plugins, vous devriez utiliser du CSS, l’API de Plugin JavaScript ou les sorties de plugin (plugin outlets). Si aucune de ces méthodes ne convient à votre cas d’utilisation, n’hésitez pas à ouvrir une PR dans le cœur de Discourse ou à démarrer un sujet Dev ici sur Meta. Nous sommes toujours heureux de discuter de l’ajout de nouvelles sorties/API pour faciliter la personnalisation.
Si vous avez épuisé toutes les autres options, vous pourriez avoir besoin de recourir aux remplacements de modèles (template overrides). Cette technique vous permet de remplacer le modèle entier de n’importe quel composant Ember ou Route à partir de votre thème/plugin.
Ce n’est pas une manière recommandée de personnaliser Discourse. Les changements quotidiens dans le cœur de Discourse entreront en conflit avec votre remplacement de modèle éventuellement, provoquant potentiellement des erreurs catastrophiques lors du rendu du forum.
Si vous décidez d’adopter cette approche, assurez-vous d’avoir des tests automatisés et des processus d’assurance qualité suffisants pour détecter les régressions. Si vous distribuez un thème/plugin avec des remplacements de modèles, veuillez vous assurer que les administrateurs du forum sont conscients des risques de stabilité que votre thème/plugin comporte.
![]()
![]()
Mise à jour d’octobre 2023 : Pour les nouvelles fonctionnalités, Discourse s’oriente de plus en plus vers l’utilisation de composants créés à l’aide du format de fichier
.gjsd’Ember. Les modèles pour ces composants sont définis en ligne et ne peuvent pas être remplacés par des thèmes/plugins.À l’avenir, toutes les personnalisations de modèles doivent être effectuées à l’aide des Sorties de Plugin (Plugin Outlets)
Je comprends que cela va casser dans un avenir proche, montrez-moi la documentation quand même
Remplacement des modèles de composants
Pour remplacer un modèle de composant Ember (c’est-à-dire tout ce qui se trouve sous components/* dans le cœur de Discourse), vous devez créer un fichier .hbs de nom identique dans votre thème/plugin. Par exemple, pour remplacer le modèle du composant badge-button dans le cœur de Discourse, vous créeriez un fichier de modèle dans votre thème/plugin à cet emplacement :
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
Le remplacement doit toujours être imbriqué dans le répertoire /templates, même si le composant principal a un modèle « colocalisé ».
Remplacement des modèles de Route
Le remplacement des modèles de route (c’est-à-dire tous les modèles non-composants sous templates/*) fonctionne de la même manière que pour les composants. Créez un modèle de nom identique dans votre thème/plugin. Par exemple, pour remplacer discovery.hbs dans le cœur, vous créeriez un fichier comme
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Remplacement des modèles « bruts » (.hbr)
Le système de modèle « brut » de Discourse sera bientôt remplacé par des composants Ember réguliers. Mais en attendant, le remplacement des modèles bruts fonctionne de la même manière que les modèles Ember. Par exemple, pour remplacer topic-list-item.hbr dans le cœur, vous pourriez créer un fichier comme :
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
Interaction entre plusieurs thèmes / plugins
Si plusieurs thèmes/plugins installés remplacent le même modèle, le « gagnant » est celui qui a le classement numérique le plus bas dans cette liste :
- Remplacements de thème (l’ID de thème le plus élevé gagne)
- Remplacements de plugin (le nom de plugin alphabétique le plus récent gagne)
- Cœur
Cette précédence signifie également que vous pouvez remplacer les modèles de plugin à partir de thèmes. Techniquement, vous pouvez également remplacer des modèles de thème à partir d’autres thèmes, et des modèles de plugin à partir d’autres plugins, mais le comportement peut être surprenant en raison de la dépendance au nom du plugin et à l’ID du thème.
Comment cela fonctionne-t-il ?
Discourse assemble et priorise les modèles dans la classe DiscourseTemplateMap. Pour les modèles de composants colocalisés, ces informations sont utilisées pendant l’initialisation de l’application pour remplacer les associations de modèles du cœur. Pour tous les autres modèles, la carte est utilisée par le résolveur au moment de l’exécution pour récupérer le modèle correct.
Ce document est contrôlé par version - suggérez des modifications sur github.