【问题标题】:CakePHP 2.3 form not showing validation errorsCakePHP 2.3 表单未显示验证错误
【发布时间】:2013-07-23 00:32:21
【问题描述】:

我已经尝试调试了大约两天,并在互联网上阅读了这个问题的所有答案......但仍然无法让它工作。

在我的 CakePHP 应用程序中,我有一个用户注册表单,它使用一个名为 User 的模型和 Form 助手。当验证失败时,表单不会显示任何验证错误。

根据debug()$this->User->validationErrors 数组在视图渲染之前已正确填充,$this->User->save() 检测到模型未验证的事实。

这是我的看法:

<?php
echo $this->Form->create('User');
echo $this->Form->input('soton_username', array('label' => 'Email address', 'after' => '@soton.ac.uk'));
echo $this->Form->input('username', array('label' => 'Choose a username'));
echo $this->Form->input('password');
echo $this->Form->input('password_confirm', array('label' => 'Password (again)', 'type' => 'password'));
echo $this->Form->input('first_name');
echo $this->Form->input('last_name');
echo $this->Form->submit('Create account');
echo $this->Form->end();
?>

这是我的行动:

public function create() {
    if($this->request->is('post')) {
        $this->User->set($this->request->data);

        $valid = true;
        $validationErrors = array();
        $password = $this->request->data('User.password');
        $password_confirm = $this->request->data('User.password_confirm');

        if(strlen($password) < 5) {
            $validationErrors['password'][] = 'Password must be at least 5 characters long';
            $valid = false;
        }

        if($password != $password_confirm) {
            $validationErrors['password_confirm'][] ='Passwords do not match';
            $valid = false;
        }

        $this->User->data['User']['email'] = $this->request->data('User.soton_username') . '@soton.ac.uk';

        $group = $this->Group->find('first', array('conditions' => array('default' => 1)));
        if($group) {
            $gid = $group['Group']['id'];
        } else {
            $gid = 1;
        }
        $this->User->data['User']['group_id'] = $gid;

        if($this->User->validates() && $valid) {
            $this->User->save();
            $this->Session->setFlash('<a href="/users/activate/' . $this->User->data['User']['activation_id'] . '">Activate</a>');
            return $this->redirect('/users/confirm_create');
        }

        $this->User->validationErrors = array_merge($this->User->validationErrors, $validationErrors);

        if(isset($this->User->validationErrors['email'])) {
            $this->User->validationErrors['soton_username'] = $this->User->validationErrors['email'];
        }

        //debug($this->request->validationErrors);exit;
        $this->Session->setFlash('There were errors with the form.');
    }
}

soton_usernamepassword_confirm 字段实际上并不是数据库的一部分,但仍需要验证。

我的 User 模型确实有一个 $validate 变量,Form 确实可以识别它,因为它将 required="required" 插入到正确的位置。

任何帮助将不胜感激。

【问题讨论】:

    标签: php html forms validation cakephp


    【解决方案1】:

    好的,我找到了问题的答案。

    我的 AppController 类中的以下函数是罪魁祸首:

    public function beforeRender() {
        $user_id = $this->Auth->user('id');
        $user = $this->User->read(null, $user_id);
        $this->set('user', $user);
    }
    

    由于某种原因,调用$this-&gt;Model-&gt;read() 函数可以防止显示验证错误,并且该函数在每个操作结束时都会调用它。将其移至 beforeFilter() 函数可解决问题。

    【讨论】:

    • 谢谢,这解决了我的问题。顺便说一句,您可以在视图中使用 AuthComponent::user(),因此在 beforeFilter() 中不需要该代码
    • 8 个月后也解决了我的问题。谢谢!
    【解决方案2】:

    这是我的答案,因为我没有调用 User->read():

    我挖掘了 cake 的核心,发现错误字段是根据 form->create('model') 传递的模型名称自动填充的。

    我的模型是“用户”,在我看来,我有 $this->form->create('Users')。注意's'。 验证是在模型上完成的,因此验证错误数组由模型名称索引:'User'。该表单使用在 create 中传递的名称“Users”来搜索错误。

    要解决此问题,请确保在 form->create() 中使用模型的单数形式。对我来说,这就是“用户”。

    【讨论】:

    • 我不得不发布这个,因为我在互联网上只能找到人们谈论调用 read()。希望这对某人有所帮助。
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2018-04-19
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2019-06-11
    相关资源
    最近更新 更多