タイトル分かりにくいけど。
Movable Type には、管理画面をプラグインでカスタマイズする方法として Transfomer という仕組みが用意されています。
Transformer がなんなのかはこちらを読んでもらうといいと思いますが、簡単に言うと Movable Type の管理画面のテンプレートやその出力結果の HTML をゴニョゴニョして書き換えることが出来る仕組みなのです。
今回は、テンプレートにバインドされている変数を入れ替えて画面に表示される内容を書き換える方法の TIPS になります。
バインドされている変数を書き換える場合、template_param.テンプレートファイル名
というコールバックを使います。
config.yaml 的にはこう
applications:
cms:
callbacks:
template_param.edit_entry:$Test::Test::Callback::edit_entry_param
コールバックの実装側はこんな感じ
package Test::Callback;
use strict;
use warnings;
sub edit_entry_param {
my ( $cb, $app, $param, $tmpl ) = @_;
$param->{title} = Encode::decode_utf8("タイトルをいれてね");
}
1;
$param の title
とか text
の値がテンプレートの構築時に使われます。
<mt:var name="title">
のようにテンプレートの中で利用される変数の場合、このように値を直接指定したり、書き換えたりすることができますが、カスタムフィールドの値はこのパターンではうまくいきません。
カスタムフィールドは、値とテンプレートがビルドされた状態で Transfomer を使って管理画面に埋め込まれています。なので、2つほど手間を掛けてあげる必要があります。
まず、カスタムフィールドの値の元ネタを $param で提供することが出来ます。先ほどのコードを次のようにする指定された値が利用されます。
package Test::Callback;
use strict;
use warnings;
sub edit_entry_param {
my ( $cb, $app, $param, $tmpl ) = @_;
$param->{'field.test'} = 'hogehoge'; # 値を指定
$param->{'__fields_pre_loaded__'} = 1; # データのロードをさせない
$param->{title} = Encode::decode_utf8("タイトルをいれてね");
}
1;
field.カスタムフィールドのベースネーム
という変数に対して値を設定し、__fields_pre_loaded__
に 1
を指定することで既存のデータを編集するときにデータベースから読み込まないようにすることができます。
言い換えると、すべてのカスタムフィールドの値の読み込みを代替わりしてあげる必要があるともいえますが。
つぎに、こちらのプラグインの Transform を先に行わせないと カスタムフィールドの Transformer が走ったあとでは意味が無いので、コールバックの優先度を上げて上げる必要があります。
applications:
cms:
callbacks:
template_param.edit_entry:
handler: $Test::Test::Callback::edit_entry_param
priority: 3
このように、handler
に実装を指定し、priority
に 1 - 10 の値を指定してあげることでカスタムフィールドより先に処理させることが出来ます。priority は値が低いほど優先度が高くなり、priority の指定がない場合は 5
がデフォルトで利用されます。
カスタムフィールドの transformer には priority は指定されていないので、3とか4とかにしておけばいいと思います。
以上の手間をかけてあげるとカスタムフィールドの値も transformer で自由自在です。
(しかしめんどいね・・・なんとかしないとね・・・)