2016-09-21 5 views
0

電子メールフィールドが現在の連絡先テーブルに対して一意であることを確認する必要があります。同じ電子メールがusersテーブルに対しても一意であることを確認します。いずれかのテーブルに見つからない場合は、データを保存します。CakePHP 3.xのカスタムバリデータで2つのテーブルにわたって電子メールを検証

私は最良の方法でデータを取得しているかどうかはわかりません。これが私が働くことがわかった唯一の方法です。

また、カスタムチェックを有効にすることができます。電子メールが存在する場合は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) 

それが仕事を始めました。

関連する問題