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を使っていじればエレメントファイルは一つで複数のアラートクラスに対応させることもできそうですね。 [↩]
