2016-02-16 4 views
0

У меня есть следующая настройка правил проверки. По какой-то причине блок 'on' => 'create' не работает. Условия, которые должны быть реализованы, - это стандартное создание/изменение в отношении электронной почты. Кроме того, в разделе редактирования я получаю сообщение об ошибке с блока 'on' => 'create'.Проверка электронной почты в cakephp Модель

Как проверить адрес электронной почты? Я использую CakePHP v 2.6.1.

public $validate = array(
    'email' => array(
     'required' => array(
      'rule' => array('email'), 
      'message' => 'Kindly provide your email for verification.' 
     ), 
     'maxLength' => array(
      'rule' => array('maxLength', 255), 
      'message' => 'Email cannot be more than 255 characters.' 
     ), 
     'editunique' => array(
      'rule' => array('editunique'), 
      'message' => 'Provided Email address already exists.', 
      'on' => 'update' 
     ), 
     'unique' => array(
      'rule' => 'isUnique', 
      'message' => 'Provided Email already exists.', 
      'on' => 'create' 
     ) 
    ) 
); 


public function editunique($email) { 
    // email should be one and of the logged in user only. 
    if ($this->find('count', array(
     'conditions' => array(
      $this->alias . '.id <>' => $this->data[$this->alias]['id'], 
      $this->alias . '.email' => $email 
     ) 
    )) > 1) { 
     return false; 
    } 

} 

Кроме того, я не получаю значение $this->data[$this->alias]['id'].

My Controller имеет следующий раздел:

if ($this->Client->hasAny(array('Client.id' => base64_decode(trim($this->request->query['client_id']))))){ 
      if ($this->request->is('ajax') && $this->request->is('post')){ 
       $this->Client->create(); 
       $this->Client->id = base64_decode(trim($this->request->query['client_id'])); 
       $this->Client->set($this->request->data); 
       // validate 
       if($this->Client->validates()) { 
        // save the data after validation 
        if($this->Client->save($this->request->data)){ 
        } 
       } 
      } 
     } 
+0

нормально, чтобы получить '$ this-> данные [$ this-> псевдоним] [ 'ID']' значение, изменение на '$ this-> id'. Таким образом, получение идентификатора набора теперь, но проблема с созданием сохраняется. – Sp0T

+0

Что вы пытаетесь сделать с помощью своего пользовательского правила проверки? Это похоже на репликацию собственного правила проверки подлинности 'isUnique' Cake. – drmonkeyninja

+0

Да, это для уникальности, но при обновлении деталей профиля. На самом деле я воспользовался этой функцией - http://stackoverflow.com/a/20203538/3007408. Хотя этот ответ говорит использовать перед сохранением, я использую его во время проверки. – Sp0T

ответ

1

Я думаю, вы непонимание, что торт isUnique правило проверяет и в результате более усложнять. Cake defines isUnique как: -

Данные для поля должны быть уникальными, она не может быть использована другими рядами

Когда он проверяет, является ли значение уникальным достаточно умна, чтобы исключить существующие данные текущей строки (похоже, вы пытаетесь сделать это с правилом editunique).

Так что вам просто нужно ваши правила проверки выглядеть следующим образом: -

public $validate = array(
    'email' => array(
     'required' => array(
      'rule' => array('email'), 
      'message' => 'Kindly provide your email for verification.' 
     ), 
     'maxLength' => array(
      'rule' => array('maxLength', 255), 
      'message' => 'Email cannot be more than 255 characters.' 
     ), 
     'unique' => array(
      'rule' => 'isUnique', 
      'message' => 'Provided Email already exists.' 
     ) 
    ) 
); 

Это устраняет editunique правила и падает on состояния вашего unique правила.

+1

Спасибо за быстрый ответ. – Sp0T

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; 
} 
Смежные вопросы