Creare un plugin per Discourse può essere davvero semplice, una volta che impari alcuni piccoli trucchi. L’obiettivo di questo post è creare una struttura base di un plugin e presentarti le basi.
Il tuo ambiente di sviluppo
Assicurati di avere un ambiente di sviluppo di Discourse in esecuzione sul tuo computer. Ti consiglio di seguire 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 una struttura completa di un plugin Discourse nella tua directory dei plugin
La struttura è ora inclusa nel core di Discourse,
rake plugin:create[nome-plugin]creerà un plugin utilizzando la struttura
All’avvio, Discourse cerca nella directory plugins le sottodirectory che contengono un file plugin.rb. Il file plugin.rb ha due scopi: è il manifesto del tuo plugin con le informazioni richieste sul tuo plugin, inclusi: il suo nome, le informazioni di contatto e una descrizione. Il secondo scopo è inizializzare qualsiasi codice Ruby necessario per eseguire il tuo plugin.
Nel nostro caso, non aggiungeremo alcun codice Ruby, ma abbiamo comunque bisogno del file plugin.rb. Creiamo la directory basic-plugin con il file plugin.rb al suo interno, con il seguente contenuto:
basic-plugin/plugin.rb
# name: basic-plugin
# about: Un plugin super semplice per dimostrare come funzionano i plugin
# version: 0.0.1
# authors: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
Una volta creato questo file, dovrai riavviare il tuo server locale e il plugin dovrebbe essere caricato.
Un importante tranello!
Se sei abituato allo sviluppo Rails normale, potresti notare che i plugin non sono così comodi quando si tratta di ricaricare. In generale, quando apporti modifiche al tuo plugin, dovresti premere Ctrl+c per arrestare il server, quindi eseguirlo di nuovo usando bin/dev.
Le mie modifiche non sono state rilevate! 
A volte la cache non viene completamente cancellata, soprattutto quando crei nuovi file o elimini file vecchi. Per risolvere questo problema, rimuovi la tua cartella tmp e avvia di nuovo Rails. Su un Mac puoi farlo con un unico comando: rm -rf tmp; bin/dev.
Verificare che il tuo plugin sia stato caricato
Una volta riavviato il tuo server locale, visita l’URL /admin/plugins (assicurati di essere loggato 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 mostrerà una finestra di avviso quando Discourse viene caricato. Questo sarà super 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("le finestre di avviso sono fastidiose!");
},
};
Ora, se riavvii il tuo server locale, dovresti vedere “le finestre di avviso sono fastidiose!” apparire sullo schermo. (Se non lo hai visto, consulta la sezione “Le mie modifiche non sono state rilevate” sopra).
Analizziamo 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 semplicemente chiamatoalert. -
La funzione
initialize()viene chiamata quando l’applicazione viene caricata. Nel nostro caso, tutto ciò che fa è eseguire il nostro codicealert().
Ora sei un developer di plugin Discourse ufficiale!
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: Pubblica il tuo plugin
Questo documento è sotto controllo di versione - suggerisci modifiche su github.

