2

我有以下验证规则设置。由于某种原因,'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)){
                     }
                 }
             }
        }
4

2 回答 2

3

我认为您误解了 Cake 的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

于 2016-02-16T12:53:46.517 回答
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;
}
于 2017-05-10T23:59:47.487 回答