BLOG

Go to top


Movable Type 6 のメッセージセンター機能の使い方

August 24, 2013 5:50 PM

概要

Movable Type 6 にメッセージセンターという、各種アラート、メッセージ表示を行うための機能がついています。メッセージセンター機能についてのページに外観からコールバックを使った表示方法まですべてが集約されています。あらこれだけ?と思いますが、まあ確かにこれだけ。でも、メッセージセンターは CMS からのプッシュ通知であり、様々な面で CMS の利便性を高める可能性でもあります。最近記事書いてないけど大丈夫?とか、もうすぐエイプリルフールだけどネタの仕込みは進んでる?今日の 11:00 にこの記事が日時指定公開だからね、といったブロガー向けな内容から、システム管理者からのメンテナンス告知とか、特定ユーザに向けたメッセージ、TODO 機能なんかにも使えそうですね。

仕組み

メッセージセンターは「サイト情報」や「ようこそ、Loupeへ」と同じくメインカラムに表示されるダッシュボードウィジェットですが、テンプレートの書き方によりメッセージがある場合だけ表示されるようになっていることと、can_close="0" であるために非表示化ができないため、ユーザのコントロール外で強制的に表示される形になっています。

使われているテンプレートは /path/to/mt/tmpl/cms/widget/notification_dashboard.tmpl で、特別なハンドラはありません。テンプレートに記述された内容のとおり、テンプレート変数 loop_notification_dashboard にメッセージの情報をセットしておけば表示されます。メッセージセンターの機能紹介ページではコールバックを使った実装方法が紹介されていますが、notification_dashboard.tmpl を alt-tmpl し、テンプレートタグを使って変数に突っ込む、といったこともできますね。

コールバックでメッセージをセットする

公式の紹介ページに過不足ないソースコードのサンプルが記載されていて、書かれている通りです。config.yaml にコールバック set_notification_dashboard を定義します。


callbacks:
    set_notification_dashboard: $messagecenter::MessageCenter::Callbacks::_cb_set_notification_dashboard

そして、ハンドラを定義します。コールバックですから最初の引数は MT::Callback、二番目にメッセージの情報を格納した配列リファレンスが渡されます。メッセージのデータを作って、$loop_notification_dashboard に push することでメッセージが追加され、配列の順に表示されます。ダッシュボード以外の画面にも表示される通知「メッセージがN件あります。」の件数も配列数から自動的にカウントしてくれます。


sub _cb_set_notification_dashboard {
    my ( $cb, $loop_notification_dashboard ) = @_;

$loop_notification_dashboard に push するデータの形は公式の機能紹介ページを見ればわかりますが、level, text, detail をキーとしたハッシュリファレンスです。level はアイコンを表示する class になるので指定できるものが決まっており、指定しない場合は warning になります。アイコンを表示したくない場合は foo とか未定義の class をすればよいでしょう。text に指定するテキストはウィジェット内にデフォルトで表示され、クリックすると detail に指定するテキストが表示されます。detail には html タグを使うこともできるようです。このページおかしいんじゃないの、と言って編集画面へのリンクを張っておくこともできますね。


    my @notifications = (
        {
            level  => 'foo',
            text   => $plugin->translate( 'No icon' ),
            detail => '<a href="http://example.com/">' . $plugin->translate( 'Fooooooo!' ) . '</a>',
        },
    );
    push( @$loop_notification_dashboard, @notifications );

$app->user を使えば、ログインユーザ情報を使ってメッセージを表示することもできます。ログインしているユーザに対して「もっと仕事しろ」と通知する場合は以下のようになりますね。気軽に声をかけるフリをしつつ、詳細を見ると恐怖のメッセージが表示されるようにするには以下のように指定します。


    my $app = MT->instance();
    my @notifications = (
        {
            level  => 'error',
            text   => $plugin->translate( 'Hi, [_1]', MT::Util::encode_html( $app->user->nickname ) ),
            detail => $plugin->translate( 'Work harder.' ),
        },
    );
    push( @$loop_notification_dashboard, @notifications );

なお、コールバック set_notification_dashboard は戻り値に応じた Movable Type 側の処理はなく、die してもシステムログに残るだけで画面上の処理は進行します。

その他

メッセージセンターにメッセージを表示するときに使うコールバック set_notification_dashboard は、Listing Framework の __mode=filtered_list を含め、全てのユーザの全ての画面でコールされます(__mode=filtered_list では不要な気もしますが)。なるべく軽い処理にしておくほうがよいでしょうから、あくまでもメッセージセンターで表示する内容は概略に留めるのがよいでしょう。

個人的には、現在は単純に配列の順番に表示されるので、level => 'error' が上とか、もしくは priority を指定することで意図して上に表示させるなどの機能があってもいいんじゃないかなと思っていますが、おそらく今のところはそうたくさんの項目が表示される前提の機能ではない印象です。

メッセージセンターに関する所感

Data API が注目されがちな Movable Type 6 は全体的にデベロッパー向けの機能が強化されている印象を受けますが(もちろんそういう面も多分にあるのだと思いますが)、ユーザー体験の向上につなげやすそうなメッセージセンターや Chart API もいいですよね。

なお、今回、メッセージセンター機能について調べるのに使ったプラグインを GitHub に公開しています。

Comments


Contact me

Copyright © 2005 - 2017 okayama All rights reserved.