2007年5月15日 星期二

CakePHP使用手冊-資料檢驗

轉貼自 http://www.ezluk.org/

資料檢驗



第一節


資料檢驗



建立自訂的資料檢驗規則可以協助確認Model裡資料是否合乎企業邏輯的需求,
例如密碼長度只能八個字元,使用者名稱字能使用文字等等。



資料檢驗的第一步是在Model裡建立檢驗規則。
這件事可透過定義Model裡的Model::validate陣列達成,例如:




/app/models/user.php



<?php

class User extends AppModel

{

   var $name = 'User';



   var $validate = array(

      'login' => '/[a-z0-9\_\-]{3,}$/i',

      'password' => VALID_NOT_EMPTY,

      'email' => VALID_EMAIL,

      'born' => VALID_NUMBER

   );

}

?>



檢驗規則定義法是使用Perl相容的通用表示法,有些常用的規則已事先定義在/libs/validators.php。如:




  • VALID_NOT_EMPTY


  • VALID_NUMBER


  • VALID_EMAIL


  • VALID_YEAR



若model定義了$validate陣列,檢驗動作便會在資料儲存前自動啟動(呼叫Model::save()時)。
若想要手動啟動檢驗功能,
也可以直接呼叫Model::validates()(如果資料錯誤會傳回false)和Model::invalidFields()(傳回存有錯誤訊息的陣列)。



但通常資料都隱藏在controler的程式裡。
下面的範例示範如果使用檢驗的機制:




/app/controllers/blog_controller.php 內處理表單資料的Action



<?php

class BlogController extends AppController {



   var $uses = array('Post');



   function add ()

   {

      if (empty($this->data))

      {

         $this->render();

      }

      else

      {

         if($this->Post->save($this->data))

         {

             //太好了,資料合乎規則

         }

         else

         {

            //危險,威爾羅賓遜!檢驗結果錯誤。

            $this->set('errorMessage', 'Please correct errors below.');

            $this->render();

         }

      }

   }

}

?>




這個action使用的view看起來可以像這樣:





在/app/views/blog/add.thtml加入表單的view


<h2>Add post to blog</h2>

<form action="<?php echo $html->url('/blog/add')?>" method="post">

    <div class="blog_add">

        <p>Title:

            <?php echo $html->input('Post/title', array('size'=>'40'))?>

            <?php echo $html->tagErrorMsg('Post/title', 'Title is required.')?>

        </p>

        <p>Body

            <?php echo $html->textarea('Post/body') ?>

            <?php echo $html->tagErrorMsg('Post/body', 'Body is required.')?>

        </p> 

        <p><?=$html->submit('Save')?></p>

    </div>

</form>

         



Controller::validates($model[, $model...])可用來啟動model裡自訂的檢驗規則。
Controller::validationErrors()則傳回model丟出的錯誤訊息,然後用tagErrorMsg()顯示於view內。



如果你想要設計些正規表示法無法表示的檢驗規則,可以使用model的invalidate()函式將某一欄位標示為錯誤。
例如我們想要在使用者要建立的使用者名稱已存在時,在表單上顯示錯誤訊息。
由於單單使用正規表示法很難表示這樣的規則,我們必需自己另外設計這個邏輯,接著把這個欄位標示為錯誤,
再經由Cake一般處理的流程處理。controller看起來像這樣:



<?php



class UsersController extends AppController

{

    function create()

    {

        // 來查是否有提交表單資料

        if (!empty($this->data['User']))

        {

            //看看這位使用者的姓名是否存在

            $user = $this->User->findByUsername($this->data['User']['username']);



            // 將欄位標示為錯誤,觸發HTML Helper的錯誤訊息。

            if (!empty($user['User']['username']))

            {

               //產生tagErrorMsg('User/username')

               
$this->User->invalidate('username');

            }



            //試著儲存資料,如果有錯就不要做。

            if($this->User->save($this->data))

            {

                $this->redirect('/users/index/saved');

            }

            else

            {

                 $this->render();

            }

        }

    }

}



?>

 

沒有留言:

網誌存檔

關於我自己

Aspire freedom , Hope to do Soming make self complete ~