SessionコンポーネントのsetFlashメソッドでは第2引数でエレメントを指定出来ますが、デフォルトでは/View/Elements直下のエレメントを指すようになっています。
例えば、/View/Elements/flash/error.ctpをエレメントで指定するには
$this->Session->setFlash('メッセージ', 'flash/error');
とする必要があります。
でも、setFlashのエレメントは/View/Elements/flash以下に置くことにしていた場合、毎回flash/エレメント名で指定するのは面倒ですよね?
このような場合に
$this->Session->setFlash('メッセージ', 'error');
と書くためのメモです。
classNameでsetFlashを上書きしたMySessionを指定する
Sessionコンポーネントを継承したMySessionコンポーネントを作成して、setFlashメソッドを次のようにオーバーライドします。
/Controller/Component/MySession.php
<?php App::uses('SessionComponent', 'Controller/Component'); class MySessionComponent extends SessionComponent { public function setFlash($message, $element = 'default', $params = array(), $key = 'flash') { $element = 'flash'.DS.$element; // $elementをflash/エレメント名に置き換えるだけ CakeSession::write('Message.' . $key, compact('message', 'element', 'params')); } } ?>
AppControllerでSessionコンポーネントのオプションにclassName指定して読み込む
/Controller/AppController.php
class AppController extends Controller { public $components = array( 'Session' => array( 'className' => 'MySession', ), // 脚注 'DebugKit.Toolbar', );
この時、内部でSessionコンポーネントを利用するDebugKitなどのコンポーネントを先に呼び出してしまうと、通常のSessionコンポーネントが先に読み込まれるのでMySessionが反映されません。
コンポーネントの読み込み順に注意しましょう。
/View/Elements/flashにエレメントを追加する
あとは/View/Elements/flashにsetFlashで使用するエレメントを追加すればOKです。
最近はTwitterBootstrapを利用することが多いので、
<?PHP // $messageにHTMLタグ(<br />タグとか)が入った場合に複数行アラートにするalert-blockクラスを指定する $blockClass = ''; $res = preg_match('/<.*>/i', $message); if (!empty($res)) { $blockClass = ' alert-block'; } ?> <div class="alert alert-error<?PHP echo $blockClass; ?>"> <button type="button" class="close" data-dismiss='alert'>x</button> <?PHP echo $message; ?> </div>
こんなかんじでTwitterBootstrapのアラートで出力できるようにしています。
div class=”alert-error”をBootstrapのアラートclassに合わせてerrorとかsuccessとかのエレメントを作っておけば、setFlashのエレメントの指定でアラートの色も変更できて便利です。*1
- SessionHelperをclassNameを使っていじればエレメントファイルは一つで複数のアラートクラスに対応させることもできそうですね。 [↩]