元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

MovableTypeのダッシュボードウィジェットを動的に追加する

ダッシュボードウィジェットを追加するには、プラグインレジストリの以下ようなエントリを追加すれば良い。

applications:
    cms:
        widgets:
            sample:
                label: Sample Widget
                template: widget/sample.tmpl
                condition: |+
                    sub { 1 }
                handler: |+
                    sub {
                        my ( $app, $tmpl, $widget_param ) = @_;
                        $widget_param->{ myparam } = 1;
                    }
                singular: 1
                set: main
                view: user

カスタムフィールドなどのように、DBに登録されているデータなどをもとに動的にシステムに追加したいケース(限定されすぎですが・・・)には、次のような感じで動くようだ。

config.yaml

callbacks:
    MT::App::CMS::init_app: $samplewidget::SampleWidget::Plugin::_cb_init_app

SampleWidget/Plugin.pm

sub _cb_init_app {
    my $app = MT->app;
    my $plugin = MT->component( 'SampleWidget' );
    my $all_widgets = $plugin->registry("applications", "cms", "widgets");
    $all_widgets->{ dynamic_sample } = {
            label    => 'Sample Widget(Dynamic)',
            template => 'widget/sample.tmpl',
            condition => sub { 1 },
            handler => sub {
                my ( $app, $tmpl, $widget_param ) = @_;
                $widget_param->{ myparam } = 1;
            },
            singular => 1,
            set      => 'main',
            view     => 'user',
    };
}

単にレジストリに追加しているだけのことである。

ちなみに、init_appではまだ$app->userはセットされていないので、ユーザに基づいた処理を行いたい場合は、pre_runなどにする必要がありそう(ただしその場合PSGIなど永続環境でうまく初期化されるように注意する必要があると思う。たぶん。)