Idealmente, ao personalizar o Discourse por meio de temas ou plugins, você deve usar CSS, a API de Plugin JavaScript ou saídas de plugin. Se nenhuma dessas opções funcionar para o seu caso de uso, sinta-se à vontade para abrir um PR no núcleo do Discourse ou iniciar um tópico Development aqui no Meta. Estamos sempre 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 precisar recorrer a substituições de template. Essa técnica permite que você substitua todo o template de qualquer Componente ou Rota Ember do seu tema/plugin.
Isso não é uma maneira recomendada de personalizar o Discourse. Mudanças diárias no núcleo do Discourse vão eventualmente entrar em conflito com sua substituição de template, potencialmente causando erros catastróficos ao renderizar o fórum.
Se você decidir seguir essa abordagem, certifique-se de ter processos automatizados de teste e QA suficientes para detectar regressões. Se você distribuir um tema/plugin com substituições de template, por favor, garanta que os administradores do fórum estejam cientes dos riscos de estabilidade que seu tema/plugin carrega.
![]()
![]()
Atualização de Outubro de 2023: Para novos recursos, o Discourse está cada vez mais migrando para o uso de componentes autorados no formato de arquivo
.gjsdo Ember. Os templates desses componentes são definidos inline e não podem ser substituídos por temas/plugins.A partir de agora, todas as personalizações de template devem ser feitas usando Saídas de Plugin
Entendo que isso quebrará em breve, mostre-me a documentação mesmo assim
Substituindo Templates de Componentes
Para substituir um template de Componente Ember (ou seja, qualquer coisa em components/* no núcleo do Discourse), você deve criar um arquivo .hbs com o mesmo nome no seu tema/plugin. Por exemplo, para substituir o template do componente badge-button no núcleo 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 central tenha um template ‘co-localizado’.
Substituindo Templates de Rotas
A substituição de templates de rotas (ou seja, todos os templates não-componentes em templates/*) funciona da mesma maneira que os componentes. Crie um template com o mesmo nome no seu tema/plugin. Por exemplo, para substituir 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 template, o ‘vencedor’ será aquele com a classificação de número mais baixo nesta lista:
- Substituições de tema (o ‘id’ de tema mais alto vence)
- Substituições de plugin (o nome de plugin alfabeticamente mais recente vence)
- Núcleo
Essa precedência também significa que você pode substituir templates de plugins por temas. Tecnicamente, você também pode substituir templates de tema por outros temas e templates de plugin por 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 co-localizados, essa informação é usada durante a inicialização do aplicativo para substituir as associações de template do núcleo. Para todos os outros templates, o mapa é usado pelo resolvedor em tempo de execução para buscar o template correto.
Este documento está sob controle de versão - sugira alterações no github.