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