管理画面を拡張する(メニューとメソッド追加)
Movable Type プロフェッショナルスタイルの中で、Junnamaさんの執筆によるP296~P300までのサンプルコードを入力して、動作を確認した。覚え書き的に。
プラグインで拡張するファンクションタグを書くだけ、といったプラグイン書きより敷居が高い感じ。あくまでも自分用メモ。
コード
実はダウンロードができるようだが(URL失念)、コピペして動作確認するだけじゃ頭には入らんので、手で入力することにした。
まず、pluginsフォルダの下へ、CMSUIというフォルダを作り、その中へui.plなどというファイル名で以下のコードを保存する。
package MT::Plugin::UISample;
use strict;
use MT;
@MT::Plugin::UISample::ISA = qw(MT::Plugin);
my $plugin = new MT::Plugin::UISample({
description => 'User Interface Sample Plugin',
name => 'UISample',
version => 0.1,
});
MT->add_plugin($plugin);
sub init_registry{
my $plugin = shift;
$plugin->registry({
applications => {
cms => {
menus => {
'create:ui_sample_dialog' => {
label => 'My Dialog',
dialog => 'ui_sample_dialog',
order => 101,
permission => 'create_post',
},
'tools:ui_sample_page' => {
label => 'My Page',
dialog => 'ui_sample_page',
order => 201,
permission => 'create_post',
},
},
methods => {
ui_sample_dialog =>
'MT::Plugin::UISample::ui_sample_dialog',
ui_sample_page =>
'MT::Plugin::UISample::ui_sample_page',
},
},
},
});
}
sub ui_sample_dialog {
my $app = shift;
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
my $tmpl = 'dialog.tmpl';
my %param;
$param{'page_title'} = 'Dialog Sample';
return $app->build_page($tmpl, \%param);
}
sub ui_sample_page {
my $app = shift;
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
my $tmpl = 'page.tmpl';
my %param;
$param{'page_title'} = 'Page Sample';
$param{'page_msg'} = 'Page Message Show!';
return $app->build_page($tmpl, \%param);
}
1;
次に、CMSUIフォルダの下へtmplというフォルダを作成し、dialog.tmplとpage.tmplというファイルを作成し、以下コードを打ち込む。
dialog.tmpl
<mt:setvarblock name="page_title"><mt:var name="page_title"></mt:setvarblock>
<mt:include name="dialog/header.tmpl">
<form methos="get" action="<mt:var name="script_url">" target="_parent">
<div class="actions-bar">
<div class="actions-bar-inner pkg actions">
<button
type="submit"
accesskey="s"
title="<__trans phrase="Continue">"
class="promary-button"
><__trans phrase="Continue"></button>
<button
onclick="closeDialog(); return false"
type="submit"
accesskey="x"
title="<__trans phrase="Cancel">"
><__trans phrase="Cancel"></button>
</div>
</div>
</form>
<mt:include name="dialog/footer.tmpl">
page.tmpl
<mt:setvarblock name="page_title"><mt:var name="page_title"></mt:setvarblock>
<mt:include name="dialog/header.tmpl">
<mt:if name="page_msg">
<div id="saved-changes" class="msg msg-success"><a href="javascript:void(0)"
onclick="javascript:hide('saved-changes');return false;" class="close-me"><span>close</span></a>
<mt:var name="page_msg">
</div>
</mt:if>
<mt:include name="dialog/footer.tmpl">
このコードの機能
管理画面のメニューへ、ふたつの項目を追加する。
- 「新規作成」→「My Dialog」
- 「ツール」→「My Page」
ui.plプラグインのちょっとしたアレ
@MT::Plugin::UISample::ISA =qw(MT::Plugin)とあるが、packageが属する(継承する)クラスを指定する。この例ではMT::Plugin::UISampleがMT::Pluginから継承されたクラスであるということ。
まず、tmplフォルダ内のふたつの拡張子*.tmplファイルは、ダイアログ画面のテンプレートである。あとで説明する。
applications => { cms=> { menus ...で、メニューを追加する。
- label
- メニューのラベル
- dialog
- ダイアログモードを指定。選択時の参照先は...ん?ちょっとまて。
ここまで書きかけて、モード名称もメソッド名も関数名も同じ名前なので、少し混乱。
...自分で間違えそうなので、ソースを少し書き直した。機能は変わりない
書き直したui.plプラグインの要所
package MT::Plugin::UISample;
use strict;
use MT;
@MT::Plugin::UISample::ISA = qw(MT::Plugin);
my $plugin = new MT::Plugin::UISample({
description => 'User Interface Sample Plugin',
name => 'UISample',
version => 0.1,
});
MT->add_plugin($plugin);
sub init_registry{
my $plugin = shift;
$plugin->registry({
applications => {
cms => {
menus => {
'create:ui_sample_dialog' => {
label => 'My Dialog',
dialog => 'method_open_dialog',
order => 101,
permission => 'create_post',
},
'tools:ui_sample_page' => {
label => 'My Page',
dialog => 'method_open_page',
order => 201,
permission => 'create_post',
},
},
methods => {
method_open_dialog =>
'MT::Plugin::UISample::_open_dialog',
method_open_page =>
'MT::Plugin::UISample::_open_localpage',
},
},
},
});
}
sub _open_dialog {
my $app = shift;
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
my $tmpl = 'dialog.tmpl';
my %param;
$param{'page_title'} = 'Dialog Sample';
return $app->build_page($tmpl, \%param);
}
sub _open_localpage {
my $app = shift;
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
my $tmpl = 'page.tmpl';
my %param;
$param{'page_title'} = 'Page Sample';
$param{'page_msg'} = 'Page Message Show!';
return $app->build_page($tmpl, \%param);
}
1;
書き直したソースで続きを解説。
applications => { cms=> { menus ...で、メニューを追加する。
- label
- メニューのラベル
- dialog※1
- ダイアログモードを指定。クリック時の動作は、追加されるメソッド method_open_dialog と同じに。
- order
- 並び順
- permission
- 実行者の権限。これは\lib\MT\Upgrade.pmあたりが参考になると思われる。そこにはデフォルトのロールでの権限が列挙してある。例えば、エディタであれば['comment', 'create_post', 'publish_post', 'edit_all_posts', 'edit_categories', 'edit_tags', 'manage_pages', 'rebuild', 'upload', 'send_notifications', 'manage_feedback']である。
※1 これは、公式ページでは以下のような解説がある。
まずはmode
the app mode that will be invoked when you click the link. Note: this will require you to define and register an app mode with the same name as the value of this property.
要約:リンクをクリックするときに実行されるモード。そのモードと、相対する機能は同じ名前にしてね。
で、dialogはこう。
as an alternative to mode one can specify dialog which will spawn a dialog window that invokes the mode with the name assigned to the dialog property
要約:ダイアログだったらこっちでいいよ。
applications => { cms=> { methods ...で、メソッドを追加する。メソッドとは、いわゆる命令文である。
これは、「method_open_dialogというメソッドが要求されたら、_open_dialog関数を呼び出せ」となる。
ソース下部に_open_dialog関数がある。これが実行される。
なお、併記されているmethod_open_pageについても同様。
関数内では、*.tmplの場所を指定している。
$app->{plugin_template_path} = File::Spec->catdir($plugin->path,'tmpl');
build_pageについては、まだはっきりと理解していないので書けない。
また、各種tmplテンプレートへインクルードされるヘッダーとかフッターとかは\tmpl\cms\dialogから読み込まれる...と推測している。調べたわけではないが。
資料
MTソース CMS.pm、Upgrade.pmなど
本家英語サイト。
http://www.movabletype.org/documentation/developer/plugins/creating-menu-items.html- カテゴリ:215プラグイン関係
トラックバック(0)
このブログ記事を参照しているブログ一覧: 管理画面を拡張する(メニューとメソッド追加)
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- EXIF情報を取得するプラグインの進行状況
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.5)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.4)
- memo:perlでプラグイン Image::ExifとImage::Info
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.3)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.2)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(GPS Ready)
- MT4:エントリのURLをQRコードで自動生成する
- MT4.2:QRコード画像を生成するプラグイン(改)
- 嵌りメモ(perlのxampp環境でのファイル吐き出し実験)
- MT4.2:QRコード画像を生成するプラグイン
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(失敗)
- 管理画面を拡張する(メニューとメソッド追加)
- MT4.1:追加したファンクションタグのみへモデファイア追加
- MT4.1:エントリの既存DBへアクセスしてデータ取得
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)開発の話
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)配布
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(プラグイン設定編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(ブログ毎編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(カテゴリ編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(エントリ編)
- MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
- サンプルプラグインを手入力した(AddField)
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン
- サンプルプラグインを手入力した(RandomEntry)
- 最小単位のプラグインを生成するサンプル(ファンクション、ブロック、モデファイア、コールバック)
コメントする