Movable Type3.3と4.0の両方に対応したTransformerプラグインの書き方。

| コメント(10) | トラックバック(0)

各所で話題の? Transformerプラグインが4.0で動作しない! 件 (あんまり話題になってないのか?) ですが, 両対応するプラグインをひとつ書いてみました。プラグインの書き方や改造のヒントになれば。

関連エントリー

Transformerプラグイン開発関連ページ

今回改造したプラグインはエントリーの編集画面のプレビューにテンプレートタグやCSSを反映させるStylePreviewプラグイン

プラグインのダウンロード

え? そもそも4.0でデフォルトでちゃんとプレビューできるって?

そうかい, そんなこと言うなら, じゃぁ、書かねぇよ!というのは冗談で。

4.0ではエントリー編集画面で「Preview」ボタンをクリックすると, 表示された画面にiframeが入っていてフレーソ内に再構築された一時ファイル(716e33a47fa625eea57c6c428664685d923cf5ca.html みたいな名前で生成される)が入るようになっています。画面を遷移するとちゃんと一時ファイルは消えますが、プレビュー画面でブラウザウィンドウを閉じると一時ファイル(つまりゴミ、というか意図しない途中段階のファイル)が残ってしまうので注意が必要です。もちろんベータバージョンなのでリリースまでに改良される可能性はあります。

このプラグインは「一時ファイルを生成せずに」CSSやテンプレートタグが適用された状態でのプレビュー画面を表示させるものです。いずれにしても4.0になったら需要は殆どないと思いますが、今回はTransformerプラグインを両バージョンに対応させる例ということで。

MT4.0でのTransformerプラグイン

やっと本題。

以前にも書きましたが、MT4.0ではTransformerプラグインのためのコールバック名称が変わっています。

AppTemplateSource => template_source (テンプレートのソースに対する処理)
AppTemplateParam => template_param (テンプレートに渡されるパラメタに対する処理)
AppTemplateOutput => template_output (テンプレートエンジンの出力結果に対する処理)

