Discourse Plugins entwickeln - Teil 2 - Mit einem Plugin-Outlet verbinden

Vorheriges Tutorial: Developing Discourse Plugins - Part 1 - Create a basic plugin


Erste Schritte: Handlebars-Vorlagen

Die Client-Anwendung von Discourse ist mit dem Javascript-Framework Ember.js geschrieben. Ember verwendet Handlebars für alle HTML-Vorlagen. Unter diesem Link finden Sie eine hervorragende Einführung in die Vorlagensprache, lesen Sie diese daher unbedingt gründlich durch.

Das Problem: Hinzufügen von Elementen zur Discourse-Benutzeroberfläche

Viele Plugins müssen die Discourse-Weboberfläche erweitern und ihr Elemente hinzufügen. Wir stellen einen Mechanismus dafür bereit, der als Plugin-Outlets in Handlebars-Vorlagen bezeichnet wird.

Wenn Sie die Handlebars-Vorlagen von Discourse durchsuchen, werden Sie häufig die folgende Markierung sehen:

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

Dies deklariert ein Plugin-Outlet namens „edit-topic“. Es ist eine Erweiterungsstelle in der Vorlage, die Plugin-Autoren nutzen können, um ihre eigenen Handlebars-Markups hinzuzufügen.

Wenn Sie Ihr Plugin erstellen, suchen Sie in den Discourse-Handlebars-Vorlagen (in .hbs-Dateien), die Sie ändern möchten, nach einem <PluginOutlet />. Wenn keines vorhanden ist, fragen Sie uns einfach, ob wir es erweitern können! Wir werden sie gerne hinzufügen, wenn Sie einen guten Anwendungsfall haben. Wenn Sie es uns einfacher und schneller machen möchten, reichen Sie bitte einen Pull Request auf GitHub ein!

:exclamation: Wenn Sie sehen möchten, an welchen Stellen Plugin-Outlets existieren, können Sie den folgenden Befehl ausführen, wenn Sie OSX oder Linux verwenden:

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

Sie können die Plugin-Outlets auch auf einer Discourse-Site anzeigen, indem Sie die Discourse Developer Toolbar aktivieren. Geben Sie einfach enableDevTools() in die Browserkonsole eines Discourse-Forums ein und klicken Sie auf das Steckersymbol, das auf der linken Seite der Seite erscheint.

Verbindung zu einem Plugin-Outlet

Sobald Sie das Plugin-Outlet gefunden haben, dem Sie etwas hinzufügen möchten, müssen Sie einen connector dafür schreiben. Ein Connector ist eigentlich nur eine Handlebars-Vorlage, deren Dateiname connectors/<outlet name> enthält.

Wenn die Discourse-Handlebars-Vorlage beispielsweise Folgendes enthält:

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

Dann werden alle Handlebars-Dateien, die Sie im Verzeichnis connectors/evil-trout erstellen, automatisch angehängt. Wenn Sie also die Datei erstellt hätten:

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

Mit dem Inhalt:

<b>Hello World</b>

Würde Discourse <b>Hello World</b> an dieser Stelle in die Vorlage einfügen.

Beachten Sie, dass wir die Datei hello.hbs genannt haben – der letzte Teil des Dateinamens ist nicht wichtig, aber er muss für jedes Plugin eindeutig sein. Es ist sinnvoll, ihm einen Namen zu geben, der beschreibt, was Sie erweitern. Dies erleichtert das Debuggen in Zukunft.

Fehlerbehebung

  • Überprüfen Sie den Namen des Connectors und stellen Sie sicher, dass er perfekt mit dem Plugin-Namen übereinstimmt.

Weitere Informationen


Mehr in der Serie

Teil 1: Plugin-Grundlagen
Teil 2: Dieses Thema
Teil 3: Site-Einstellungen
Teil 4: Git-Setup
Teil 5: Admin-Schnittstellen
Teil 6: Akzeptanztests
Teil 7: Veröffentlichen Sie Ihr Plugin


Dieses Dokument wird versioniert – schlagen Sie Änderungen auf github vor.

38 „Gefällt mir“

Is there a list of plugin outlets?

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

1 „Gefällt mir“

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 „Gefällt mir“

@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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“