Tenho dado alguns conselhos sobre como trabalhar com modelos .erb no Discourse recentemente e notei que não há muitos detalhes sobre isso aqui no meta, então pensei em iniciar esta wiki sobre o assunto. Esta wiki assume que você sabe o que são modelos .erb e qual é a sua função no Discourse e no Rails em geral. Se você quiser mais detalhes sobre esse contexto, leia isto primeiro.
Saídas de plugin do servidor
As saídas de plugin do servidor funcionam de forma semelhante às saídas de plugin do cliente, embora existam apenas algumas delas. Elas permitem que você insira seu próprio modelo .erb em um modelo .erb do discourse/discourse. Elas são definidas assim:
<%= server_plugin_outlet [name] %>
Para um exemplo, veja o uso da saída unsubscribe_options no plugin de chat:
Construtores de HTML
Os construtores de HTML são projetados para HTML padrão que é construído dinamicamente, em vez de usar modelos e saídas de plugin. Para usar construtores de HTML em modelos .erb, procure por estes pontos de inserção:
<%= build_plugin_html [name] %>
Você pode inserir HTML nesses pontos retornando-o para um bloco register_html_builder em seu plugin.rb, ou seja:
register_html_builder([name]) do |controller|
## construa e retorne seu HTML personalizado
end
Para um exemplo, veja o uso de server:before-head-close-crawler no plugin solved:
Você pode realmente registrar construtores de HTML para adicionar HTML do lado do cliente também, no entanto, isso não é recomendado. Adicione HTML do lado do cliente usando as saídas de plugin e modelos do lado do cliente.
Em um sentido semelhante, também existe um método de API de plugin do lado do servidor chamado register_custom_html, que pode ser usado para fins semelhantes, no entanto, a menos que você tenha um motivo específico para fazê-lo e saiba o que está fazendo, eu não o usaria.
Substituindo um modelo
Você pode substituir modelos .erb de um plugin adicionando as visualizações do seu plugin aos view_paths de um controlador. Isso é apenas Rails e não é específico do Discourse. Como isso funciona é abordado nos guias do rails aqui:
Por exemplo, se você quiser substituir app/views/email/unsubscribed.html.erb, você deve fazer duas coisas:
Estruture suas visualizações de plugin usando o mesmo namespace
Seu modelo deve estar aqui:
your-plugin-folder/app/views/email/unsubscribed.html.erb
Preceda o caminho de suas visualizações de plugin ao controlador relevante
Neste caso, o controlador relevante é EmailController. Adicione o seguinte ao seu arquivo plugin.rb:
EmailController.prepend_view_path File.expand_path("../views", __FILE__)
Você poderia adicionar as visualizações do seu plugin aos caminhos de visualização globais, no entanto, na maioria dos casos, não há necessidade de fazer isso.