シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP2]Session::setFlashのエレメントをディレクトリにまとめる

medium_4402962654

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]

  1. SessionHelperをclassNameを使っていじればエレメントファイルは一つで複数のアラートクラスに対応させることもできそうですね。 []

シェアする

  • このエントリーをはてなブックマークに追加

フォローする