2016-09-21 21 views
0

我需要確保電子郵件字段對於當前聯繫人表是唯一的,並且我希望確保同一電子郵件對於用戶表也是唯一的。如果在任一表中都找不到,則允許保存數據。使用CakePHP 3.x中的自定義驗證器在兩個表中驗證電子郵件

我不確定我是否以最佳方式檢索數據。這是我找到工作的唯一途徑。

此外,我可以讓自定義檢查工作,如果電子郵件存在,它將返回false,如果電子郵件不存在,則返回true,但它仍保存數據。如果發現電子郵件,不知道如何告訴它不要保存數據。

這裏是我的聯繫人表目前型號:

<?php 
namespace App\Model\Table; 

use App\Model\Entity\Contact; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Table; 
use Cake\ORM\TableRegistry; 
use Cake\Validation\Validator; 

/** 
* Contacts Model 
*/ 
class ContactsTable extends Table 
{ 

    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     $this->table('contacts'); 
     $this->displayField('first_name'); 
     $this->primaryKey('id'); 
     $this->addBehavior('Timestamp'); 
    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator 
      ->allowEmpty('id', 'create'); 

     $validator 
      ->add('email', [ 
       'validateEmail' => [ 
        'rule' => 'validateEmail', 
        'provider' => 'table', 
        'message' => 'That email already exists' 
        ] 
       ]) 
      ->requirePresence('email', 'create') 
      ->notEmpty('email'); 

     return $validator; 
    } 

    //check that the email is unique in both the Contacts table and in the Users table 
    public function validateEmail($value, $context) { 
     $usersTable = TableRegistry::get('Users'); 
     $contactsTable = TableRegistry::get('Contacts'); 
     if ($contactsTable->exists(['email' => $value]) || $usersTable->exists(['email' => $value])) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 
+0

我不得不清除蛋糕緩存,現在它的大部分功能正常。我現在遇到的問題是該字段未驗證時該消息無法顯示。 – Battousai

回答

0

當我剛開始這項工作我無法弄清楚如何拉在表中的數據,但我得到了它使用的方法工作我的OP。

但是,我不認爲這是做到這一點的最好方法。如果有人有更好的辦法,讓我知道。

上述代碼正在檢查2個表格以獲取唯一電子郵件。

我也想出瞭如何顯示消息。當我保存數據,我使用此代碼重寫$聯繫對象:

if ($contact = $this->Contacts->save($contact)) { 
    //code to execute 
} 

有一次,我改變了到:

$new_contact = $this->Contacts->save($contact) 

它開始工作。