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

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

[markdown]

> * [アクションヘルパー – Zend_Controller – Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.controller.actionhelpers.html#zend.controller.actionhelpers.flashmessenger)
> * [Components · Bootstrap](http://twitter.github.io/bootstrap/components.html#alerts)
> * [Easy Flash Messenger Messages in Zend Framework | Aaron Saray](http://aaronsaray.com/blog/2011/06/14/easy-flash-messenger-messages-in-zend-framework/)

## 書き方

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

“`php:application/views/scripts/index/sitemap.phtml
flashMessages() . PHP_EOL; ?>
“`

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

“`php:application/layouts/scripts/layout.phtml

“`

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

“`php:application/views/helpers/FlashMessages.php
getMessages();
$output = ”;
if (!empty($messages)) {
foreach ($messages as $message) {
$output .= ‘

‘;
$output .= ‘ ‘ . current($message);
$output .= ‘

‘;
}
}
return $output;
}
}
“`

## 使い方

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

### 対応するビューに表示

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

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

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

flashMessage 2013-07-19 20-52-45

### 遷移先のビューに表示

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

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

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

“`php:application/views/scripts/index/index.phtml
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_Controller – Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.controller.actionhelpers.html#zend.controller.actionhelpers.flashmessenger)

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

> * [php – "session has already been started…." exception in Zend Framework application – Stack Overflow](http://stackoverflow.com/questions/2418124/session-has-already-been-started-exception-in-zend-framework-application)
> * [Zend_Session – Zend Framework Reference – Zend Framework](http://framework.zend.com/manual/1.12/ja/zend.session.html)

[/markdown]