为什么CakePHP中没有显示验证错误?

时间:2009-06-29 08:26:08

标签: validation cakephp

我正在尝试在登录页面中为名称,电子邮件和密码字段执行验证。如果输入验证失败,则应显示错误消息。

但是在这里,当我填写详细信息并提交时,它会被重定向到下一页。只有值不会保存在数据库中。

为什么不显示消息?

这是我的模特:

class User extends AppModel {
    var $name = 'User';
        var $validate = array(
            'name' => array(
            'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'message' => 'Alphabets and numbers only'
            ),
            'between' => array(
                'rule' => array('between', 5, 15),
                'message' => 'Between 5 to 15 characters'
            )
        ),
            'password' => array(
            'rule' => array('minLength', '8'),
            'message' => 'Mimimum 8 characters long'
        ),
        'email_id' => 'email'
    );

    function loginUser($data) {
        $this->data['User']['email_id'] = $data['User']['email_id'];    
        $this->data['User']['password'] = $data['User']['password'];            

        $login = $this->find('all');
        foreach ($login as $form):
            if ($this->data['User']['email_id'] == $form['User']['email_id'] && $this->data['User']['password'] == $form['User']['password']) {
                $this->data['User']['id'] = $this->find('all',
                    array(
                        'fields' => array('User.id'),
                        'conditions' => array(
                            'User.email_id' => $this->data['User']['email_id'],
                            'User.password'=>$this->data['User']['password']
                        )       
                    )
                );
                $userId=$this->data['User']['id'][0]['User']['id'];
                return $userId;
            }
    endforeach;
    }

    function registerUser($data) {
        if (!empty($data)) {
            $this->data['User']['name'] = $data['User']['name'];
            $this->data['User']['email_id'] = $data['User']['email_id'];    
            $this->data['User']['password'] = $data['User']['password'];
            if($this->save($this->data)) {
                $this->data['User']['id']= $this->find('all', array(
                    'fields' => array('User.id'),
                    'order' => 'User.id DESC'       
                ));
                $userId=$this->data['User']['id'][0]['User']['id'];
                return $userId;
            }
        }
    }
}

这是我的控制者:

class UsersController extends AppController {
    var $name = 'Users';
    var $uses=array('Form','User','Attribute','Result');
    var $helpers=array('Html','Ajax','Javascript','Form');

    function login() {  
        $userId = $this->User->loginUser($this->data);
        if($userId>0) {
            $this->Session->setFlash('Login Successful.');
            $this->redirect('/forms/homepage/'.$userId);
            break;
        } else {
            $this->flash('Login Unsuccessful.','/forms');
        }
}

    function register() {   
        $userId=$this->User->registerUser($this->data);  
        $this->Session->setFlash('You have been registered.');
        $this->redirect('/forms/homepage/'.$userId);                        
    }      
}

修改

为什么在密码字段中少于8个字符时,不会显示消息,例如“最少8个字符长”?

 <!--My view file File: /app/views/forms/index.ctp   -->
 <?php 
echo $javascript->link('prototype.js');
echo $javascript->link('scriptaculous.js');
echo $html->css('main.css');
?>

  <div id="appTitle"> 
  <h2> formBuildr </h2>
  </div>

  <div id="register">
  <h3>Register</h3>
  <?php
echo $form->create('User',array('action'=>'register'));
echo $form->input('User.name');
echo $form->error('User.name','Name not found');
echo $form->input('User.email_id');
echo $form->error('User.email_id','Email does not match');
echo $form->input('User.password');
echo $form->end('Register');
  ?>
  </div>

  <div id="login">
  <h3>Login</h3>
  <?php
echo $form->create('User',array('action'=>'login'));
echo $form->input('User.email_id');
echo $form->input('User.password');
echo $form->end('Login');
  ?>
  </div>

2 个答案:

答案 0 :(得分:0)

您的验证似乎正确

如何尝试以下内容:

  1. 确保将$ form-&gt; create设置为相应的函数
  2. 确保在发出Model-&gt; save();
  3. 之前没有$ this-&gt; Model-&gt; read()

    修改

    你有以下内容吗?:

    function register()
    {
       //do not put any $this->User->read or find() here or before saving pls.
       if ($this->User->save($this->data))
       {
           //...
       }
    }
    

    <强> EDIT2

    如果您在保存模型之前正在执行read()或find(),那么将重置字段。您应该在表单中将变量作为type = hidden传递。我希望我有意义。

    <强> EDIT3

    我认为您需要将registerUser()移动到控制器中,因为在模型中使用该函数不会为您提供错误的返回。即使它有验证错误,它也总是如此。

答案 1 :(得分:0)

注释掉重定向行并在config / core.php中将调试设置为2。然后查看正在生成的sql以查看您的插入是否正常工作。如果未显示错误,可能在视图中,您使用的是$ form-&gt; text或$ form-&gt; select而不是$ form-&gt;输入函数。只有$ form-&gt;输入函数才会自动显示错误消息。