用户编辑期间CakePHP是唯一验证

时间:2012-01-01 22:11:38

标签: validation cakephp

我为我的用户模型处理了以下验证码。它在创建用户时效果很好,但是在更新时它不起作用。我知道'on' => 'create',但我希望规则也适用于编辑期间。我允许用户更改其用户名,但如果用户将其更改为已在Db中,则应拒绝提交。

var $validate = array(
    'username' => array(
        'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'message' => 'Usa letras ou numeros como o teu << Usuario >>',
        ),
        'between' => array(
                'rule' => array('between' , 5, 15),
                'message' => 'O << Usuario >> tens que ter entre 5 a 15 letras/numeros',
        ),
        'isUnique' => array(
                'rule' => 'isUnique',
                'message' => 'O << Usuario >> que escolhestes ja foi utilizado. Escolhe um outro.'
        )
    )
);

由于用户需要登录才能访问“编辑”页面,因此可以创建自定义验证规则:

  1. 检查提交的用户名是否已属于Auth-&gt;用户('id')并且是否正常提交
  2. 但是,如果提交的用户名与Auth-&gt; User('username')不同,我们应检查其他人是否拥有此用户名。
  3. 如果Auth-&gt; User()为NULL,则处理isUnique正常,因为这仅适用于创建新用户。
  4. 由于

    检查

2 个答案:

答案 0 :(得分:2)

我能够使用以下方法修复我的问题:

var $validate = array(
    'username' => array(
        'third' => array(
                'rule' => array('checkUniqueName'),
                'message' => 'O << Usuario >> que escolhestes ja foi utilizado. Escolhe um outro.'
        )
    ),
    'email' => array(
        'second' => array(
            'rule' => array('checkUniqueEmail'),
            'message' => 'Este email ja foi registado anteriormente. Contacta-nos se foi por engano'
        )
    )
);  


function checkUniqueName($data) {

    $isUnique = $this->find(
                'first',
                array(
                    'fields' => array(
                        'User.id',
            'User.username'
                    ),
                    'conditions' => array(
                        'User.username' => $data['username']
                    )
                )
        );

    if(!empty($isUnique)){

        if($this->authUserId == $isUnique['User']['id']){
            return true; //Allow update
        }else{
            return false; //Deny update
        }
    }else{
        return true; //If there is no match in DB allow anyone to change
    }
    }

function checkUniqueEmail($data) {

    $isUnique = $this->find(
                'first',
                array(
                    'fields' => array(
                        'User.id'
                    ),
                    'conditions' => array(
                        'User.email' => $data['email']
                    )
                )
        );

    if(!empty($isUnique)){

        if($this->authUserId == $isUnique['User']['id']){
            return true; //Allow update
        }else{
            return false; //Deny update
        }
    }else{
        return true; //If there is no match in DB allow anyone to change
    }
    }

答案 1 :(得分:1)

如果未为验证规则指定“on”键,或者将其设置为null,则该规则将同时应用于1.3和{{ 3}}手册:

  

'on'键可以设置为以下任一值:'update'或'create'。这提供了一种机制,允许在创建新记录期间或更新记录期间应用某个规则。

     

如果规则已定义'on'=&gt; 'create',规则只会在创建新记录时强制执行。同样,如果它被定义为'on'=&gt; '更新',只会在更新记录时强制执行。

     

'on'的默认值为null。当'on'为null时,将在创建和更新期间强制执行该规则。

您提供的代码也应在编辑表单上进行验证,只要您确保在表单上包含登录用户的ID即可。例如:

<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->hidden('id', array('value' => AuthComponent::user('id'))); ?>
<?php echo $this->Form->input('username'); ?>
<?php echo $this->Form->end('Update Username'); ?>

如果表单是创建用户表单,则不会包含隐藏的ID字段。