2016-09-21 2 views
0

Ich muss sicherstellen, dass ein E-Mail-Feld für die aktuelle Kontakte Tabelle eindeutig ist, und ich möchte sicherstellen, dass gleiche E-Mail an die Benutzer-Tabelle als auch einzigartig ist. Wenn es in keiner der beiden Tabellen gefunden wird, lassen Sie die Daten speichern.Validate E-Mail über 2 Tabellen mit benutzerdefinierten Validator in CakePHP 3.x

Ich bin nicht sicher, ob ich die Daten in der besten Art und Weise bin abruft. Dies ist die einzige Möglichkeit, die ich gefunden habe.

Auch kann ich den benutzerdefinierten Scheck an der Arbeit, und es wird falsch zurück, wenn die E-Mail vorhanden ist, und dann, wenn die E-Mail nicht funktioniert existiert, aber es spart noch die Daten. Ich bin mir nicht sicher, wie ich die Daten nicht speichern soll, wenn die E-Mail gefunden wurde.

Hier ist meine Kontakte Tischmodell zur Zeit:

<?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

Ich musste den Kuchen-Cache leeren und jetzt funktioniert es größtenteils richtig. Das Problem, das ich jetzt habe, ist, dass die Nachricht nicht angezeigt wird, wenn das Feld nicht validiert wird. – Battousai

Antwort

0

Als ich konnte ich nicht herausfinden, wie erste Bemühung begonnen, die Daten in der Tabelle zu ziehen, aber ich habe es mit der Methode zu arbeiten in mein OP.

Allerdings glaube ich nicht, dass das der beste Weg ist, es zu tun. Wenn jemand einen besseren Weg hat, lass es mich wissen.

Der obige Code funktioniert in Bezug auf die Überprüfung von 2 Tabellen für eine eindeutige E-Mail.

Ich habe auch herausgefunden, wie Sie die Nachricht anzeigen. Wenn ich die Daten sparte ich deshalb überwiegend sei das Objekt $ Kontakt mit diesem Code:

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

Einmal habe ich das geändert zu:

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

zu arbeiten Es begann.