baserCMSのプラグイン作り(フック処理)を楽しんでみましょー。

やあどうも。ぼくです・ω・
baserCMS Advent Calendar 2012 の終盤にひょっこり参加で記事書いてますん。

昨日の @Kyo Hata さんの記事、面白かったですね。お役立ちですね!
デザイナーさんでも出来る! baserCMS のプレフィクス認証機能を使ったログイン画面の作り方|メルマガ配信、メール配信は1050円〜フラッグシステム

既に公開中の方々も記事も楽しいので見てみてくださいね。
未公開のものはwktkしつつ待ちましょう。

。。。というワケで、2012-12-22(土)の記事開始です。

baserCMSのプラグイン作りは楽しい

どんなところが楽しいかというと、ブログ記事に任意の入力欄を追加して使えるようにしたり、固定ページでも任意の入力欄を持たせて、自由に表示させたりできる点が楽しかったりします。

例えば、公開中の slugプラグイン では、ブログ記事の編集・追加画面に入力欄を追加してます。
また、ブログ記事のタグやカテゴリを表示する際に、その表示形式を変更できたりもします。

baserCMSには、テーマ内に置いて利用できるテーマヘルパの仕組みが備わっているのでそっちを利用しても良いのですが、そのプラグイン特有のヘルパを持たせて利用するようにすると、利用テーマに依存しないので便利だったりします。

プラグインとして作成しておく事の利便性

もちろん、こういった改造は baserCMS 本体に手を加えたら良いのですが、本体側がバージョンアップして更新された際には、その都度、改造した箇所をチェックしなくちゃならなくなります。

これはちょっと面倒ですよね。。。そこで、プラグインとして作成して本体と切り離しておく事で、baserCMS 本体のバージョンアップ時には、本体はそのまま更新を行なって、必要に応じてプラグインのメンテナンスを行えば済む。。。という事になります。

どうやってプラグイン側から本体側の表示や動作を変えてるの?

というワケで、具体的にどんな面白いことができるのかを見ていく事にします。
先ず、baserCMS には「プラグインフック」という仕組みが備わってます。
これは、例えば動作の流れを1(開始)から10(終了)とする際に、
1,2,3,4,5・・・ここで任意の処理を挟み込む・・・6,7,8,9,10
といったことをするような感じになります。

そして、この「任意の処理」が行える場所は決まっていて、例えば、表示を行う直前のタイミング、固定ページを追加するタイミング、ブログ記事を編集したタイミング・・・などが挙げられます。

動作例としてプラグイン作ってみました

言ってる事はわかるけど、じゃー具体的にどうするの?・ω・
。。。というワケで、解説用にプラグイン1つ作ってみました。
https://github.com/materializing/keyword
baserCMSキーワードプラグイン

これをもとに話を進めてみようと思います。

固定ページ編集画面にキーワード用の入力欄を追加する

/views/helpers/keyword_hook.php
ここでは、管理システムの固定ページ編集画面で、キーワードの入力欄を追加してます。

入力欄を追加する際には、任意のビューを表示させるようにすると良さそうです。
そして、ここではプラグインフックの1つである「afterFormInput」を使ってます。
この afterFormInput は、フォーム表示を行う際の入力欄を判別し、その任意の入力欄の後ろ側に処理を挟み込む事ができます。

とは言っても、表示するフォーム全てで行うワケにも行きませんし、その必要もないので、条件分岐を用いて「どのコントローラ」で「どのアクション」の時に行うのか、という指定を行なってます。
そして、「どのフィールドのあと」にというのを指定しているワケです。
そして、用意しておいたエレメント(ビューの部品)をここで挟み込んでます。
/views/elements/admin/keyword_form.php

これで、任意のパーツを組み込む事ができました。

キーワード入力欄に入力された内容を保存

/controllers/components/keyword_hook.php
次に、キーワード入力欄に入力された内容を保存する必要があります。
タイミングとしては、固定ページの追加・編集のタイミングなので、プラグインフックとして用意してある「afterPageAdd、afterPageEdit」を使ってみましょう。
さっきの afterFormInput とは異なり、既に「どのコントローラ、どのアクション」というところまで絞ってあるフックなので、これが便利そうです。

