前のチュートリアル: Developing Discourse Plugins - Part 4 - Setup git
サイト設定だけでは、プラグインを希望通りに動作させるための管理インターフェースとして不十分な場合があります。例えば、discourse-akismet プラグインをインストールすると、Discourse の管理プラグインセクションにナビゲーション項目が追加されていることに気づいたかもしれません。
このチュートリアルでは、プラグインに管理インターフェースを追加する方法を紹介します。私のプラグインは お気に入りのコンピュータゲームの一つにちなんで「purple-tentacle」と呼ぶことにします。本当に、そのゲームが大好きです!
管理ルートの設定
まず、チュートリアルの前のパートで行ったように plugin.rb を追加しましょう。
plugin.rb
# name: purple-tentacle
# about: A sample plugin showing how to add a plugin route
# version: 0.1
# authors: Robin Ward
# url: https://github.com/discourse/purple-tentacle
add_admin_route 'purple_tentacle.title', 'purple-tentacle'
Discourse::Application.routes.append do
get '/admin/plugins/purple-tentacle' => 'admin/plugins#index', constraints: StaffConstraint.new
end
add_admin_route の行は、このプラグインが /admin/plugins ページにリンクを必要とすることを Discourse に伝えます。そのタイトルは i18n 翻訳ファイルの purple_tentacle.title から取得され、purple-tentacle ルートにリンクします。
その下の行は、プラグインのサーバー側のルートマッピングを設定します。Discourse が仮定していることの1つは、フロントエンドのほぼすべてのルートに、データを提供するサーバー側のルートが存在することです。このサンプルプラグインの場合、実際にはバックエンドからデータは必要ありませんが、ユーザーが直接 /admin/plugins/purple-tentacle にアクセスした場合に何かを返すように Discourse に指示する必要があります。この行は、「もしユーザーがサーバー側でその URL に直接アクセスしたら、デフォルトのプラグインコンテンツを返してね」という意味です。
(もしこれが混乱を招くようであれば、心配しすぎないでください。サーバー側のアクションを処理する将来のチュートリアルで再び取り上げます。)
次に、ユーザーが /admin/plugins/purple-tentacle パスにアクセスしたときに表示されるテンプレートを追加します。これは、ユーザーがボタンをクリックすると紫色の触手のアニメーション GIF を表示するボタンだけのものです。
assets/javascripts/discourse/templates/admin/plugins-purple-tentacle.gjs
import DButton from "discourse/components/d-button";
<template>
{{#if @controller.tentacleVisible}}
<div class="tentacle">
<img src="https://eviltrout.com/images/tentacle.gif" />
</div>
{{/if}}
<div class="buttons">
<DButton
@label="purple_tentacle.show"
@action={{@controller.showTentacle}}
@icon="eye"
@id="show-tentacle"
/>
</div>
</template>
Handlebars の基礎を学んでいれば、テンプレートは理解しやすいはずです。<DButton /> は、ラベルとアイコン付きのボタンを表示するために Discourse で使用しているコンポーネントです。
新しいテンプレートを接続するために、ルートをマップする必要があります。
assets/javascripts/discourse/purple-tentacle-route-map.js
export default {
resource: "admin.adminPlugins",
path: "/plugins",
map() {
this.route("purple-tentacle");
},
};
ルートマップは、プラグインが Ember アプリケーションにルートを追加できるようにするために Discourse に追加したものです。map() 内の構文は Ember のルーター と非常に似ています。この場合、ルートマップは非常にシンプルで、/admin/plugins の下に purple-tentacle という名前の1つのルートだけを宣言しています。
最後に、翻訳文字列を追加しましょう。
config/locales/client.en.yml
en:
js:
purple_tentacle:
title: "Purple Tentacle"
show: "Show Purple Tentacle"
開発サーバーを再起動すると、/admin/plugins にアクセスできるようになり、リンクが表示されます!クリックすると、紫色の触手を表示するボタンが見えます。
残念ながら、ボタンをクリックしても何も起こりません ![]()
開発者コンソールを見ると、これがなぜ起こるのかを示すエラーが表示されるはずです。
Uncaught Error: Nothing handled the action 'showTentacle'
ああ、そうです。理由はテンプレートでいくつかのことに依存していることです。
- ユーザーがボタンをクリックしたとき、コントローラーで
showTentacleが呼び出されること。 showTentacleがプロパティtentacleVisibleをtrueに設定して、画像が表示されること。
Ember ガイドのコントローラー をまだ読んでいない場合は、今読むのが良いタイミングです。なぜなら、このロジックを処理する purple-tentacle テンプレートのコントローラーを実装するからです。
次のファイルを作成します。
assets/javascripts/discourse/controllers/admin-plugins-purple-tentacle.js
import Controller from "@ember/controller";
import { action } from "@ember/object";
import { tracked } from "@glimmer/tracking";
export default class AdminPluginsPurpleTentacleController extends Controller {
@tracked tentacleVisible = false;
@action
showTentacle() {
this.tentacleVisible = true;
}
}
```\n
そして、ページを更新すると、ボタンをクリックするとアニメーションキャラクターが表示されます!
<img src="upload://lU2ABNcxtZDW5bxcGcHSON8c89N.png" width="647" height="462">
触手を隠すボタンを追加するのは読者のための追加課題としておきます :smile:
このプラグインのバージョンが動作しない場合は、[github](https://github.com/eviltrout/purple-tentacle) にプッシュしました。
---
### シリーズの続き
パート1: [プラグインの基本](https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins-part-1/30515)
パート2: [プラグインアウトレット](https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins-part-2-plugin-outlets/31001)
パート3: [サイト設定](https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins-part-3-custom-settings/31115)
パート4: [git の設定](https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins-part-4-git-setup/31272)
**パート5: このトピック**
パート6: [受け入れテスト](https://meta.discourse.org/t/beginner-s-guide-to-creating-discourse-plugins-part-6-acceptance-tests/32619)
パート7: [プラグインの公開](https://meta.discourse.org/t/beginner-s-guide-to-creating-discourse-plugins-part-7-publish-your-plugin/101636)
---
<small>このドキュメントはバージョン管理されています。変更を提案するには [github](https://github.com/discourse/discourse/blob/main/docs/developer-guides/docs/04-plugins/05-admin-interface.md) をご覧ください。</small>





