Movable Typeではウェブサイトやブログのダッシュボードに表示するウィジェットの種類をプラグインで増やすことができます。そうやって増やしたウィジェットをダッシュボードに複数個追加すると、追加順でもない名前順でもない何ともいえない順番で表示されます。このよく分らない挙動は何とかならないのだろうかと調べてみたところ、どうやらバグのようです。
ダッシュボードウィジェットの並び順を決めている処理は、lib/MT/App.pmのupdate_widget_prefs
メソッドの中1にあります。
# Renumbering widget order
my $widget_count = keys %$these_widgets;
foreach my $widget_id ( keys %$these_widgets ) {
if ( my $widget = $all_widgets->{$widget_id} ) {
my @widget_scopes = split ':', $widget_scope;
my $order = $widget->{order};
$order
= $order && ref $order eq 'HASH'
? $widget->{order}{ $widget_scopes[1] }
: $order * 100;
if ($order) {
$these_widgets->{$widget_id} = { order => $order };
}
else {
$these_widgets->{$widget_id}
= { order => $widget_count++ * 100 };
}
}
}
ややこしいのですが、$all_widgets
が全ウィジェットの定義の配列、$these_widgets
がダッシュボードに追加されたウィジェットの設定のハッシュです。公式のドキュメントには記述はありませんが、実はダッシュボードの定義の方で表示順序を指定できるようになっています。この処理では、定義の方で表示順が指定されていればそれを使い、無ければ先頭から順に100刻みの連番を振っています。つまり処理としては定義で表示順序が指定されていないものは追加順で表示するということを意図しているのだと思われますが、実際はそうなっていません。
なぜダメなのか。それはこのループがハッシュのキーに対するものだからです。
foreach my $widget_id ( keys %$these_widgets ) {
Perlのハッシュのキーの順序は不定なので、このループはウィジェットの追加順とは異なる可能性があります。ウィジェットの追加や削除をするとハッシュのキーの順序に並べなおされてしまうので、何ともいえない順序になってしまうというわけです。
何ともいえない順序はイヤという場合は、ウィジェットの定義に以下のような記述を追加して表示順序を固定します。
order:
blog: 1100