Idealmente, al personalizar Discourse a través de temas/plugins, deberías usar CSS, la API de plugins de JavaScript o salidas de plugin. Si ninguna de estas opciones funciona para tu caso de uso, no dudes en abrir una PR para el núcleo de Discourse o iniciar un tema de Dev aquí en Meta. Siempre estamos contentos 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 necesites recurrir a la anulación de plantillas. Esta técnica te permite anular toda la plantilla 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 enfoque, asegúrate de tener suficientes pruebas automatizadas y procesos de control de calidad para detectar regresiones. Si distribuyes un tema/plugin con anulaciones de plantilla, asegúrate de que los administradores del foro sean conscientes de los riesgos de estabilidad que conlleva tu tema/plugin.
![]()
![]()
Actualización de octubre de 2023: Para nuevas funcionalidades, 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 hacerse utilizando Salidas de Plugin
Entiendo que esto fallará en un futuro cercano, muéstrame las docs 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 archivo .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
La anulación de 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” de Discourse será pronto reemplazado por componentes Ember regulares. Pero mientras tanto, la anulación de 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 varios temas/plugins instalados anulan la misma plantilla, el ‘ganador’ es el que tiene el número de clasificación 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ético 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 principales. 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.