Idéalement, lors de la personnalisation de Discourse via des thèmes ou des plugins, vous devriez utiliser le CSS, l’API de plugins JavaScript ou les points d’insertion de plugins. Si aucune de ces options ne convient à votre cas d’usage, n’hésitez pas à ouvrir une demande de tirage (PR) sur le cœur de Discourse ou à démarrer un sujet Development ici sur Meta. Nous sommes toujours ravis de discuter de l’ajout de nouveaux points d’insertion ou d’APIs pour faciliter la personnalisation.
Si vous avez épuisé toutes les autres options, il vous faudra peut-être recourir à des remplacements de modèles (template overrides). Cette technique vous permet de remplacer l’intégralité du modèle d’un composant Ember ou d’une Route depuis votre thème ou plugin.
Ce n’est pas une méthode recommandée pour personnaliser Discourse. Les modifications quotidiennes dans le cœur de Discourse finiront par entrer en conflit avec votre remplacement de modèle, provoquant potentiellement des erreurs catastrophiques lors du rendu du forum.
Si vous décidez d’adopter cette approche, assurez-vous de disposer de processus de tests automatisés et de contrôle qualité suffisants pour détecter les régressions. Si vous distribuez un thème ou un plugin avec des remplacements de modèles, veillez à ce que les administrateurs du forum soient conscients des risques de stabilité que votre thème ou plugin engendre.
![]()
![]()
Mise à jour d’octobre 2023 : Pour les nouvelles fonctionnalités, Discourse se tourne de plus en plus vers l’utilisation de composants créés au format de fichier
.gjsd’Ember. Les modèles de ces composants sont définis en ligne (inline) 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 à l’aide des Points d’insertion de plugins
Je comprends que cela cessera de fonctionner à court terme, mais montrez-moi la documentation quand même
Remplacement des modèles de composants
Pour remplacer le modèle d’un 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 devriez créer un fichier de 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 du cœur possède un modèle « colocalisé » (colocated).
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 devriez créer un fichier comme celui-ci :
{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 ayant le rang le plus bas dans cette liste :
- Remplacements de thème (l’« id » du thème le plus élevé gagne)
- Remplacements de plugin (le nom de plugin le plus récent alphabétiquement gagne)
- Cœur (Core)
Cette priorité signifie également que vous pouvez remplacer des modèles de plugins depuis des thèmes. Techniquement, vous pouvez également remplacer des modèles de thème depuis d’autres thèmes, et des modèles de plugin depuis 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 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 sous contrôle de version - suggérez des modifications sur github.