2009-06-29 34 views
0

我正在尝试在名称,电子邮件和密码字段的登录页面中执行验证。如果输入未通过验证,则应显示错误消息。为什么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);       
    }  
} 

EDIT

为什么该消息,例如, “最小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> 
+0

你在控制器中做什么?请张贴该代码。 – deceze 2009-06-29 08:48:23

+0

在模型中的registerUser函数中,为什么要做一个find('all')?你应该使用find('first')。否则,您将获得用户表中的所有用户ID。 – jimiyash 2009-06-30 01:19:03

+0

你可以发布你的观点吗? – 2009-07-01 07:50:50

回答

0

您的验证似乎是正确的

如何尝试以下操作:

  1. 确保选中设置你的$形式 - >创建到相应的功能
  2. 确保没有$此 - > Model-> read(),然后发出Model-> save();

编辑

你有以下?:

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()到您的控制器,因为其在模型中的功能不会向您提供虚假的回报。即使它有验证错误,它总是会是真的。

+0

是的,我有.. – Angeline 2009-06-29 09:18:54

+0

不,实际上我保存在表中的条目,然后只获取保存条目的Id。在保存之前,我没有阅读()或find()。 – Angeline 2009-06-29 09:32:40

+0

是的,我注意到了。尝试移出控制器中的保存程序? – drikoda 2009-06-29 09:35:05

0

注释掉重定向行并在config/core.php中将debug设置为2。然后看看正在生成的SQL,看看你的插入是否工作。如果错误没有显示,可能在视图中,您使用$ form-> text或$ form-> select而不是$ form->输入函数。只有$ form->输入函数会自动显示错误信息。

+0

如果一切都失败有时,最好是刚开始在重新也许看别人在做什么。注册非常普遍,我相信你可以在网上找到一个cakephp注册教程。 – jimiyash 2009-06-30 01:21:35

+0

好吧,我试过的代码是什么,出现了一些错误.. 有人能告诉我一个很好的教程吗? – Angeline 2009-07-01 04:40:42