afterPage〜 では、引数として入ってくるものから色んなデータを取り出して扱う事ができます。
この中には、フォームから送信されたデータも入ってきます。
$controller->data の中に入ってるので、どんなデータが送られてきてるのかはこれを var_dump() する事で見る事ができます。

Model->save() 辺りの処理は通常の CakePHP と同じ扱いなので割愛しますね。
用意してるファイルは以下です。
/models/keyword.php

キーワード入力欄に保存した内容を取り出す

/controllers/components/keyword_hook.php
次に、キーワード入力欄に保存した内容を取り出せるようにする必要があります。
タイミングとしては、固定ページの編集画面・表示するとき、に当るので「beforeRender」を使ってみました。

beforeRender では、afterPage〜 と同様に引数として入ってくるものから色んなデータを取り出して扱う事ができます。
ここではどのアクションやどのコントローラで行うのかを指定してます。

固定ページ編集画面では、登録しているキーワードの情報を取得して送りつけてます。
$controller->data に入れ込む事で、ビュー側まで配達されていきます。

固定ページの表示の際にも、登録しているキーワードを取得して送る必要があります。
ちなみに既にバグを含んでいるのですが orz、とりあえずそこは目をつぶっておいて下さい。
ここでは、$controller->viewVars の中に任意のデータを差し込む事で、ビュー側まで届ける事ができます。

キーワード入力欄に保存した内容を削除する

/models/behaviors/keyword_hook.php
次に、保存されているキーワード情報を削除する場面を考えてみます。
ある固定ページを削除した際には、そこに紐付けているキーワード情報も削除して良さそうです。
タイミングとしては、固定ページの削除に当るので「afterDelete」を使ってみました。
HookBehavior では他のフック登録処理とはちょっと異なり、$registerHooks にはモデル名を指定する必要があります。

処理の中身自体は、通常の CakePHP と同様の処理になるので割愛しますね。
ここでは、afterDelete を使えば、任意のモデルの削除するタイミングで、自由な処理を行う事ができる、という事がわかって貰えたら嬉しいです。

ちなみにですが、別で作成中の slugプラグインでは、データを find する際の指定を書き換える処理を行なってます。
やってて面白かったのでついでの紹介しておきます。興味が湧いた方は見てみて下さい。
/models/behaviors/slug_hook.php

プラグインフックのご紹介

これ位で、任意のフィールドを用いたデータの利用ができるようになります。
ここでは、あくまでフックの紹介をしたかったので、キーワードのデータを保存しておく器(DBテーブル)を用意する内容については省略してます。
ちょっとやってみようかな?って方がいたら、下記を参考にしてみて下さい。
https://github.com/materializing/keyword/tree/master/config
※ プラグインのインストール時にDBにテーブルを作成してます。

そして、プラグインフックにはまだまだ色んな箇所があります。
下記に紹介しますので、これらがどんな箇所で使えるのかを押さえておくと、より楽しく任意の箇所で、任意の処理を挟み込む事ができるようになりますよ。
私もまだまだ研究しようと思ってます(`・ω・´)

■ Component:/baser/controllers/components/bc_plugin_hook.php
■ Behavior:/baser/models/behaviors/bc_plugin_hook.php
■ Helper:/baser/views/helpers/bc_plugin_hook.php

最後に。。。

駆け足感ありありでしたが、紹介したプラグインフック処理を使えば、「やりたいこと」ができそうな感じがしてきませんか?
ちょっとプラグイン作ってみたいんだけど、どの辺から手を付けて良いものやらわからん。。。という方に、プラグインフックを使ってみるきっかけになれば幸いです。
プラグインフックを利用すれば、できる事の幅が格段に広がります。
きっとプラグイン制作が楽しくなると思います。

これを読んで、ちょっとやってみよーかな?って方がいたら、ぜひぜひ挑戦してみて下さい。
そしてまた、稚拙ながらも公開している私のプラグインをフォークしてゴニョゴニョするなり、それを素材にしてプラグインを作るような方が出て来てくれたら、心の底から嬉しく思います!

それでは、次の 12/23(日)担当は @Sunao Kiyosue さんです。
宜しくお願いしまーす丶(・ω・)ノ

baserCMS Advent Calendar 2012

▲ to Top

トラックバック(0)

▲ to Top