Japanese plugin dev 4 3
Anonymous edited this page Apr 7, 2011
·
18 revisions
MT利用していると「管理画面のここを変更したい」「管理画面の使わない箇所を削除してしまいたい」などの欲求が出てくると思います。
そこで今回はTransformerプラグインによる管理画面の表示内容変更について解説します。
Transformerプラグインは名前のとおり「実際の管理画面をトランスフォーム(変身)させることで表示を変更する」ものです。
Transformer用のフックポイントがあるので、コールバックを使って管理画面を変更させます。
- ブログ記事、ウェブページともエディット画面で「続き」ボタンを消す
- 「お客様から自分が必要無いな機能を外してほしい」と言われたと仮定
-
ID=keywords
の次にURLを記入できる欄を追加する- URL欄が空白の場合は"http://www.example.com/"を入力する
- URL欄は表示だけで、保存、修正などできなくてよい(あくまで表示例)
id: MyPlugin13 key: MyPlugin13 name: <__trans phrase="Sample Plugin Transformer"> version: 1.0 description: <__trans phrase="_PLUGIN_DESCRIPTION"> author_name: <__trans phrase="_PLUGIN_AUTHOR"> author_link: http://www.example.com/about/ doc_link: http://www.example.com/docs/ l10n_class: MyPlugin13::L10N callbacks: MT::App::CMS::template_source.edit_entry: $MyPlugin13::MyPlugin13::Transformer::hdlr_template_source_edit_entry MT::App::CMS::template_output.edit_entry: $MyPlugin13::MyPlugin13::Transformer::hdlr_template_output_edit_entry MT::App::CMS::template_param.edit_entry: $MyPlugin13::MyPlugin13::Transformer::hdlr_template_param_edit_entry
config.yamlで注目するのはcallbacks以下の3行です。
- MT::App::CMS::template_source.(テンプレート名): $(プラグイン名)::(Perlモジュール名)::(ハンドラ関数)
-
template_source
は処理前のテンプレートを変更するためフックポイントです。 - テンプレートは
$MT_DIR/tmpl/cms
の中にあり、設定系はconf_xxx.tmpl
、 一覧系はlist_xxx.tmpl
、新規・修正系はedit_xxx.tmpl
のようになっています。今回はブログ記事(entry)の修正なのでedit_entry.tmpl
となりますが、拡張子を取った物(edit_entry
)がテンプレート名になります。
-
- MT::App::CMS::template_output.(テンプレート名): $(プラグイン名)::(Perlモジュール名)::(ハンドラ関数)
-
template_output
は処理前のテンプレートを変更するためフックポイントです。 - テンプレート名は 。上記と同じ理由で
edit_entry
となります。
-
- MT::App::CMS::template_param.(テンプレート名): $(プラグイン名)::(Perlモジュール名)::(ハンドラ関数)
-
template_param
は値を代入したり、DOMベースでの文字列の挿入などを行うフックポイントです。 - テンプレート名は 。上記と同じ理由で
edit_entry
となります。
-
package MyPlugin13::Transformer; use strict; sub hdlr_template_source_edit_entry { my ($cb, $app, $tmpl_ref) = @_; my $old = <<EOF; <div class="tab" mt:command="set-editor-extended" mt:tab="extended"> <label><a href="javascript:void(0);"><__trans phrase="Extended"></a></label> </div> EOF $old = quotemeta($old); my $new = ""; $$tmpl_ref =~ s!$old!$new!; } sub hdlr_template_output_edit_entry { my ($cb, $app, $tmpl_str_ref, $param, $tmpl) = @_; # do something } sub hdlr_template_param_edit_entry { my ($cb, $app, $param, $tmpl) = @_; my $host_node = $tmpl->getElementById('keywords'); my $innerHTML = '<input type="text" name="url_field" id="url_field" class="full-width" mt:watch-change="1" value="<mt:var name="url_field" escape="html">" autocomplete="off" />'; my $block_node = $tmpl->createElement( 'app:setting', { id => 'url_field', label => 'URL', label_class => 'top-label', } ); $block_node->innerHTML( $innerHTML ); $tmpl->insertAfter($block_node, $host_node); $param->{url_field} = "http://www.example.com/" if !$param->{url_field}; } 1;
package MyPlugin13::Transformer; use strict;
- パッケージモジュール名を指定し
use strict
します。
sub hdlr_template_source_edit_entry { my ($cb, $app, $tmpl_ref) = @_; my $old = <<EOF; <div class="tab" mt:command="set-editor-extended" mt:tab="extended"> <label><a href="javascript:void(0);"><__trans phrase="Extended"></a></label> </div> EOF $old = quotemeta($old); my $new = ""; $$tmpl_ref =~ s!$old!$new!; }
-
$cb
コールバック、app
アプリケーション情報、tmp_ref
テンプレートのリファレンスです。 -
$old
に修正したい文字列を代入します。今回は削除したい箇所(続きタブ)になります。 - 後で利用する置換の文字列に’(‘, ’)’が入っているため、
quotemeta()
に通します。 - 今回削除なので置換する文字列(
$new
)は空文字です。 - テンプレートのリファレンスからテンプレートを引出し(
$$tmpl_ref
)、置換を行います。 - これを行うことで「本文」タブの横の「続き」タブが消えます。
sub hdlr_template_output_edit_entry { my ($cb, $app, $tmpl_str_ref, $param, $tmpl) = @_; # do something }
- この関数も
template_source
と同じくテンプレートの修正をしますが、template_source
が手を入れる前のテンプレートに大して行うのと違い、テンプレートの構築処理が終わった後の出力($tmpl_str_ref
)に大して修正を行います。 - それ以外の説明は
template_source
と同じなので省略します。
sub hdlr_template_param_edit_entry { my ($cb, $app, $param, $tmpl) = @_; my $host_node = $tmpl->getElementById('keywords'); my $innerHTML = '<input type="text" name="url_field" id="url_field" class="full-width" mt:watch-change="1" value="<mt:var name="url_field" escape="html">" autocomplete="off" />'; my $block_node = $tmpl->createElement( 'app:setting', { id => 'url_field', label => 'URL', label_class => 'top-label', } ); $block_node->innerHTML( $innerHTML ); $tmpl->insertAfter($block_node, $host_node); $param->{url_field} = "http://www.example.com/" if !$param->{url_field}; }
-
$cb
コールバック、app
アプリケーション情報、param
テンプレートの構築時に渡されるパラメータ、tmpl
テンプレートオブジェクトです。 -
getElementById
を使ってDOMの’keywords’のノードを検索します。 -
$innerHTML
に、挿入したい文字列をセットします。 -
createElement
を使って新規のノードをセットします。 - 新規ノードに
$innerHTML
をセットします。 -
insertAfter($block_node, $host_node)
を使って$host_node
の後に$block_node
を挿入します。
*最後の$param
はDOMの説明とは関係ありませんがtemplate_param
の本来の使い方で、構築時のパラメータとして任意のものを渡す事ができます。- 例えば今回の場合、新規に追加した行に
<mt:var name="url_field">
がありますので、そちらに値(http://www.example.com/)が設定されます。 - 条件としては
$param->{url_field}
に値がセットされてい無い場合に値(http://www.example.com/)がセットされるように実装されています。 - このURLについてはブログ記事クラスの拡張や、URLクラスを作成してブログ記事の
post_save
で保存するなど実装方法が色々と考えられますが、今回は省略します。
- 例えば今回の場合、新規に追加した行に
$MT_DIR/ |__ plugins/ |__ MyPlugin13/ |__ config.yaml |__ lib/ |_ MyPlugin13/ |__ L10N.pm |_ L10N/ | |_ en_us.pm | |_ ja.pm |__ Transformer.pm
とっかかりは難しそうですが、管理画面で困っている場合は今回解説した管理画面の修正をしてみてはいかがでしょうか?
ただしTransformerプラグインは、MTのバージョンにより置換文字列などを修正する必要など出てくる場合がありますのでご注意ください。