Under the Bridge

a Picture of the Late Him

管理画面を拡張する(メニューとメソッド追加)

2008年5月11日 16:24 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

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

トラックバック(0)

このブログ記事を参照しているブログ一覧: 管理画面を拡張する(メニューとメソッド追加)

このブログ記事に対するトラックバックURL:

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008 yoshi(apstar)