Idealmente, ao personalizar o Discourse por meio de temas/plugins, você deve usar CSS, a API de Plugin JavaScript ou plugin outlets. Se nenhum destes funcionar para o seu caso de uso, sinta-se à vontade para abrir um PR no core do Discourse ou iniciar um tópico Dev aqui no Meta. Estamos sempre felizes em discutir a adição de novos outlets/APIs para facilitar a personalização.
Se você esgotou todas as outras opções, talvez precise recorrer a substituições de template. Esta técnica permite substituir o template inteiro de qualquer Componente Ember ou Rota do seu tema/plugin.
Esta não é uma forma recomendada de personalizar o Discourse. Mudanças do dia a dia no core do Discourse irão entrar em conflito com sua substituição de template eventualmente, potencialmente causando erros catastróficos ao renderizar o fórum.
Se você decidir seguir 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 template, certifique-se de que os administradores do fórum estejam cientes dos riscos de estabilidade que seu tema/plugin acarreta.
![]()
![]()
Atualização de Outubro de 2023: Para novos recursos, o Discourse está cada vez mais migrando para o uso de componentes criados usando o formato de arquivo
.gjsdo Ember. Os templates para esses componentes são definidos inline e não podem ser substituídos por temas/plugins.Daqui para frente, todas as personalizações de template devem ser feitas usando Plugin Outlets
Eu entendo que isso quebrará em um futuro próximo, mostre-me a documentação de qualquer maneira
Substituindo Templates de Componentes
Para substituir um template de Componente Ember (ou seja, qualquer coisa sob components/* no core do Discourse), você deve criar um .hbs com o mesmo nome no seu tema/plugin. Por exemplo, para substituir o template do componente badge-button no core do Discourse, você criaria um arquivo de template 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 core tenha um template ‘colocado no mesmo lugar’ (colocated).
Substituindo Templates de Rota
Substituir templates de rota (ou seja, todos os templates não-componentes sob templates/*) funciona da mesma forma que os componentes. Crie um template com o mesmo nome no seu tema/plugin. Por exemplo, para substituir discovery.hbs no core, você criaria um arquivo como
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
Substituindo Templates ‘Raw’ (.hbr)
O sistema de template “raw” do Discourse será em breve substituído por componentes Ember regulares. Mas, por enquanto, substituir templates raw funciona da mesma forma que templates Ember. Por exemplo, para substituir topic-list-item.hbr no core, você poderia criar um arquivo como:
{theme}/javascripts/discourse/templates/list/topic-list-item.hbr
{plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr
Interação entre múltiplos temas / plugins
Se múltiplos temas/plugins instalados substituírem o mesmo template, o ‘vencedor’ é aquele com a menor classificação numérica nesta lista:
- Substituições de Tema (o maior ‘id’ de tema vence)
- Substituições de Plugin (o nome de plugin alfabeticamente mais recente vence)
- Core
Esta precedência também significa que você pode substituir templates de plugins a partir de temas. Tecnicamente, você também pode substituir templates de temas a partir de outros temas, e templates 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 os templates na classe DiscourseTemplateMap. Para templates de componentes colocados no mesmo lugar, essa informação é usada durante a inicialização do app para substituir as associações de template do core. Para todos os outros templates, o mapa é usado pelo resolver em tempo de execução para buscar o template correto.
Este documento é controlado por versão - sugira alterações no github.