2016-09-21 5 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

내가 먼저 나는 테이블에서 데이터를 가져 오는 방법을 알아낼 수없는 이러한 노력을 시작했다,하지만 난 방법을 사용하여 작동하도록 있어요 내 작전.

그러나 나는 그것을하는 것이 가장 좋은 방법이라고 생각하지 않습니다. 누군가가 더 좋은 길을 알고 있다면 알려주세요.

위의 코드는 2 개의 테이블에서 고유 한 전자 메일을 검사하는 데 사용됩니다.

나는 또한 메시지를 표시하는 방법을 알아 냈다. 나는 데이터를 저장할 때이 코드를 사용하여 $의 연락처 개체를 무시했다 :

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

그것은 일을 시작 :

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

I가 있음을 변경하면.

관련 문제