Idealmente, ao personalizar o Discourse por meio de temas/plugins, você deve usar CSS, a API de Plugins JavaScript ou saídas de plugin. Se nenhuma dessas opções atender ao seu caso de uso, sinta-se à vontade para abrir um PR no núcleo do Discourse ou iniciar um tópico em Development aqui no Meta. Sempre estamos felizes em discutir a adição de novas saídas/APIs para facilitar a personalização.
Se você esgotou todas as outras opções, pode ser necessário recorrer a substituições de modelos (template overrides). Essa técnica permite que você substitua o modelo inteiro de qualquer Componente ou Rota Ember a partir do seu tema/plugin.
Esta não é uma maneira recomendada de personalizar o Discourse. As alterações diárias no núcleo do Discourse conflitarão com a sua substituição de modelo em algum momento, potencialmente causando erros catastróficos ao renderizar o fórum.
Se você decidir adotar essa abordagem, certifique-se de ter testes automatizados e processos de QA suficientes para detectar regressões. Se você distribuir um tema/plugin com substituições de modelos, por favor, garanta que os administradores do fórum estejam cientes dos riscos de estabilidade que seu tema/plugin apresenta.
![]()
![]()
Atualização de outubro de 2023: Para novos recursos, o Discourse está migrando cada vez mais para o uso de componentes criados usando o formato de arquivo
.gjsdo Ember. Os modelos para esses componentes são definidos inline e não podem ser substituídos por temas/plugins.A partir de agora, todas as personalizações de modelos devem ser feitas usando Saídas de Plugin
Eu entendo que isso quebrará em um futuro próximo, mas me mostre a documentação mesmo assim
Substituindo Modelos de Componentes
Para substituir um modelo de Componente Ember (ou seja, qualquer coisa sob components/* no núcleo do Discourse), você deve criar um .hbs com o mesmo nome no seu tema/plugin. Por exemplo, para substituir o modelo do componente badge-button no núcleo do Discourse, você criaria um arquivo de modelo no seu tema/plugin neste local:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
A substituição deve estar sempre aninhada dentro do diretório /templates, mesmo que o componente do núcleo tenha um modelo ‘co-localizado’ (colocated).
Substituindo Modelos de Rotas
Substituir modelos de rotas (ou seja, todos os modelos que não são componentes sob templates/*) funciona da mesma forma que para componentes. Crie um modelo com o mesmo nome no seu tema/plugin. Por exemplo, para substituir o discovery.hbs no núcleo, você criaria um arquivo como
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Interação entre múltiplos temas / plugins
Se múltiplos temas/plugins instalados substituírem o mesmo modelo, o ‘vencedor’ é aquele com a classificação de menor número nesta lista:
- Substituições de tema (o maior ‘id’ do tema vence)
- Substituições de plugin (o nome do plugin mais recente em ordem alfabética vence)
- Núcleo (Core)
Essa precedência também significa que você pode substituir modelos de plugins a partir de temas. Tecnicamente, você também pode substituir modelos de temas a partir de outros temas, e modelos de plugins a partir de outros plugins, mas o comportamento pode ser surpreendente devido à dependência do nome do plugin e do id do tema.
Como isso funciona?
O Discourse monta e prioriza modelos na classe DiscourseTemplateMap. Para modelos de componentes co-localizados, essas informações são usadas durante a inicialização do aplicativo para substituir as associações de modelos do núcleo. Para todos os outros modelos, o mapa é usado pelo resolvedor em tempo de execução para buscar o modelo correto.
Este documento é controlado por versão - sugira alterações no github.