3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Movable Type で記事の編集画面に表示されるカスタムフィールドの値を Transformer で入れ替える方法

Posted at

タイトル分かりにくいけど。

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 で自由自在です。

(しかしめんどいね・・・なんとかしないとね・・・)

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?