1

我正在尝试为用户注册设置验证,但我遇到了麻烦。当我在 $validation 数组中只有电子邮件、角色和密码字段时(删除其他字段),它可以工作并保存一个新用户。当我尝试添加其他字段时,它会失败并给出 Flash 消息错误“无法保存用户。请重试。”

我很确定这是 re_password 检查。当我删除它的验证时,它可以工作。但是,当密码不同时,re_password 验证确实会显示错误,所以我不确定在哪里查看

这是我的用户表

id  |  email  |  password  |  location  | website  | role  | created |  modified

这是验证要求。为了让它保存一个新用户,我必须删除除电子邮件、密码和角色之外的所有内容。

public $validate = array(
    'email' => 'email'
    ,
    'password' => array(
        'required' => array(
            'rule' => array('minLength', '8'),
            'message' => 'A password with a minimum length of 8 characters is required'
        )
    ),
    're_password' => array(
        'required' => array(
            'rule' => array('equalTo', 'password' ), 
            'message' => 'Both password fields must be filled out'
        )
    ),
    'role' => array(
        'valid' => array(
            'rule' => array('inList', array('admin', 'author')),
            'message' => 'Please enter a valid role',
            'allowEmpty' => false
        )
    ),
     'location' => array(
        'valid' => array(
            'rule' => array('notEmpty'),
            'message' => 'Please select a location'
        )
    )
);

这是表格(选项数组在上面,认为没有必要显示)

    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off'));
    echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location'));
    echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. ')); 
    echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user'));

这是 User 模型中的 re_password 检查函数

function check_user_password($userid) { 
    $salt = Configure::read('Security.salt');
    $this->User->id = $userid;
    $hashed_password = $this->User->field('password');
    // check password  
    if($hashed_password == md5($data['User']['re_password'].$salt)) {  
        return true;
    } else {
        return false;
    }
}   

最后,这是 UsersController 中的 add 函数

public function add() {  
        if ($this->request->is('post')) {  
            $this->User->create();     //create initiates a form on User/add.ctp
            if ($this->User->save($this->request->data)) {  //save the form data
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('controller' => 'demos', 'action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }

如果您还有什么需要看的,请告诉我

4

3 回答 3

4

我相信您的 re_passwords valiadtion 规则 equalTo 将其值与字符串密码而不是实际字段进行比较。我喜欢为此使用自定义函数。

所以尝试替换 re_passwords 规则数组

 //'rule' => array('equalTo', 'password' ),
'rule' => array('equalToField', 'password'),

并在该模型中声明 equalToField 函数

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

** 将来,当您似乎对验证规则有疑问时,请在您的控制器操作中尝试此操作(它比删除每条规则更快)

if ($this->User->save($this->request->data)) {
    ...
} else {
    debug($this->User->validationErrors);
    ...
}

我希望这有帮助。

于 2013-04-24T08:31:21.487 回答
0

嗨,请根据您的要求使用以下代码:

通过将您自己的方法放在用户模型中来覆盖 equalTo 函数:

function equalTo( $field=array(), $compare_field=null ) 
{
    foreach( $field as $key => $value ){
        $v1 = $value;
        $v2 = $this->data[$this->name][ $compare_field ];
        if($v1 !== $v2) {
            return FALSE;
        } else {
           continue;
        }
    }
    return TRUE;

}
于 2013-04-24T11:16:53.443 回答
0

注意,在@luboss 的回答中,他声明:

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

当我们比较不一致的字段时,这是行不通的:strcmp 的左成员已经被散列,但不是右成员。这是作为 CakePHP 自动化发生的,因为该字段称为password

我让它工作的方法是在equalToField助手中重用散列函数:

public function equalToField($array, $field) {
    $valueFirstOccurrence = $this->data[$this->alias][$field];
    $valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ;
    return !strcmp($valueFirstOccurrence, $valueSecondOccurrence);
}

其他点: 如果您有兴趣为密码字段添加 minLength 验证字段,您想先阅读这篇好文章: minLength data validation is not working with Auth component for CakePHP

于 2014-01-22T11:47:00.430 回答