タケユー・ウェブ日報

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

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;
}