CakePHP需要两个页面加载来验证表单

时间:2013-02-11 22:30:29

标签: php validation cakephp

我正在编写一个页面,用户可以在其中更改帐户电子邮件和密码。这是控制器动作和视图:

# UsersController.php
public function edit() {
    if($this->request->is('post')) {
        if($this->User->save($this->request->data)) {
            $this->Session->setFlash('Your account has been updated.');
            $this->redirect(array('action' => 'edit'));
        }

        $this->Session->setFlash('There was a problem saving your account settings. Please try again.');
    }

    // Auto populate form fields
    if(!$this->request->data) {
        $this->request->data = $this->User->find('first', array(
            'conditions' => array('User.id' => $this->Auth->user('id'))
        ));
    }
}

# edit.ctp
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('currentPassword', array('between' => 'You must enter your password in order to make changes', 'type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('email'); ?>
<?php echo $this->Form->input('password', array('type' => 'password', 'between' => 'Must be atleast 6 characters', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('confirmPassword', array('type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->end('Save changes'); ?>

现在,我想让用户输入他们当前的密码以进行更改。为了使其工作,我需要运行验证检查以确保他们在currentPassword中输入的密码与我在数据库中的密码相匹配。我的User模型中的验证规则之一是:

'currentPassword' => array(
    'custom' => array(
        'rule' => 'validateCurrentPassword',
        'message' => 'Incorrect password. Make sure you\'re using your current password.'
    )
),

以及被调用的相关函数:

public function validateCurrentPassword($data) {
    debug($data);
    return false;
}

到目前为止这么好,但有一些非常奇怪的行为。在两次页面加载后,Cake似乎只验证此字段。例如,如果输入错误的值并按“保存更改”,页面将刷新,但不会弹出验证错误。如果我输入另一个错误的值,我会收到验证错误。出于某种原因,我需要提交两次表格以进行验证。

任何人都可以找出原因吗?

2 个答案:

答案 0 :(得分:2)

第一次提交表单时,

$this->request->is('post')false,第二次提交表单时truelib/Cake/Console/Templates/default/actions/controller_actions.ctp。查看edit文件,您会看到当您烘焙控制器操作时,这是用于if ($this->request->is('post') || $this->request->is('put')) { 操作的代码:

$this->request->is('put')

如果您使用上述代码,则会处理第一个表单提交(因为true将为FormHelper)。

查看create类的lib/Cake/View/Helper/FormHelper.php方法(位于{{1}}),以查看表单何时被视为PUT以及何时将其视为POST。

答案 1 :(得分:0)

您可以使用ajax调用从数据库中获取密码。当用户进入密码字段旁边的字段时,在jquery或javascript中触发事件以检查用户输入的密码和从ajax响应中检索到的密码是否相同,如果他们没有给用户提供输入正确密码的警报或消息,