我有以下验证规则设置。出于某种原因,'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 :(得分:1)
我认为你误解了Cake的isUnique
规则检查的结果,以及因为复杂的事情。蛋糕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 :(得分: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;
}