在 CakePHP 的教程中,CRUD 操作结束后跳转到新页面时,一般会做一个提示框显示在页面上。这个做法在教程中是按照下面的这么个流程写的:
首先在 Controller 里面做跳转之前:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
public  function  add ()  { 
    if  ( $this -> request -> is ( 'post' ))  { 
         $this -> Post -> create (); 
         if  ( $this -> Post -> save ( $this -> request -> data ))  { 
             /** 
              * 跳转之前设置一条 Session 信息 
             */ 
            $this -> Session -> setFlash ( __ ( 'Your post has been saved.' )); 
             return  $this -> redirect ( array ( 'action'  =>  'index' )); 
         } 
         $this -> Session -> setFlash ( __ ( 'Unable to add your post.' )); 
     } 
 } 
在 View 上要做下面修改:
1 
2 
3 
4 
< div  id = "content" > 
    <? php  echo  $this -> Session -> flash ();  ?>       <?php  echo  $this -> fetch ( 'content' );  ?> </div> 
上面代码中的 <?php echo $this->Session->flash(); ?> 的作用就是将前一次跳转中设置的 Session 跳转信息显示在页面上,随后删除 Session 中的跳转信息,以确保下一次不会再显示。
但是,默认情况下,这段跳转信息的 HTML 结构是这样的:
1 
< div  id = "flashMessage"  class = "message" > Hello ,  world !</ div > 
那么,如果要配合 BootStrap 一起使用的话,应该如何设置呢?咱们先来看看 SessionComponent 和 SessionHelper 的部分源代码。
SessionComponent 1 
2 
3 
public  function  setFlash ( $message ,  $element  =  'default' ,  $params  =  array (),  $key  =  'flash' )  { 
    CakeSession :: write ( 'Message.'  .  $key ,  compact ( 'message' ,  'element' ,  'params' )); 
 } 
很明显,在跳转之前调用 $this->Session->setFlash(__(‘Your post has been saved.’)); ,会在 Session 中以 Message{$key} 作为 Key 写入对应的 $message ,$element ,$params。接着会在 SessionHelper 中调用:
SessionHelper 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
public  function  flash ( $key  =  'flash' ,  $attrs  =  array ())  { 
    $out  =  false ; 
 
     if  ( CakeSession :: check ( 'Message.'  .  $key ))  { 
         $flash  =  CakeSession :: read ( 'Message.'  .  $key ); 
         $message  =  $flash [ 'message' ]; 
         unset ( $flash [ 'message' ]); 
 
         if  ( ! empty ( $attrs ))  { 
             $flash  =  array_merge ( $flash ,  $attrs ); 
         } 
 
         if  ( $flash [ 'element' ]  ===  'default' )  { 
             $class  =  'message' ; 
             if  ( ! empty ( $flash [ 'params' ][ 'class' ]))  { 
                 $class  =  $flash [ 'params' ][ 'class' ]; 
             } 
             $out  =  '<div id="'  .  $key  .  'Message" class="'  .  $class  .  '">'  .  $message  .  '</div>' ; 
         }  elseif  ( ! $flash [ 'element' ])  { 
             $out  =  $message ; 
         }  else  { 
             $options  =  array (); 
             if  ( isset ( $flash [ 'params' ][ 'plugin' ]))  { 
                 $options [ 'plugin' ]  =  $flash [ 'params' ][ 'plugin' ]; 
             } 
             $tmpVars  =  $flash [ 'params' ]; 
             $tmpVars [ 'message' ]  =  $message ; 
             $out  =  $this -> _View -> element ( $flash [ 'element' ],  $tmpVars ,  $options ); 
         } 
         CakeSession :: delete ( 'Message.'  .  $key ); 
     } 
     return  $out ; 
 } 
从上面默认的代码可以看出,如果 $element 为 default 的话,就是之前默认的 HTML 结构;如果没设置的话,则直接显示 $message 文本信息;如果设置成其他的值,就会到 View/Elements 下调用相对应的模板文件。
为此,我特别写了一个模板:
notify.ctp 1 
2 
3 
4 
< div  id = "flashMessage"  class = "alert <?php echo isset( $status ) ? 'alert-' .  $status  : ''; ?> <?php echo isset( $block ) &&  $block  ? 'alert-block' : ''; ?> text-center" > 
    < a  class = "close"  data - dismiss = "alert" > × </ a > 
     <? php  echo  h ( $message ) ?>  </div> 
这样调用的时候,只需要在 Controller 里用下面的代码即可,View 中不需要更改。最终在显示的时候,就会呈现出一个通栏的提示框,当然你也可以把它放在特定的 DIV 里,让它的样式能够符合你的需求。
1 
$this -> Session -> setFlash ( "Hello, world!" ,  'notify'  ,  array ( 'status' => 'success' )); 
第三个参数中的 status 就是用来定制显示信息的样式,具体有哪些配置可以参考 http://v2.bootcss.com/components.html#alerts  。
Have a nice day!