Ho recentemente fornito alcuni consigli su come lavorare con i template .erb in Discourse e ho notato che non ci sono molti dettagli a riguardo qui su meta, quindi ho pensato di iniziare questo wiki sull’argomento. Questo wiki presuppone che tu sappia cosa sono i template .erb e quale sia la loro funzione in Discourse e in Rails in generale. Se desideri maggiori dettagli su questo background, leggi prima questo:
Server plugin outlets
I server plugin outlets funzionano in modo simile ai client plugin outlets, sebbene ce ne siano solo alcuni. Ti consentono di inserire il tuo template .erb in un template .erb di discourse/discourse. Sono definiti in questo modo:
<%= server_plugin_outlet [name] %>
Per un esempio, vedi l’uso dell’outlet unsubscribe_options nel plugin chat:
HTML builders
Gli HTML builders sono progettati per l’HTML standard costruito dinamicamente, invece di utilizzare template e plugin outlets. Per utilizzare gli HTML builders nei template .erb, cerca questi punti di inserimento:
<%= build_plugin_html [name] %>
Puoi inserire HTML in questi punti restituendolo a un blocco register_html_builder nel tuo plugin.rb, ad esempio:
register_html_builder([name]) do |controller|
## costruisci e restituisci il tuo HTML personalizzato
end
Per un esempio, vedi l’uso di server:before-head-close-crawler nel plugin solved:
Puoi effettivamente registrare html builders per aggiungere anche HTML lato client, tuttavia questo non è raccomandato. Aggiungi HTML lato client utilizzando i plugin outlets e i template lato client.
In modo simile, esiste anche un metodo API di plugin lato server chiamato register_custom_html, che può essere utilizzato per scopi simili, tuttavia, a meno che tu non abbia un motivo specifico per farlo e sappia cosa stai facendo, non lo userei.
Sovrascrivere un template
Puoi sovrascrivere i template .erb da un plugin aggiungendo le viste del tuo plugin ai view_paths di un controller. Questo è solo Rails e non è specifico di Discourse. Come funziona è trattato nelle guide di rails qui:
Ad esempio, se vuoi sovrascrivere app/views/email/unsubscribed.html.erb, dovresti fare due cose:
Struttura le viste del tuo plugin utilizzando lo stesso namespace
Il tuo template dovrebbe trovarsi qui:
your-plugin-folder/app/views/email/unsubscribed.html.erb
Anteponi il percorso delle viste del tuo plugin al controller pertinente
In questo caso, il controller pertinente è EmailController. Aggiungi quanto segue al tuo file plugin.rb:
EmailController.prepend_view_path File.expand_path("../views", __FILE__)
Potresti aggiungere le viste del tuo plugin ai percorsi delle viste globali, tuttavia, nella maggior parte dei casi non è necessario.