Проверка электронной почты в модели CakePHP

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

Как проверить адрес электронной почты? Я использую 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'] значение.

Мой контроллер имеет следующий раздел:

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

Решение

Я думаю, что вы неправильно понимаете, что такое торт isUnique правило проверяет и, как следствие, усложняет вещи. Кекс определяет 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

Другие решения

Начиная с 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;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector