2009-08-06 144 views
0

我试图使用模型中的$ validate数组显示自定义消息,如'此字段不应为空'或'名称不为空'。我有两个控制器,主要和用户。

主控制器的索引文件具有登录和注册视图。登录和注册功能的动作部分位于user_controller中。如果登录和注册功能有效,它们将被重定向到主控制器的主页,否则它们将保留在索引页面本身中。

我想验证消息显示在索引页面本身。但是这些消息仅在存在用于登录和注册的单独视图文件时出现,即/views/forms/register.ctp和/views/forms/login.ctp存在。

有没有一种方法来显示这些验证消息,而没有这些功能的单独的视图文件?我在下面给出了我的代码。有人请指导我。

模型类:

<?php 
class User extends AppModel { 
    var $name = 'User'; 
var $components=array('Auth'); 

    var $validate = array(
    'name' => array(
     'rule' => 'notEmpty', 
      'message' =>'Name cannot be null.' 
    ), 
    'password' => array(
     'rule' => 'notEmpty' 
    ), 
    'email_id' => array(
     'rule' => 'notEmpty' 
    ) 
); 

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']; 

     $existingUsers= $this->find('all'); 
     foreach($existingUsers as $existingUser): 
      if($this->data['User']['email_id']==$existingUser['User']['email_id']){ 
       return 0; 
      } 
      else{ 
       $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; 
      } 
     endforeach; 

    } 
} 

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; 
    } 
    } 
?> 

控制器类:

<?php 
class UsersController extends AppController 
{ 

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

function register() 
{ 

    $this->Session->write('userId',$this->User->registerUser($this->data)); 
    $this->User->data=$this->data; 
     if (!$this->User->validates()) 
     { 

       $this->Session->setFlash('Please enter valid inputs'); 
       $this->redirect('/main'); 
      return;  
     } 

     if($this->Session->read('userId')==0){ 

      $this->Session->setFlash('You are already a registerd member.Log in your account'); 
      $this->redirect('/main'); 
     } 
     else{ 
     $this->Session->setFlash('User account created'); 
     $this->redirect('/main/home'); 
     }  


    } 

function login() 
    { 

    //$userId=$this->User->loginUser($this->data); 
    $this->Session->write('userId',$this->User->loginUser($this->data)); 
    $this->User->data=$this->data; 

    if (!$this->User->validates()) 
     { 
       $this->Session->setFlash('Please enter valid inputs'); 
       $this->redirect('/main'); 
      return;  
     } 
    if($this->Session->read('userId')>0){ 
     $this->Session->setFlash('Login Successful'); 
     $this->redirect('/main/home'); 
     break;   
    } 
    else{ 
     $this->Session->setFlash('Username and password do not match.'); 
     $this->redirect('/main'); 

    }  
    } 
} 
?> 

视图模板:

<!-- File: /views/main/index.ctp--> 

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

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

回答

4

我想你会了解它的错误的方式。事实上,你在模型中做得太多了,而且你在控制器中也做了几乎相同的事情。这不好。总的来说,诚实地说,这些代码对于如此简单的事情来说相当混乱。

巨大WTF标志这里弹出:

$existingUsers= $this->find('all'); 
foreach($existingUsers as $existingUser): 
    if($this->data['User']['email_id']==$existingUser['User']['email_id']){ 

你认真地从数据库(一个潜在的巨大的昂贵的任务)检索所有用户,然后通过他们去逐一比较一个领域?!
您可以简单地定义一个验证规则,说明'email_id'应该是唯一的,并且Cake会自动询问数据库如果'email_id'已经存在。 http://book.cakephp.org/view/472/isUnique

关于您的具体问题:你有相同的表单域两次在同一个页面,password和同User模式email_id领域上。 Cake没办法知道两个字段的哪个实例应该得到错误信息,它们都有相同的名字。此外,我不认为你想使用验证错误消息的登录表单,你只是想看看登录是否成功。请改用Session::flash()来显示失败登录的错误消息,但它不是字段特定的。

采取loginregister方法你的模型,他们不属于那里。只需在模型中为电子邮件,名称和密码字段指定适当的验证规则,在控制器中调用$this->User->save()后,它们将自动进行检查。

不要用手验证什么,除非真的没有办法用蛋糕验证规则(不是这里的情况)来做到这一点。如果内置的验证规则不能满足您需要执行的操作,则甚至可以制定自定义规则。http://book.cakephp.org/view/150/Custom-Validation-Rules

PS:组件不适用于型号。我想你需要继续学习更多关于Cake的基础知识:http://book.cakephp.org/view/218/Tutorials-Examples

+0

好吧,我将按照您所述的方式进行更改,但我确实希望将特定验证错误显示在登录页面中。 – Angeline 2009-08-10 10:00:21

+0

正如我所说,如果您在同一页上有两次基本相同的表单,则会遇到自动生成错误消息的问题。另外让我重申一下,我认为登录表单是不必要的。话虽如此,如果你分开你的表单,你可以使用这里描述的方法:http://book.cakephp.org/view/410/Validating-Data-from-the-Controller – deceze 2009-08-10 11:52:04

0

但是,如果你想看到你的错误消息来自验证数组,你应该访问$ this-> modelName-> invalidFields()这将返回您未通过验证的字段以及您为其设置的消息...

+0

或$ this-> modelName-> validationErrors – Richard 2011-12-07 17:57:31