ダッシュボードの表示・非表示設定は何処に入っているのか?ステータス切り替えアクションを追ってみた。
MT::App::update_widget_prefs
を見ると、
$user->widgets
であることがわかった。MT::Author
のwidgets
は
'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;
}