Idéalement, lors de la personnalisation de Discourse via des thèmes ou des plugins, vous devriez utiliser CSS, l’API JavaScript Plugin ou les sorties de plugin (plugin outlets). Si aucune de ces options ne convient à votre cas d’utilisation, n’hésitez pas à ouvrir une PR dans le cœur de Discourse ou à démarrer un sujet Development ici sur Meta. Nous sommes toujours ravis de discuter de l’ajout de nouvelles sorties/API pour faciliter la personnalisation.
Si vous avez épuisé toutes les autres options, vous devrez peut-être recourir aux remplacements de modèles (template overrides). Cette technique vous permet de remplacer entièrement le modèle de n’importe quel composant ou route Ember depuis votre thème ou plugin.
Ce n’est pas une méthode recommandée pour personnaliser Discourse. Les changements quotidiens dans le cœur de Discourse entreront éventuellement en conflit avec votre remplacement de modèle, risquant de provoquer des erreurs catastrophiques lors du rendu du forum.
Si vous décidez d’adopter cette approche, assurez-vous d’avoir des processus de test automatisé et d’assurance qualité suffisants pour détecter les régressions. Si vous distribuez un thème ou un 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 ou plugin entraîne.
![]()
![]()
Mise à jour d’octobre 2023 : Pour les nouvelles fonctionnalités, Discourse se tourne de plus en plus vers l’utilisation de composants rédigés dans le format de fichier
.gjsd’Ember. Les modèles de ces composants sont définis en ligne et ne peuvent pas être remplacés par des thèmes ou des plugins.À l’avenir, toutes les personnalisations de modèles doivent être effectuées en utilisant les sorties de plugin (Plugin Outlets)
Je comprends que cela va casser dans un proche avenir, montrez-moi quand même la documentation
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 portant le même nom dans votre thème ou plugin. Par exemple, pour remplacer le modèle du composant badge-button dans le cœur de Discourse, vous créeriez un fichier modèle dans votre thème ou 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 possède un modèle « colocalisé ».
Remplacement des modèles de routes
Le remplacement des modèles de routes (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 portant le même nom dans votre thème ou 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
Interaction entre plusieurs thèmes / plugins
Si plusieurs thèmes ou plugins installés remplacent le même modèle, le « gagnant » est celui qui a le classement le plus bas dans cette liste :
- Remplacements de thèmes (le thème avec l’« id » le plus élevé gagne)
- Remplacements de plugins (le nom de plugin le plus récent alphabétiquement gagne)
- Cœur
Cette priorité signifie également que vous pouvez remplacer les modèles de plugins par des thèmes. Techniquement, vous pouvez également remplacer les modèles de thèmes par d’autres thèmes, et les modèles de plugins par d’autres plugins, mais le comportement peut être surprenant en raison de la dépendance au nom du plugin et à l’identifiant 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 lors de 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 versionné - proposez des modifications sur GitHub.