Creare un plugin per Discourse può essere davvero semplice, una volta che si imparano alcune peculiarità. L’obiettivo di questo post è creare un plugin base e introdurre i concetti fondamentali.
Il tuo ambiente di sviluppo
Assicurati di avere un ambiente di sviluppo di Discourse in esecuzione sul tuo computer. Ti consigliamo di utilizzare la guida di installazione appropriata e di tornare qui quando hai finito.
plugin.rb
Usa GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub per creare uno scheletro completo di plugin Discourse nella directory dei plugin
Lo scheletro è ora incluso nel core di Discourse;
rake plugin:create[nome-plugin]creerà un plugin utilizzando lo scheletro
Quando Discourse si avvia, cerca nella directory plugins sottodirectory contenenti un file plugin.rb. Il file plugin.rb ha due scopi: è il manifesto del tuo plugin con le informazioni obbligatorie, tra cui: nome, informazioni di contatto e descrizione. Il secondo scopo è inizializzare il codice ruby necessario per eseguire il tuo plugin.
Nel nostro caso, non aggiungeremo alcun codice ruby, ma avremo comunque bisogno del plugin.rb. Creiamo la directory basic-plugin con il file plugin.rb all’interno, con il seguente contenuto:
basic-plugin/plugin.rb
# name: basic-plugin
# about: A super simple plugin to demonstrate how plugins work
# version: 0.0.1
# authors: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
Una volta creato questo file, dovresti riavviare il server locale e il plugin dovrebbe essere caricato.
Un’importante insidia!
Se sei abituato allo sviluppo regolare con Rails, potresti notare che i plugin non sono altrettanto comodi quando si tratta di ricaricamento. In generale, quando apporti modifiche al tuo plugin, dovresti premere Ctrl+c per fermare il server e poi eseguirlo di nuovo utilizzando bin/dev.
Le mie modifiche non sono state rilevate! 
A volte la cache non viene completamente svuotata, soprattutto quando si creano nuovi file o si eliminano file vecchi. Per risolvere questo problema, elimina la cartella tmp e avvia di nuovo rails. Su un Mac puoi farlo con un solo comando: rm -rf tmp; bin/dev.
Verificare che il plugin sia stato caricato
Una volta riavviato il server locale, visita l’URL /admin/plugins (assicurati di essere autenticato come account amministratore prima, poiché solo gli amministratori possono vedere il registro dei plugin).
Se tutto ha funzionato, dovresti vedere il tuo plugin nell’elenco:
Congratulazioni, hai appena creato il tuo primo plugin!
Aggiungiamo un po’ di Javascript
Al momento il tuo plugin non fa nulla. Aggiungiamo un file javascript che farà apparire una finestra di alert quando Discourse viene caricato. Questo sarà molto fastidioso per qualsiasi utente e non è consigliato come plugin reale, ma mostrerà come inserire Javascript nella nostra applicazione in esecuzione.
Crea il seguente file:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("alert boxes are annoying!");
},
};
Ora, se riavvii il server locale, dovresti vedere apparire sullo schermo “alert boxes are annoying!”. (Se non è così, consulta la sezione “Le mie modifiche non sono state rilevate” sopra).
Vediamo come ha funzionato:
-
I file Javascript posizionati in
assets/javascripts/discourse/initializersvengono eseguiti automaticamente quando l’applicazione Discourse viene caricata. -
Questo file in particolare
exporta un oggetto, che ha unnamee una funzioneinitialize. -
Il
namedeve essere univoco, quindi l’ho chiamato semplicementealert. -
La funzione
initialize()viene chiamata quando l’applicazione viene caricata. Nel nostro caso, tutto ciò che fa è eseguire il nostro codicealert().
Ora sei ufficialmente uno sviluppatore di plugin Discourse!
Altri articoli della serie
Parte 1: Questo argomento
Parte 2: Plugin Outlets
Parte 3: Site Settings
Parte 4: git setup
Parte 5: Admin interfaces
Parte 6: Acceptance tests
Parte 7: Publish your plugin
Questo documento è sottoposto a controllo di versione - suggerisci modifiche su github.

