タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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など永続環境でうまく初期化されるように注意する必要があると思う。たぶん。)