Idealmente, al personalizar Discourse mediante temas o complementos, debes utilizar CSS, la API de complementos de JavaScript o los outlets de complementos. Si ninguna de estas opciones funciona para tu caso de uso, no dudes en abrir una PR al núcleo de Discourse o iniciar un tema en Development aquí en Meta. Siempre estamos encantados de discutir la incorporación de nuevos outlets/APIs para facilitar la personalización.
Si has agotado todas las demás opciones, es posible que tengas que recurrir a la superposición de plantillas. Esta técnica te permite reemplazar la plantilla completa de cualquier componente o ruta de Ember desde tu tema o complemento.
Esta no es una forma recomendada de personalizar Discourse. Los cambios cotidianos en el núcleo de Discourse entrarán en conflicto eventualmente con tu superposición de plantillas, lo que podría provocar errores catastróficos al renderizar el foro.
Si decides seguir este enfoque, asegúrate de contar con procesos de pruebas automatizadas y control de calidad suficientes para detectar regresiones. Si distribuyes un tema o complemento con superposiciones de plantillas, asegúrate de que los administradores del foro sean conscientes de los riesgos de estabilidad que implica tu tema o complemento.
![]()
![]()
Actualización de octubre de 2023: Para las nuevas funciones, Discourse está migrando cada vez más hacia el uso de componentes creados con el formato de archivo
.gjsde Ember. Las plantillas de estos componentes se definen en línea y no pueden ser superpuestas por temas o complementos.De ahora en adelante, todas las personalizaciones de plantillas deben realizarse utilizando Plugin Outlets
Sé que esto se romperá en el futuro cercano, pero muéstrame la documentación de todos modos
Superposición de plantillas de componentes
Para superponer la plantilla de un componente de Ember (es decir, cualquier cosa bajo components/* en el núcleo de Discourse), debes crear un archivo .hbs con el mismo nombre en tu tema o complemento. Por ejemplo, para superponer la plantilla del componente badge-button en el núcleo de Discourse, crearías un archivo de plantilla en tu tema o complemento en esta ubicación:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
La superposición debe estar siempre anidada dentro del directorio /templates, incluso si el componente del núcleo tiene una plantilla “colocada” (colocated).
Superposición de plantillas de rutas
Superponer plantillas de rutas (es decir, todas las plantillas que no son de componentes bajo templates/*) funciona de la misma manera que con los componentes. Crea una plantilla con el mismo nombre en tu tema o complemento. Por ejemplo, para superponer discovery.hbs en el núcleo, crearías un archivo como
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Interacción entre múltiples temas / complementos
Si varios temas o complementos instalados superponen la misma plantilla, el “ganador” es el que tenga el menor número de clasificación en esta lista:
- Superposiciones de temas (gana el tema con el mayor ‘id’)
- Superposiciones de complementos (gana el nombre de complemento más reciente alfabéticamente)
- Núcleo
Esta precedencia también significa que puedes superponer plantillas de complementos desde temas. Técnicamente también puedes superponer plantillas de temas desde otros temas, y plantillas de complementos desde otros complementos, pero el comportamiento puede ser sorprendente debido a la dependencia del nombre del complemento y del id del tema.
¿Cómo funciona esto?
Discourse ensambla y prioriza las plantillas en la clase DiscourseTemplateMap. Para las plantillas de componentes colocados, esa información se utiliza durante la inicialización de la aplicación para reemplazar las asociaciones de plantillas del núcleo. Para todas las demás plantillas, el mapa es utilizado por el resolutor en tiempo de ejecución para obtener la plantilla correcta.
Este documento está bajo control de versiones - sugiere cambios en github.