У меня есть приведенная ниже настройка правил проверки. По какой-то причине '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)){
}
}
}
}
Я думаю, что вы неправильно понимаете, что такое торт 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
править.
Начиная с 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;
}