Travailler avec des templates .erb dans un plugin

J’ai récemment donné quelques conseils sur la façon de travailler avec des modèles .erb dans Discourse et j’ai remarqué qu’il n’y avait pas beaucoup de détails à ce sujet ici sur meta, j’ai donc pensé à créer ce wiki sur le sujet. Ce wiki suppose que vous savez ce que sont les modèles .erb et quelle est leur fonction dans Discourse, et plus largement dans Rails. Si vous souhaitez plus de détails sur ce contexte, veuillez lire ceci d’abord.

Sorties de plugin serveur

Les sorties de plugin serveur fonctionnent de manière similaire aux sorties de plugin client, bien qu’il n’y en ait que quelques-unes. Elles vous permettent d’insérer votre propre modèle .erb dans un modèle .erb discourse/discourse. Elles sont définies comme suit :

<%= server_plugin_outlet [name] %>

Pour un exemple, voir l’utilisation de la sortie unsubscribe_options dans le plugin chat :

Constructeurs HTML

Les constructeurs HTML sont conçus pour le HTML standard qui est construit dynamiquement, au lieu d’utiliser des modèles et des sorties de plugin. Pour utiliser des constructeurs HTML dans des modèles .erb, recherchez ces points d’insertion :

<%= build_plugin_html [name] %>

Vous pouvez insérer du HTML à ces points en le retournant à un bloc register_html_builder dans votre plugin.rb, c’est-à-dire

register_html_builder([name]) do |controller|
   ## construisez et retournez votre HTML personnalisé
end

Pour un exemple, voir l’utilisation de server:before-head-close-crawler dans le plugin solved :

Vous pouvez en fait enregistrer des constructeurs HTML pour ajouter également du HTML côté client, cependant, ce n’est pas recommandé. Ajoutez du HTML côté client en utilisant les sorties et les modèles de plugin côté client.

Dans le même ordre d’idées, il existe également une méthode d’API de plugin côté serveur appelée register_custom_html, qui peut être utilisée à des fins similaires, cependant, à moins que vous n’ayez une raison spécifique de le faire, et que vous sachiez ce que vous faites, je ne l’utiliserais pas.

Remplacer un modèle

Vous pouvez remplacer les modèles .erb d’un plugin en ajoutant les vues de votre plugin aux view_paths d’un contrôleur. C’est juste Rails, et ce n’est pas spécifique à Discourse. Comment cela fonctionne est couvert dans les guides Rails ici :

Par exemple, si vous souhaitez remplacer app/views/email/unsubscribed.html.erb, vous devez faire deux choses :

Structurez vos vues de plugin en utilisant le même espace de noms

Votre modèle doit être ici :

your-plugin-folder/app/views/email/unsubscribed.html.erb

Préfixez le chemin de vos vues de plugin au contrôleur pertinent

Dans ce cas, le contrôleur pertinent est EmailController. Ajoutez ce qui suit à votre fichier plugin.rb :

EmailController.prepend_view_path File.expand_path("../views", __FILE__)

Vous pourriez ajouter les vues de votre plugin aux chemins de vue globaux, cependant, il n’est pas nécessaire de le faire dans la plupart des cas.

8 « J'aime »