2013-02-18 41 views
0

我正在使用cakephp。我需要在電子郵件字段中添加三個驗證。首先驗證是否給出電子郵件地址,其次是有效的電子郵件地址,如果給出了第三個電子郵件地址,則應該是唯一的。因爲它是一個註冊表單。cakephp notempty字段上的空白和唯一驗證

我如何在一個字段中添加三個驗證,我嘗試使用以下代碼,但它對我無效。

public $validate = array(
     'email' => array(
      'email' => array(
       'rule' => array('email'), 
       'message' => 'Invalid email address', 
       'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or 'update' operations 
      ) 
     ), 
     'email' => array(
       'rule' => 'isUnique', 
       'message' => 'Email already registered' 
      ) 
); 

回答

14

您有兩個相同的索引'email',PHP不允許你。更改類似: -

array(
    'email' => array(
     'notEmpty' => array(
      'rule' => 'notEmpty', 
      'message' => 'Provide an email address' 
     ), 
     'validEmailRule' => array(
      'rule' => array('email'), 
      'message' => 'Invalid email address' 
     ), 
     'uniqueEmailRule' => array(
      'rule' => 'isUnique', 
      'message' => 'Email already registered' 
     ) 
    ) 
); 

否則,只會使用您的一條規則。

+0

它的工作原理是這樣

 'email'=>array( 'notempty'=>array( 'rule'=>'notempty', 'message'=>'Required Field' ), 'email'=>array( 'rule'=>'email', 'message'=>'Enter Valid Email' ), 'isUnique'=>array( 'rule'=>'isUnique', 'message'=>'Email Already Exists' ) ) 
nbhatti2001 2013-02-18 10:05:28

0

你使用的是什麼版本的CakePHP?

因爲我覺得,如果你使用2.3,它應該是:

public $validate = array('email' => 'email'); 

在你的SQL表中的字段設置電子郵件作爲主鍵。

0

正如實體表CakePHP的3.0的就應該是這個樣子

namespace App\Model\Table; 

public function validationDefault($validator) 
{ 
$validator 
    ->email('email') 
    ->add('email', 'email', [ 
     'rule' => [$this, 'isUnique'], 
     'message' => __('Email already registered') 
    ]) 
    ->requirePresence('email', 'create') 
    ->notEmpty('email', 'Email is Required', function($context){ 
     if(isset($context['data']['role_id']) && $context['data']['role_id'] != 4){ 
      return true; 
     } 
     return false; 
    }); 
return $validator; 
} 
} 


function isUnique($email){ 
$user = $this->find('all') 
    ->where([ 
      'Users.email' => $email, 
     ]) 
    ->first(); 
    if($user){ 
     return false; 
    } 
    return true; 
}