Développement de plugins Discourse - Partie 2 - Connexion à une sortie de plugin

Tutoriel précédent : Developing Discourse Plugins - Part 1 - Create a basic plugin


Démarrage : Modèles Handlebars

L’application cliente de Discourse est écrite en utilisant le framework Javascript Ember.js. Ember utilise Handlebars pour tous les modèles HTML. Il y a une excellente introduction au langage de modélisation à ce lien, alors lisez-le attentivement.

Le problème : Ajouter des éléments à l’interface utilisateur de Discourse

De nombreux plugins doivent ajouter et étendre l’interface web de Discourse. Nous fournissons un mécanisme pour ce faire appelé plugin outlets (points de sortie de plugin) dans les modèles Handlebars.

Si vous parcourez les modèles Handlebars de Discourse, vous verrez souvent le balisage suivant :

<PluginOutlet @name="edit-topic" />

Ceci déclare un plugin outlet nommé « edit-topic ». C’est un point d’extension dans le modèle que les auteurs de plugins peuvent exploiter pour ajouter leur propre balisage Handlebars.

Lors de la création de votre plugin, recherchez dans les modèles Handlebars de Discourse (dans les fichiers .hbs) que vous souhaitez modifier un <PluginOutlet />. S’il n’y en a pas, demandez-nous simplement de l’étendre ! Nous serons heureux d’en ajouter si vous avez un bon cas d’utilisation. Si vous souhaitez nous faciliter et accélérer cette tâche, veuillez soumettre une pull request sur github !

:exclamation: Si vous souhaitez voir certains des endroits où les plugin outlets existent, vous pouvez exécuter la commande suivante si vous êtes sur OSX ou Linux :

git grep "<PluginOutlet" -- "*.hbs"

Vous pouvez également afficher les plugin outlets sur un site Discourse en activant la Discourse Developer Toolbar. Tapez simplement enableDevTools() dans la console du navigateur sur un forum Discourse et cliquez sur l’icône de prise qui apparaît sur le côté gauche de la page.

Connexion à un Plugin Outlet

Une fois que vous avez trouvé le plugin outlet auquel vous souhaitez ajouter du contenu, vous devez écrire un connector pour celui-ci. Un connector n’est en réalité qu’un modèle Handlebars dont le nom de fichier inclut connectors/<nom de l'outlet> dedans.

Par exemple, si le modèle Handlebars de Discourse contient :

<PluginOutlet @name="evil-trout" />

Alors tous les fichiers Handlebars que vous créez dans le répertoire connectors/evil-trout seront automatiquement ajoutés. Donc, si vous avez créé le fichier :

plugins/hello/assets/javascripts/discourse/connectors/evil-trout/hello.hbs

Avec le contenu :

<b>Hello World</b>

Discourse insérerait <b>Hello World</b> à cet endroit dans le modèle.

Notez que nous avons nommé le fichier hello.hbs – La partie finale du nom de fichier n’a pas d’importance, mais elle doit être unique pour chaque plugin. Il est utile de lui donner un nom descriptif de ce que vous étendez. Cela facilitera le débogage à l’avenir.

Dépannage

  • Vérifiez deux fois le nom du connector et assurez-vous qu’il correspond parfaitement au nom du plugin.

Plus d’informations


Plus dans la série

Partie 1 : Bases des Plugins
Partie 2 : Ce sujet
Partie 3 : Paramètres du Site
Partie 4 : Configuration git
Partie 5 : Interfaces d’administration
Partie 6 : Tests d’acceptation
Partie 7 : Publiez votre plugin


Ce document est contrôlé par version - suggérez des modifications sur github.

38 « J'aime »

Is there a list of plugin outlets?

More specifically I would like to know if one could modify the “create topic” template?

1 « J'aime »

In what way? Add new fields to the composer area (like the tagging plugin does)?

Yes, that’s what I am searching for.

I’d take a look at the tagging plugin then. It might have all you want!

2 « J'aime »

@eviltrout is there a way to output directly to JSON.
basically creating a new API endpoint?

Ahhhhhhhh. new to this whole “ruby fad” :smiley:
I have a partial solution that i’ll detail in:

Hi Robin,

The plugin-outlet-locations plugin seems to declare all the connectors with a register_asset line in plugin.rb. Starting here: discourse-plugin-outlet-locations/plugin.rb at master · Mittineague/discourse-plugin-outlet-locations · GitHub

Is that a necessary step?

Nope - that’s not necessary. All .es6 and .hbs files are loaded automatically in plugins.

4 « J'aime »

I am still trying to figure out how plugins in Discourse work and I could use a little help.

I would like to modify the timeline scroll bar (in the right side of each topic). Actually, what I need to do is add some stuff (image/banner) below the scroll bar.
What template should I edit? Is there an existing plugin-outlet for that?

Thank you,
Ilias

2018-4-28 work for me!

1. Plugin Outlet name

2. Code

3. Result

7 « J'aime »

This guide is great! I had my plugin showing in the /admin/plugins quite easily.

I was wondering though, how do you delete items from a template?

For privacy reasons, I wanted to delete the export to csv button in the /admin/users/list/active as well as the show emails button. But I didn’t find a plugin outlet connector for those parts of the UI.

I was trying to overwrite the following templates

/users-list-show.hbs
/users-list.hbs

with my plugin outlet.

But creating these files
/var/www/discourse/plugins/[my-plugin]/assets/javascripts/admin/templates/users-list-show.hbs
/var/www/discourse/plugins/[my-plugin]/assets/javascripts/admin/templates/users-list.hbs
and making changes to them didnt seem to work. Even after deleting the /var/www/discourse/tmp folder and restarting the server.

Is this the correct way to delete those buttons from the UI? Using css display: none; isn’t an option.

I feel like I am missing something really simple, any ideas?

Not a direct technical answer to your question but why would you want to do that?

Only the admins can do this. They usually have full control of the server most likely anyway and could read the database, so hiding a button is a bit futile: emails will also show up in the Email logs and on your mail service logs. I’m afraid site admins are going to see a lot of email addresses!

Admins have full control, they see everything (except passwords presumably), so this is normal.

If you are an admin, get used to the responsibility which comes with knowing all of this!

My concern was that moderators can access some things in the admin dashboard.
They can navigate to the ‘users’ tab and see the Export and the Show Emails buttons
image

We don’t want our moderators to be able to grab bulk emails like this.
I understand that the emails are visible on users profiles, but we didn’t want an easy way to get this information.

So I was trying to create a plugin that hides these buttons.

Could be wrong, but this suggests it’s not an issue … have you Impersonated a Mod?

Yes, the screenshot I took was from impersonating a mod.

We have a similar setup as the link you provided (Moderators ability to see emails inconsistent).

I’m not requesting the Discourse team makes any changes though, this isn’t an issue with Discourse.

I am trying customize Discourse for our situation. I was hoping that using a plugin outlet and referencing the files within that plugin was the right way to overwrite a template in Discourse. I just wasn’t able to successfully overwrite these files:

/users-list-show.hbs
/users-list.hbs

My changes never showed up. So I thought this plugin outlet topic could help

1 « J'aime »

Perhaps someone else can chime in, but I’ve always seen Outlets as additive. You may need an override technique instead (via javascript/Ember). I’m still learning this myself :).

2 « J'aime »

I’m thinking that if overriding a template is the goal that it might be better to do this with a theme instead of a plugin.

I was thinking that as well, but I didn’t want a user to swap their theme and be able to get different functionality. So I figured a plugin outlet would do the trick

I think you can probably hide those with CSS.

2 « J'aime »