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

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

MovableTypeのダッシュボードウィジェットをプラグインから強制的に表示したり非表示にしたりする

ダッシュボードの表示・非表示設定は何処に入っているのか?ステータス切り替えアクションを追ってみた。

MT::App::update_widget_prefs を見ると、

$user->widgets

であることがわかった。MT::Authorwidgets

'widgets'                  => 'hash meta',

のように定義されている。

内容は以下のような感じで、スコープ(ブログ・システム・ユーザーダッシュボード)と、ウィジェットのkeyと表示位置などのパラメータのようだ。

{
    'dashboard:blog:1' => {
        'recent_blogs' => { 'order' => '200', 'set' => 'main' },
        'site_stats' => { 'order' => '100', 'set' => 'main' }
    }, 
    'dashboard:system' => {
        'recent_websites' => { 'order' => '100', 'set' => 'main' }
    },
    'dashboard:user:1' => {
        'blog_tree' => { 'order' => '200', 'set' => 'main' },
        'favorite_blogs' => { 'order' => '300', 'param' => { '.r' => '0.7754278612873629', 'tab' => 'website' }, 'set' => 'main' },
        'mt_news' => { 'order' => '500', 'set' => 'sidebar' },
        'notification_dashboard' => { 'order' => '100', 'set' => 'main' },
        'personal_stats' => { 'order' => '300', 'set' => 'sidebar' },
        'welcome_to_loupe' => { 'order' => '150', 'set' => 'main' }
    }
} 

従って以下のように書き換えることで表示・非表示を設定することができた。

# アクセスの度に強制的に表示・非表示を切り替えるサンプル
sub _cb_pre_run {
    my $app = MT->instance;
    my $user = $app->user;
    return 1 unless $user;
    my $widgets = $user->widgets;
    my $widget_scope  = "dashboard:user:@{[ $user->id ]}";
    my $widgets       = $user->widgets || {};
    my $these_widgets = $widgets->{$widget_scope} ||= {};
    if ( exists $these_widgets->{sample} ) {
        delete $these_widgets->{sample};
    } else {
        $these_widgets->{sample} = {order => '0'};
    }
    $user->widgets($widgets);
    $user->save;
    1;
}