[Zend Framework] Zend_Controller: FlashMessenger アクションヘルパーをつかう

FlashMessenger と Twitter Bootstrap を利用して、メッセージを表示した後にじわっと消えるような機能を実装してみます。

Contents

書き方

ビューファイルのメッセージを表示したい場所に下記を書きます。

application/views/scripts/index/sitemap.phtml
<?= $this->flashMessages() . PHP_EOL; ?>

あわせて、id="notice" という要素をじわっと消すスクリプトを書いておきます。
例えばレイアウトビューファイルに書いておきます。

application/layouts/scripts/layout.phtml
<script>
$(function() {
  setTimeout(function() {
    $('#notice').fadeOut("slow");
  }, 800);
});
</script>

ビューヘルパーを用意します。

application/views/helpers/FlashMessages.php
<?php
class Zend_View_Helper_FlashMessages extends Zend_View_Helper_Abstract
{
    public function flashMessages()
    {
        $messages = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages();
        $output = '';
        if (!empty($messages)) {
            foreach ($messages as $message) {
                $output .= '<div id="notice" class="alert ' . key($message) . '">';
                $output .= '    ' . current($message);
                $output .= '</div>';
            }
        }
        return $output;
    }
}

使い方

コントローラから、css の class名とメッセージを渡します。

対応するビューに表示

sitemapAction で以下を実行したとします。

application/controllers/IndexController.php
// 操作完了の FlashMessage を表示する
$this->_helper->flashMessenger->addMessage(
        array('alert-success'=>'更新されました。'));

ビューに仕込んだ部分にメッセージが表示されました。

flashMessage 2013-07-19 20-52-45

遷移先のビューに表示

こんな感じでリダイレクトしたときでも

application/controllers/IndexController.php
// 操作完了の FlashMessage を表示する
$this->_helper->flashMessenger->addMessage(
        array('alert-success'=>'更新されました。'));
$this->_redirect('/index');

遷移先に下記が仕込んであれば

application/views/scripts/index/index.phtml
<?= $this->flashMessages() . PHP_EOL; ?>

メッセージが表示されました。

flashMessage 2013-07-19 20-55-25

session has already been started by session.auto-start or session_start()

コントローラ内に session_start(); があると、このエラーが出ます。
メッセージの保管に Zend_Session_Namespace を使っているためのようです。

セッション管理には Zend_Session を使った方がよさそう。