Sviluppare Plugin per Discourse - Parte 1 - Creare un plugin di base

Hmmmm. That’s a tricky one, because the symlink needed to be deleted, otherwise the Docker mount fails (as it cannot overwrite the existing file).

I had a bit of a google around for solutions, and found an interesting solution which would dereference the symlink and copy the symlink’s target into the specified directory, but couldn’t find anything that would create a Docker volume mount, thus preserving the dynamic link and bi-directional synchronisation. Happy to be steered towards a solution as this would be a neat feature to have.

Dimmi come aggiungere la tua validazione al modello app/models/user.rb?

1 Mi Piace

Puoi utilizzare codice Ruby standard per farlo nel tuo plugin.rb:

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
6 Mi Piace

Sto appena iniziando il mio primo piccolo plugin :blush: Ho alcune domande, spero che qualcuno possa aiutarmi…

La prima domanda è: importa se usiamo ciò che è in questa guida o dovremmo davvero puntare a usare il generatore di plugin?

Non è stato trattato in questa guida, ma come possiamo rendere i dati disponibili ai nostri template dal file plugin.rb?

Supponiamo, ad esempio, che voglia visualizzare un messaggio di benvenuto casuale nell’outlet del plugin topic-above-posts ogni volta che qualcuno visita un argomento, con il messaggio scelto casualmente da un array in plugin.rb… come invieresti quei dati al template? Che presumibilmente andrebbe qui:

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs (È corretto?)

Qualsiasi consiglio è molto apprezzato :blush:

2 Mi Piace

Utilizzare il generatore di plugin è generalmente un ottimo modo per iniziare e capire come dovrebbe essere strutturato un plugin. Lo consiglio.

Ora, per quanto riguarda come inserire il codice Ruby nel frontend: si tratta di due applicazioni diverse. L’applicazione frontend (Ember) dovrà richiederla al server (Rails) in qualche modo. Normalmente lo facciamo tramite una chiamata AJAX, ma potresti anche aggiungere qualcosa al SiteSerializer in modo che venga inviata automaticamente come parte dei dati del forum.

In alternativa, dovrai consultare come aggiungere una route/controller in Rails e inviare i messaggi come JSON.

8 Mi Piace

Grazie, Robin!

Sai se esistono tutorial su questo? Oppure, c’è un semplice plugin (o anche un plugin fittizio) che possiamo consultare per capire la direzione giusta da prendere? (Se non esiste, potresti metterlo a disposizione per noi da qualche parte? Penso che aiuterebbe molte persone :blush:)

Inoltre… hai altri pensieri sulla scrittura di un libro? Posso metterti in contatto con qualcuno se ti fa piacere :smiley:

1 Mi Piace

Grazie per il complimento, ma sono decisamente troppo impegnato per prendere in considerazione la scrittura di un libro. Inoltre, i libri di tecnologia hanno una portata SUPER limitata. Chi conosco che ne ha scritti dice che lo fai per te stesso, non per i soldi :slight_smile:

Non riesco a pensare a un semplice plugin per restituire qualcosa dal lato server. discourse-tooltips aggiunge una rotta e poi la utilizza per ottenere anteprime degli argomenti mentre passi il mouse sopra, quindi potrebbe essere utile.

8 Mi Piace

A breve inizierò lo sviluppo di plugin…

Domanda:

Esiste un elenco di hooks dove possiamo effettivamente plugin?

Ad esempio, se volessimo scrivere un plugin per elaborare i dati cooked in un post prima che vengano visualizzati, ci aspetteremmo di trovare almeno un hook all’inizio e uno alla fine, come (ad esempio):

  • display_post_start

  • display_post_complex

In tal caso, il nostro plugin si hookerebbe al codice nella posizione del hook scelta tra quelle sopra.

Esiste un elenco di questi plugin hooks e come vengono chiamati questi plugin hooks in DiscourseWorld?

Aggiornamento: Ho trovato questo:

git grep "plugin-outlet" -- "*.hbs"

Ma non ho visto alcun outlet per modificare il contenuto cooked di un post.

Esiste un tutorial su come creare i nostri outlet, ad esempio un outlet per modificare la parte cooked dei post?

2 Mi Piace

Stai cercando questa guida, sezione decorateCooked():

5 Mi Piace

Utilizzo questo scheletro per un plugin personalizzato. Devo cambiare qualcosa per la transizione a Ember 5 in arrivo?

Suppongo di no? Anche se questo è solo un linter?

1 Mi Piace

Lo scheletro è compatibile con Ember 5. Ma se hai aggiunto codice JavaScript o template HBS, dovrai verificare le deprecazioni come descritto nell’annuncio.

Sì, le cose in package.json sono solo relative al linting, non influiscono sulla funzionalità o sulla compatibilità di un plugin.

3 Mi Piace

Aggiungi a questo

rake plugin:create[plugin-name]

Ho passato troppo tempo oggi a cercare Automating Discourse Plugin Setup with `create-discourse-plugin` gem (non sono sicuro di come non sia riuscito a ricordare che questo fosse il nome del rake task?! :person_shrugging: )

5 Mi Piace

Aggiungerei anche una nota quando si utilizza la configurazione Docker, poiché le istruzioni precedenti falliranno con un errore simile a

ambientimpact:~/.../Discourse/discourse$ d/rake plugin:create[neurocracy-date-rewrite]
Cloning 'https://github.com/discourse/discourse-plugin-skeleton' to '/src/plugins/neurocracy-date-rewrite'...
Initializing git repository...
Initialized empty Git repository in /src/plugins/neurocracy-date-rewrite/.git/
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <discourse@localhost>) not allowed
rake aborted!
Command failed with exit 128: git
/src/lib/tasks/plugin.rake:354:in `system'
/src/lib/tasks/plugin.rake:354:in `block (2 levels) in <main>'
/src/lib/tasks/plugin.rake:344:in `chdir'
/src/lib/tasks/plugin.rake:344:in `block in <main>'
Tasks: TOP => plugin:create
(See full trace by running task with --trace)

Prima devi configurare il tuo .gitconfig all’interno del container (cambia email e nome secondo necessità) prima di provare a creare il plug-in:

d/exec git config --global user.email "you@example.com"
d/exec git config --global user.name "Your Name"
d/rake plugin:create[plugin-name]
1 Mi Piace