CakePHP 2.3表单未显示验证错误

jam*_*nth 6 html php forms validation cakephp

我一直试图调试这个大约两天,并在互联网上阅读了这个问题的每一个答案......但仍然无法让它工作.

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

$this->User->validationErrors阵列被正确填充的视图被呈现之前,根据debug(),并且该模型不验证是由检测到的事实$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();
?>
Run Code Online (Sandbox Code Playgroud)

这是我的行动:

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.');
    }
}
Run Code Online (Sandbox Code Playgroud)

soton_usernamepassword_confirm领域实际上不是数据库的一部分,但仍需要进行验证.

我的用户模型确实有一个$validate变量,当Form插入required="required"到正确的位置时,Form会识别该变量.

任何帮助,将不胜感激.

jam*_*nth 5

好的,我已经找到了问题的答案.

我的AppController类中的以下函数是culrprit:

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

出于某种原因,调用该$this->Model->read()函数可以防止显示验证错误,并且此函数在每个操作结束时都在调用它.将其移动到该beforeFilter()功能可以解决问题.