LoginSignup
2
0

More than 5 years have passed since last update.

MTのダッシュボードウィジェットの並び順が変

Posted at

Movable Typeではウェブサイトやブログのダッシュボードに表示するウィジェットの種類をプラグインで増やすことができます。そうやって増やしたウィジェットをダッシュボードに複数個追加すると、追加順でもない名前順でもない何ともいえない順番で表示されます。このよく分らない挙動は何とかならないのだろうかと調べてみたところ、どうやらバグのようです。

ダッシュボードウィジェットの並び順を決めている処理は、lib/MT/App.pmのupdate_widget_prefsメソッドの中1にあります。

lib/MT/App.pm
            # 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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0