lib/MT/Compat/v3.pm に以下の記述があるように、「大切でない(コールバックのエイリアス)マッピング(何故ならv3のレガシーなコールバック達はおそらくうまく動かないだろうから」ということのようです。コメントアウトで「一応」書いてはあるので最終リリース時にどうなるかはわかりませんが。

    # Unnecessary to map since all the v3 legacy callbacks would fail
    # anyway.
    # $MT::CallbackAlias{'AppTemplateSource'}   = 'template_source';
    # $MT::CallbackAlias{'AppTemplateParam'}    = 'template_param';
    # $MT::CallbackAlias{'AppTemplateOutput'}   = 'template_output';

まずはバージョンを取得して変数に入れておきます (プラグインの先頭付近に書くと分かりやすいかと思います) 。

my $mt_version;
my $v = MT->version_id; 
#->4.0 Beta 1 
if ($v =~ /^4/) { 
	$mt_version = 40;
} elsif ($v =~ /^3¥.3/) {
	$mt_version = 33;
} else {
	$mt_version = 32;
}

TransformerプラグインはMT3.3からの機能ですから, 4系であれば「40」3.3系であれば「33」それ以外であればここでは仮に「32」とします。「32」の場合は BigPAPI が使えるので, できるだけ多くのバージョンに対応させるのであればこの3種類を分岐させて処理を書けば良いでしょう。

バージョンを取得したら, バージョン毎に MT->add_callback を分岐させます。

if ($mt_version == 40) {
	MT->add_callback('MT::App::CMS::template_output.preview_strip',9 ,$plugin, ¥&_StylePreview);
} elsif ($mt_version == 33) {
	MT->add_callback('MT::App::CMS::AppTemplateOutput.preview_entry',9 ,$plugin, ¥&_StylePreview);
	MT->add_callback('MT::App::CMS::AppTemplateSource.preview_entry',9 ,$plugin, ¥&_PreviewTmpl);
} elsif ($mt_version == 32) {
	# BigPAPI用のコールバックを書くのであればここに
}

あとはバージョン毎のテンプレートやメソッドの変更等に応じて適宜コードを分岐させます。

今回はさほど変更点は多くありませんでした。テンプレートの部分以外では一カ所のみ (4.0では $app->translate_templatized($template->output); としないとページを生成できませんでした)。

	if ($mt_version == 40) {
		$preview_tmpl = $app->translate_templatized($template->output);
	} else {
		$preview_tmpl = $template->text;
	}

個人的に思うことですが、Transformerプラグインの場合, テンプレートを正規表現等で置換していって管理画面をバリバリ・バキバキとカスタマイズしていく場合がこれまで多かったように思うのですが(自分もそうしていました)、このやり方にはインストールが簡単である(プラグイン本体を設置すればそれだけでOK)というメリットがある反面、今回のようなメジャーバージョンアップでCMSのテンプレートが大きく変わった時には何とも大変な修正を強いられることになります。

メンテナンス性のことを考えれば、今後はできるだけテンプレートのカスタマイズは「alt-tmpl」で行って(tmplフォルダ内のCMSのテンプレートをalt-tmpl以下にコピーしてそちらに手を入れるようにする), 動的な処理のみをプラグインにようにした方が良いと思います。

...って、書き終わったらベータ3が出てるやんけ!

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/317

コメント(10)

MT4のテンプレート編集画面の右サイドバーには、MTIncludeされているモジュールを一覧表示するセクションがあります。これがどのように実現されているか調べると、できるだけ正規表現を使わずにTransformerを書く方法の参考になるかもしれませんような気がしますむにゃむにゃ

Fumiaki Yoshimatsuさん、こんばんは。

この記事の件ですよね。

こちらにて「超訳」済み

ただ、僕の環境(B3)だと表示されないんですよねぇ。なんでだろ。

>MT4のテンプレート編集画面の右サイドバーには、MTIncludeされているモジュールを一覧表示するセクションがあります。

データベース初期化してやり直しましたけど、やっぱり駄目ですねぇ。
Macだから? FirefoxでもSafariでも出ませんね。

同一環境でB1,B2だと表示されましたね(なんと献身的にテスティングしてるんでしょう!)。B3のバグ? ということで、次のフィードバックの時にまとめて出します(けどここに書いておいたら見てもらえるのかな?)。

うあ。失礼しました。リストがでないのは次のベータで直る予定です(もう修正してあります)。

で、そうですその記事に書いてあることです。リストが出ないのは、その機能がなくなったわけではなく、別のバグの影響です。

フィードバックはフォームから送っていただいたほうが、必ず対処できるので、助かります。休憩しているときや、家に帰ってからいろんなブログを見て回っているのですが、見落としたりスルーしたりすることが多いので。

>で、そうですその記事に書いてあることです。リストが出ないのは、その機能がなくなったわけではなく、別のバグの影響です。

そうでしたか。次はこの件を掘り下げてみようと思っていたのですが、まぁコード眺めてみます。

>フィードバックはフォームから送っていただいたほうが、必ず対処できるので、助かります。

了解です。

ケイスディバイドゥしするネセサリーないんじゃないかなあとスィンクしました。イグジスタンスしないフックにadd_callbackしてもサモンしれないわけですから。


オリジナルのコメント:

場合分けする必要ないんじゃないかなあと思いました。存在しないフックにadd_callbackしても呼び出されないわけですから。

あ、(o)ミスターオアミセスエントゥリー。

>イグジスタンスしないフックにadd_callbackしてもサモンしれないわけですから。

コールバックエイリアスのコメントゥアウトゥがゲットゥアウトゥオブプレイスしなければ...ですね↓。

# $MT::CallbackAlias{'AppTemplateSource'} = 'template_source';
# $MT::CallbackAlias{'AppTemplateParam'} = 'template_param';
# $MT::CallbackAlias{'AppTemplateOutput'} = 'template_output';

まだプリパレイションオンザウェイですが4.0betaに同梱のTextileプラグインとかシーするとフィルターとかタグのレジストゥレイションメソッドゥもチェインジになっているソートゥオブですね。

MT->add_plugin(__PACKAGE__->new({
name => "Textile",
...(略)
registry => {
text_filters => {

===
MT::Template::Context->add_tag

アップトゥーナウのウェイオブライティングでもムーブすることはムーブしますが、プラグインのターミナルスクリーンの「プラグインについて」がインディケイションされないとか。


オリジナルのコメント:

あ、(o)さん登場。

>存在しないフックにadd_callbackしても呼び出されないわけですから。

コールバックエイリアスのコメントアウトが外れなければ...ですね↓。

# $MT::CallbackAlias{'AppTemplateSource'} = 'template_source';
# $MT::CallbackAlias{'AppTemplateParam'} = 'template_param';
# $MT::CallbackAlias{'AppTemplateOutput'} = 'template_output';

まだ調べ途中ですが4.0betaに同梱のTextileプラグインとか見るとフィルターとかタグの登録方法も変更になっているみたいですね。

MT->add_plugin(__PACKAGE__->new({
name => "Textile",
...(略)
registry => {
text_filters => {

===
MT::Template::Context->add_tag

従来の書き方でも動くことは動きますが、プラグインの画面の「プラグインについて」が表示されないとか。

ああコールバック名のコンパティブル性がとられると二重レジストゥレイションされてしまうってことですね。本当はコールバックのヴァリディティー・インバリッドゥをインスペクションするメソッドゥがワンティドゥところですよね。

add_pluginのウェイオブライティングについてはJunnamaミスターオアミセスのコウドゥ片をシーするリミットゥ3.3でアディションされたメソッドゥだとスィンクします。3.2とのコンパティブル性がなくかつ3.3のライフスパンがショートゥしたすぎたので、みんなユースしてませんでした。私も下のプラグインでユースしたのがオンリーでした。

http://code.as-is.net/public/browser/DeleteAndRebuild/trunk/DeleteAndRebuild.pl


オリジナルのコメント:

ああコールバック名の互換性がとられると二重登録されてしまうってことですね。本当はコールバックの有効・無効を検査するメソッドが欲しいところですよね。

add_pluginの書き方についてはJunnamaさんのコード片を見る限り3.3で追加された方法だと思います。3.2との互換性がなくかつ3.3の寿命が短すぎたので、みんな使ってませんでした。私も下のプラグインで使ったのが唯一でした。

http://code.as-is.net/public/browser/DeleteAndRebuild/trunk/DeleteAndRebuild.pl

>add_pluginの書き方についてはJunnamaさんのコード片を見る限り3.3で追加された方法だと思います。

あちゃ! MT初心者なのがバレましたか。そう、初めて触ったのは40歳の時(<関係ない、ぁ、今日から41歳じゃねぇか)、3.3が最初なんですねぇ。

# ルー語変換がだんだん鬱陶しくなってきたので外そう...

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2007年6月20日 16:24に書いたブログ記事です。

ひとつ前のブログ記事は「ネットメディアはもう少し考えた方が良いのではないか?」です。

次のブログ記事は「だからMTのGPL版について少しは建設的な議論をしようぜ。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6