Developing Discourse Plugins - Part 2 - Connect to a plugin outlet
Previous tutorial: https://meta.discourse.org/t/developing-discourse-plugins-part-1-create-a-basic-plugin/30515
Getting Started: Templates
Discourse's client application is written using the Ember.js Javascript framework. Ember uses Templates to generate HTML. There's a great introduction to the templating language at that link, so definitely read it thoroughly.
The Problem: Adding elements to the Discourse User Interface
Many plugins need to add and extend the Discourse web interface. We provide a mechanism to do this called plugin outlets in handlebars templates.
If you browse the Discourse templates, you'll often see the following markup:
<PluginOutlet @name="edit-topic" />
This is declaring a plugin outlet called "edit-topic". It's an extension point in the template that plugin authors can leverage to add their own markup.
:exclamation: If you want to see some of the places where plugin outlets exist, you can run the following command in a POSIX-compliant shell:
git grep -A 1 "<PluginOutlet" -- "*.gjs"
You can also display the plugin outlets on a Discourse site by turning on the Discourse Developer Toolbar. Just type enableDevTools() in the browser console on a Discourse forum and click the plug icon that appears on the left side of the page.
Connecting to a Plugin Outlet
Once you've found the plugin outlet you want to add to, you have to write a connector for it. A connector is a .gjs component whose filename includes connectors/<outlet name> in its path.
For example, if the Discourse template has:
<PluginOutlet @name="evil-trout" />
Then any .gjs files you create in the connectors/evil-trout directory
will automatically be appended. So if you created the file:
plugins/hello/assets/javascripts/discourse/connectors/evil-trout/hello.gjs
With the contents:
<template>
<b>Hello World</b>
</template>
Discourse would insert <b>Hello World</b> at that point in the template.
Note that we called the file hello.gjs -- The filename (as opposed to the directory name) does not matter, but it must be unique across every plugin. It's useful to name it something descriptive of what you are extending it to do. This will make debugging easier in the future.
Troubleshooting
- Double check the name of the connector and make sure it matches the plugin name perfectly.
More information
https://meta.discourse.org/t/using-plugin-outlet-connectors-from-a-theme-or-plugin/32727
More in the series
Part 1: Plugin Basics Part 2: This topic Part 3: Site Settings Part 4: git setup Part 5: Admin interfaces Part 6: Acceptance tests Part 7: Publish your plugin
谢谢你的反馈!