[Zend Framework] Zend_Controller: FlashMessenger アクションヘルパーをつかう
FlashMessenger と Twitter Bootstrap を利用して、メッセージを表示した後にじわっと消えるような機能を実装してみます。
Contents
書き方
ビューファイルのメッセージを表示したい場所に下記を書きます。
<?= $this->flashMessages() . PHP_EOL; ?>
あわせて、id="notice"
という要素をじわっと消すスクリプトを書いておきます。
例えばレイアウトビューファイルに書いておきます。
<script>
$(function() {
setTimeout(function() {
$('#notice').fadeOut("slow");
}, 800);
});
</script>
ビューヘルパーを用意します。
<?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 で以下を実行したとします。
// 操作完了の FlashMessage を表示する
$this->_helper->flashMessenger->addMessage(
array('alert-success'=>'更新されました。'));
ビューに仕込んだ部分にメッセージが表示されました。
遷移先のビューに表示
こんな感じでリダイレクトしたときでも
// 操作完了の FlashMessage を表示する
$this->_helper->flashMessenger->addMessage(
array('alert-success'=>'更新されました。'));
$this->_redirect('/index');
遷移先に下記が仕込んであれば
<?= $this->flashMessages() . PHP_EOL; ?>
メッセージが表示されました。
session has already been started by session.auto-start or session_start()
コントローラ内に session_start();
があると、このエラーが出ます。
メッセージの保管に Zend_Session_Namespace を使っているためのようです。
セッション管理には Zend_Session を使った方がよさそう。