Idealmente, al personalizar Discourse a través de temas/plugins, deberías usar CSS, la API de Plugin de JavaScript o salidas de plugin (plugin outlets). Si ninguna de estas opciones funciona para tu caso de uso, no dudes en abrir un PR al núcleo de Discourse o iniciar un tema de Dev aquí en Meta. Siempre estamos encantados de discutir la adición de nuevas salidas/APIs para facilitar la personalización.
Si has agotado todas las demás opciones, es posible que debas recurrir a las anulaciones de plantillas (template overrides). Esta técnica te permite anular la plantilla completa de cualquier Componente Ember o Ruta desde tu tema/plugin.
Esta no es una forma recomendada de personalizar Discourse. Los cambios diarios en el núcleo de Discourse entrarán en conflicto con tu anulación de plantilla eventualmente, lo que podría causar errores catastróficos al renderizar el foro.
Si decides tomar este camino, asegúrate de contar con pruebas automatizadas y procesos de control de calidad (QA) suficientes para detectar regresiones. Si distribuyes un tema/plugin con anulaciones de plantillas, asegúrate de que los administradores del foro estén al tanto de los riesgos de estabilidad que conlleva tu tema/plugin.
![]()
![]()
Actualización de Octubre de 2023: Para nuevas características, Discourse se está moviendo cada vez más hacia el uso de componentes creados con el formato de archivo
.gjsde Ember. Las plantillas para estos componentes se definen en línea y no pueden ser anuladas por temas/plugins.En el futuro, todas las personalizaciones de plantillas deben realizarse utilizando Salidas de Plugin (Plugin Outlets)
Entiendo que esto se romperá en un futuro cercano, muéstrame la documentación de todos modos
Anulación de Plantillas de Componentes
Para anular una plantilla de Componente Ember (es decir, cualquier cosa bajo components/* en el núcleo de Discourse), debes crear un .hbs con el mismo nombre en tu tema/plugin. Por ejemplo, para anular la plantilla del componente badge-button en el núcleo de Discourse, crearías un archivo de plantilla en tu tema/plugin en esta ubicación:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
La anulación siempre debe anidarse dentro del directorio /templates, incluso si el componente principal tiene una plantilla ‘colocada’.
Anulación de Plantillas de Rutas
Anular las plantillas de rutas (es decir, todas las plantillas que no son de componentes bajo templates/*) funciona de la misma manera que los componentes. Crea una plantilla con el mismo nombre en tu tema/plugin. Por ejemplo, para anular discovery.hbs en el núcleo, crearías un archivo como
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Anulación de Plantillas ‘Raw’ (.hbr)
El sistema de plantillas “raw” (crudas) de Discourse pronto será reemplazado por componentes Ember regulares. Pero mientras tanto, anular las plantillas raw funciona de la misma manera que las plantillas Ember. Por ejemplo, para anular topic-list-item.hbr en el núcleo, podrías crear un archivo como:
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
Interacción entre múltiples temas / plugins
Si múltiples temas/plugins instalados anulan la misma plantilla, el ‘ganador’ es el que tiene la clasificación de número más bajo en esta lista:
- Anulaciones de temas (gana el ‘id’ de tema más alto)
- Anulaciones de plugins (gana el nombre de plugin alfabéticamente más reciente)
- Núcleo
Esta precedencia también significa que puedes anular plantillas de plugins desde temas. Técnicamente, también puedes anular plantillas de temas desde otros temas, y plantillas de plugins desde otros plugins, pero el comportamiento puede ser sorprendente debido a la dependencia del nombre del plugin y el 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 resolvedor en tiempo de ejecución para obtener la plantilla correcta.
Este documento está controlado por versiones: sugiere cambios en github.