エラーメッセージの表示方法

cakephp(cakephp1.2RC2時点)で、たとえばフォームの入力値のチェック後エラーを出力するとしたら、FORMヘルパーのINPUTメソッドで自動的に表示させるか、FORMヘルパーのERRORメソッドで表示場所を指定して表示させたりするんだと思います。

参考)CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法 | Sun Limited Mt.
http://www.syuhari.jp/blog/archives/394

もしくは、処理の成功失敗に関わらず、コントローラのFLASHメソッドを使って次画面でメッセージを表示させるケースがあるかと思います。

参考)CakePHP コントローラのflash メソッド | Sun Limited Mt.
http://www.syuhari.jp/blog/archives/23

今回もなるべく標準機能のこれらを使っていこうと思っていたのだが、例えば一覧表示内の複数のデータのある項目(並び順項目とか)を一括で更新するようなときは、複数エラーメッセージを表示させなければいけないこともあり、上記の両方とも上手く使えなかったりする。

そんなときにみつけたのがこれ。

Multiple flashes with different classes (Articles)

これなら、下記のようなことができるので便利。

複数エラーメッセージの例

複数エラーメッセージの例

処理成功のメッセージもこんな感じで表示できる。

処理が成功した時のメッセージ例

処理が成功した時のメッセージ例

使い方はこう。

まず、事前準備。
AppControllerに下記を追加する。

PHP:
  1. function flash( $message, $class = 'status' ) {
  2.     $this->Session->activate();
  3.     $old = $this->Session->read('messages');
  4.     $old[$class][] = $message;
  5.     $this->Session->write( 'messages', $old );
  6.   }

さらにヘルパー(flash.php)を作成。

PHP:
  1. class FlashHelper extends Helper {
  2.   var $helpers = array( 'Session' );
  3.  
  4.   function show() {
  5.     // Get the messages from the session
  6.     $messages = $this->Session->read( 'messages' );
  7.     $html = '';
  8.  
  9.     // Add a div for each message using the type as the class
  10.     if (!empty($messages)) {
  11.       foreach ($messages as $type => $msgs) {
  12.         foreach ($msgs as $msg) {
  13.           if (!empty($msg)) {
  14.             $html .= '<div class="' . $type . '">' . $msg . "</div>\n";
  15.           }       
  16.         }
  17.       }
  18.     }
  19.    
  20.     // Clear the messages array from the session
  21.     $this->Session->del( 'messages' );
  22.    
  23.     return $this->output( $html );
  24.   }
  25.  
  26. }

実際に使う際には、上記FLASHヘルパーを使えるようにしておいて、例えば下記のような感じで使う。

エラーメッセージの場合

PHP:
  1. $this->flash( '削除するユーザを指定してください。', 'error' );

成功メッセージの場合

PHP:
  1. $this->flash( 'ユーザを削除しました。', 'success' );

ビューのほうでは、表示したいところにこんな感じで指定する。今回はレイアウト内(/app/views/layouts/admin.ctp)の$content_for_layoutの部分の直前に指定した。

PHP:
  1. echo $flash->show();

管理画面のメッセージ出力方法としてはシンプルかつ柔軟性があってよさそうな気がする。

Tags: ,