Idealmente, ao personalizar o Discourse por meio de temas/plugins, você deve usar CSS, a API de Plugin JavaScript ou plugin outlets. Se nenhum desses funcionar para o seu caso de uso, sinta-se à vontade para abrir um PR para o 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, pode ser necessário recorrer a substituições de templates. Essa técnica permite que você substitua todo o template de qualquer Componente Ember ou Rota do seu tema/plugin.
Esta não é uma maneira 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á se movendo cada vez mais 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
[details=Eu entendo que isso quebrará em um futuro próximo, mostre 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 arquivo .hbs com nome idêntico em seu tema/plugin. Por exemplo, para substituir o template do componente badge-button no core do Discourse, você criaria um arquivo de template em 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 sempre ser aninhada dentro do diretório /templates, mesmo que o componente core tenha um template ‘colocado’.
Substituindo Templates de Rotas
A substituição de templates de rotas (ou seja, todos os templates não componentes sob templates/*) funciona da mesma forma que os componentes. Crie um template com nome idêntico em 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 em breve será substituído por componentes Ember regulares. Mas, por enquanto, a substituição de templates raw funciona da mesma forma que os 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 temas (o maior ‘id’ do tema vence)
- Substituições de plugins (o nome alfabético mais recente do plugin vence)
- Core
Essa 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 de outros temas, e templates de plugins 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 templates na classe DiscourseTemplateMap. Para templates de componentes colocados, essas informações são usadas durante a inicialização do aplicativo 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.