Développement de plugins Discourse - Partie 1 - Créer un plugin de 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.

Dites-moi comment ajouter votre validation au modèle app/models/user.rb ?

1 « J'aime »

Vous pouvez utiliser du code Ruby standard pour cela dans votre fichier plugin.rb :

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
6 « J'aime »

Je débute tout juste sur mon premier petit plugin :blush: J’ai quelques questions, j’espère que quelqu’un pourra m’aider…

Ma première question est de savoir s’il est important d’utiliser ce qui est dans ce guide ou si nous devrions vraiment viser l’utilisation du générateur de plugins ?

Ce n’était pas couvert dans ce guide, mais comment pouvons-nous rendre des données disponibles pour nos templates depuis le fichier plugin.rb ?

Par exemple, si je veux afficher un message de bienvenue aléatoire à l’emplacement topic-above-posts chaque fois que quelqu’un visite un sujet, le message étant choisi au hasard dans un tableau dans plugin.rb… comment envoyer ces données au template ? Ce qui, je suppose, irait ici :

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs (Est-ce correct ?)

Tous les conseils sont grandement appréciés :blush:

2 « J'aime »

L’utilisation du générateur de plugin est généralement un excellent moyen de commencer et de comprendre la structure d’un plugin. Je le recommande.

Maintenant, concernant l’intégration de code Ruby dans le front-end : ce sont deux applications distinctes. L’application front-end (Ember) devra la demander au serveur (Rails) d’une manière ou d’une autre. Normalement, nous le faisons via un appel AJAX, mais vous pourriez également ajouter quelque chose au SiteSerializer afin qu’il soit envoyé automatiquement dans le cadre des données du forum.

Sinon, vous devrez consulter comment ajouter une route ou un contrôleur dans Rails et envoyer les messages au format JSON.

8 « J'aime »

Merci Robin !

Saurais-tu s’il existe des tutoriels à ce sujet ? Ou y a-t-il un plugin simple (ou même un plugin factice) que nous pourrions consulter pour nous orienter dans la bonne direction ? (Sinon, pourrais-tu rapidement le mettre en ligne quelque part pour nous ? Je pense que cela aiderait beaucoup de personnes :blush:)

En plus… as-tu d’autres idées concernant la rédaction d’un livre ? Je peux te mettre en contact avec quelqu’un si l’idée te tente :smiley:

1 « J'aime »

Merci pour le compliment, mais je suis vraiment trop occupé pour envisager d’écrire un livre. De plus, les livres techniques ont une portée SUPER limitée. Ceux que je connais qui en ont écrit disent que c’est pour soi-même, pas pour l’argent :slight_smile:

Je ne parviens pas à imaginer un plugin simple pour renvoyer quelque chose depuis le côté serveur. discourse-tooltips ajoute une route, puis l’utilise pour récupérer des aperçus de sujets lorsque vous passez la souris dessus, ce qui pourrait vous être utile.

8 « J'aime »

Bientôt, je commencerai le développement de plugins…

Question :

Existe-t-il une liste de hooks dans lesquels nous pouvons réellement insérer un plugin ?

Par exemple, si nous voulons écrire un plugin pour traiter les données cuites dans un post avant qu’elles ne soient affichées, nous nous attendrions à ce qu’il y ait au moins un hook au début et un à la fin, comme (par exemple) :

  • display_post_start

  • display_post_complex

Ensuite, notre plugin pourrait s'insérer dans le code à l’emplacement du hook de notre choix ci-dessus.

Existe-t-il une liste de ces hooks de plugin et comment sont-ils appelés dans DiscourseWorld ?

Mise à jour : J’ai trouvé ceci :

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

Mais je n’ai pas vu d’outlet pour modifier le contenu cuit d’un post.

Existe-t-il un tutoriel sur la création de nos propres outlets, par exemple un outlet pour modifier la partie cuite des posts ?

2 « J'aime »

Vous recherchez ce guide, section decorateCooked() :

5 « J'aime »

J’utilise ce squelette pour un plugin personnalisé. Dois-je changer quelque chose pour la transition à venir vers Ember 5 ?

Je suppose que non ? Bien que ce ne soit qu’un linter ?

1 « J'aime »

Le squelette est compatible avec Ember 5. Mais si vous avez ajouté du code JavaScript ou des modèles HBS, vous devrez vérifier les dépréciations comme décrit dans l’annonce.

Oui, les éléments dans package.json sont uniquement liés au linting, ils n’affectent pas la fonctionnalité ou la compatibilité d’un plugin.

3 « J'aime »

Veuillez ajouter à ceci

rake plugin:create[plugin-name]

J’ai passé trop de temps aujourd’hui à essayer de trouver Automating Discourse Plugin Setup with `create-discourse-plugin` gem (je ne sais pas comment j’ai pu oublier que c’était le nom de la tâche rake ?! :person_shrugging: )

5 « J'aime »

J’ajouterais également une note lors de l’utilisation de la configuration Docker, car les instructions ci-dessus échoueront avec une erreur similaire à

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)

Vous devez d’abord configurer votre .gitconfig à l’intérieur du conteneur (changez l’e-mail et le nom si nécessaire) avant d’essayer de créer le 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 « J'aime »