過去に
色々と
MovableTypeの
プラグインを作ってきた経験から、
その知識を記事として整理しておくのは良いことかも知れません。
独学+トライ&エラーで得られたモノばかりで、かなりアレゲ(?)な内容ですが、
これから
プラグインを作ってみよう!という方の一助になれば幸いです。
できるだけサンプルコードを多用して説明するよう心がけていますが、
筆者がひっじょーに説明下手な上に、勘違いをそのままに暴走する人なので、
チンプンカンプンだったらゴメンなさい orz
目次
一度では全て書き切れないので、幾つかの連載記事とする予定です。
MovableType のヘルプドキュメント
にある内容を網羅し、これに沿った形で書いていくつもりですので、併せて読み進めていただけるとモア・ベターかと思います。
よろしくお付き合いくださいませm(_ _)m
ほとんどの
プラグインは
MT::Plugin クラスを利用して作ります。
MT 本体との間にある小難しい取り決めは
MT::Plugin クラスが賄ってくれるので、
開発者は
プラグインの実装に専念することができます。
以下の内容で
myplugin_1_1.pl というファイルを作り、
MT の
plugins フォルダにコピーするだけです。
MT の管理画面から[
プラグイン]と辿ることで、作った
プラグインを確認することができます。
ちなみに今の段階では、この
プラグインは一覧に表示されているだけで、実際には何の機能も持っていません。
コードの詳細
- package MT::plugin::myplugin_1_1;
-
以下に続くプログラムコードが、他の様々なプログラムコードと衝突しないよう、
名前空間を定義します。
…上手い説明ぷりーず。
- use base qw( MT::Plugin );
-
これから MT::Plugin クラスを
継承
したサブクラスを作ることの宣言です。
このプラグインの中で口出しする部分(独自の機能定義)はあるけれど、
それ以外の何も言わないところは、MT::Plugin 側で何とかしてね♪と言うこと。
- $plugin = new MT::Plugin
-
MT プラグインの入れ物を作ります。
この段階では、入れ物しか無いので、その名前も、何をするためのプラグインかさえも定義されていない状態です。
以下に続く。
- name
-
このプラグインの名前を定義します。
下の図の"My First Plugin"と書かれた部分で、あなたのセンスが問われる大事な部分です(大きなお世話)
- version (3.2以降)
-
このプラグインのバージョン番号を定義します。
下の図では"1.00"と書かれた部分(前の"バージョン"は含まれない)で、
機能追加やバグ修正を行った場合は忘れずに変更しておくと、後々、幸せになれます。
- doc_link
-
このプラグインのドキュメントへのリンク URLを定義します。
相対パスと絶対パスの何れかを指定できます。
相対パス指定の場合は、myplugin_1_1.pl のあるディレクトリが基準になります。
- author_name (3.2以降)
-
このプラグインの作者の名前を定義します。
下の図で"Piroli YUKARINOMIYA"と書かれた部分で、あなたの名前か、所属する組織名が入るでしょう。
- author_link (3.2以降)
-
上の author_name のリンク URL を定義します。
個人や組織のウェブサイトに誘導するのに役立ちます。
- plugin_link (3.2以降)
-
このプラグインのホームへのリンク URL を定義します。
プラグイン専用のウェブページがある場合、そこへ誘導するのに役立ちます。
- description
-
下の図では"description"部分のように、このプラグインの簡単な説明文を記述できます。
ここでは概要説明程度に留め、doc_link や plugin_link を利用して
詳細な解説ページに誘導するのが好ましいかと思います。
- MT->add_plugin ($plugin);
-
上で定義した内容のプラグインを、MT のプラグインとして追加するための処理です。
実は無くても動く場合があります。
が、プラグイン一覧に表示されなくなるので、ちょっぴり損した気分です。
- 1;
-
Perl のおまじないです(笑 プラグインの最終行に忘れずに書いておきます。
プログラムの他の部分が全て正しくても、この 1 行がないと動作しません。
変数タグの基礎
変数タグは
<MTDate> や
<MTBlogName> のように、
その
テンプレートタグが何らかの値や文字列に置き換えられるものです。
<MTCalendarDay> などのように、
特定のコンテナタグ内部でしか使われない変数タグがありますが、
これは次回以降、コンテナタグの説明の回に任せます。
ここでは簡単な例として、再構築の度に 1 から 6 の任意の整数に置き換えられて、
サイコロの様に振舞う変数タグ<MTDice>を作ってみます。
先ほどと同様に、以下の内容で myplugin_1_2.pl というファイルを作り、
MT の plugins フォルダにコピーしてください。
そして、適当なテンプレート中に <$MTDice$> タグを追加し、そのテンプレートを再構築してみます。
再構築されたファイルをブラウザで開くと、テンプレートタグを埋め込んだ場所に、1 から 6 の任意の整数が表示されるはずです。
コードの詳細
新しく追加された部分について説明をします。それ以外の部分は前章と同じです。
- use MT::Template::Context;
-
テンプレートのコンテクストに関するクラスを使用することを宣言します。
ぶっちゃけ、おまじないです(ぉぃ
- MT::Template::Context->add_tag (Dice => sub { int (rand 6) + 1 });
-
テンプレートのコンテクストに新しい変数タグを追加します。
変数タグの名前は「MTDice」で、
その処理内容は「0 以上 6 未満の乱数(rand 6)の整数部分(int)に 1 を足す」と云うことです。
これは 1 から 6 の整数を返すだけの簡単な処理でしたが、もっと複雑な処理を行う場合など、
これではプログラムがぐちゃぐちゃになってしまうことがあります。
そこで以下のように、処理部分を別に
サブルーチン
として定義しておき、これを用いるよう指定することができます(
myplugin_1_2a.pl)。
将来の機能拡張を考えて、最初からこの様式で書いておくと便利です。
変数タグの引数
<MTDice>タグはサイコロを一つだけ振ることができましたが、
サイコロを二つ三つ…と振れるように改造してみましょう。サイコロの数は
のように指定できるようにします。それが以下のプログラムコードです(myplugin_1_3.pl)。
そして先ほどのテンプレート中の <MTDice> タグに
num="3"を追記して、そのテンプレートを再構築してみます。
再構築されたファイルをブラウザで開くと、テンプレートタグを埋め込んだ場所に、"5-3-6"などの数字がランダムに表示されるはずです。
コードの詳細
新しく追加された部分について説明をします。それ以外の部分は前章と同じです。
- my ($ctx, $args) = @_;
-
現在のコンテクストと引数のハッシュ参照を取得します。これもぶっちゃけ、おまじないで。
- my $num = $args->{num} || 1;
-
変数タグに与えられた引数にアクセスするには、この $args を使用します【←ここ重要】
この例では変数タグの num="..." で指定された値を取得して $num に代入します。
num が指定されていなかった時は 1 が代入されます。
- my @eye = ();
-
サイコロの出目を記憶するための空の配列を用意しています。
- while ($num--) { push @eye, int (rand 6) + 1; }
-
$num 回だけサイコロを振り、その出目を @eye に覚えておきます。
- join '-', @eye;
-
@eye に覚えておいたサイコロの出目をハイフン(-)で区切って返します。
ブログデータを扱う変数タグ
ここまで変数タグの説明として、
ブログとは関係のない動作を行うものばかりでしたが、
エントリやコメントなど、
ブログの様々なデータを扱うことも勿論可能です(むしろこちらが本命)。
ブログのデータは、
$ctx という変数に格納されているので、
これを使用してデータにアクセスすることになります。
例えば、MT の標準
テンプレートタグである
<$MTBlogName$> と同じ動作をする
<$MTMyBlogName$>変数タグのプログラムは次のようになります。
コードの詳細
新しく追加された部分について説明をします。それ以外の部分は前章と同じです。
- my $blog = $ctx->stash('blog');
-
現在のコンテクストが含まれるブログへの参照を取得します。
stash は、おまじないで(これ多いな)
- $blog->name;
-
現在のブログの名前を取得します。
$ctx から、どのようなデータにアクセスできるのか、その一覧を見るには、
このプラグインで定義された<MTListContext>変数タグを使ってみてください。
$ctx の中身をずらずらっとダンプしてくれるので(dump_context.txt)、
どのようなデータが含まれているか調べることができます。
これを見ると、ブログの設定やエントリの投稿日など、殆んど全ての情報を扱うことができるとわかるでしょう。
これらのデータを如何に扱うか、そこは貴方の考え次第です。
この記事で使用した
プラグインのプログラムコードを
ダウンロードできます。
寄せられたコメント (最新 5 件を表示しています)
こんにちわ^^
わたしもプラグインを作ってみたいと思って徘徊していたらこちらに行き着きました。
とっても分かりやすい説明です。
変数タグをトップページとエントリページで表示させてみたところ、内容が異なるんですね。
MT のタグによっては、コンテナタグを使用しないとエラーする意味が分かりました!!
第2回〜も読ませていただきます。