【问题标题】:Display custom validation messages using CakePHP $validate array使用 CakePHP $validate 数组显示自定义验证消息
【发布时间】:2009-08-06 10:26:42
【问题描述】:

我正在尝试使用模型中的 $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>

【问题讨论】:

    标签: cakephp validation


    【解决方案1】:

    我认为你的做法是错误的。你在模型中做的太多了,而且事后你也在控制器中做几乎同样的事情。这不好。总的来说,老实说,对于这么简单的事情,代码是相当混乱的。

    一个巨大的WTF标志在这里弹出:

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

    您正在认真地从数据库中检索 所有 用户(可能是一项非常昂贵的任务),然后逐个检查它们以比较单个字段?!
    您可以简单地定义一个验证规则,说明'email_id' 应该是唯一的,如果'email_id' 已经存在,Cake 会自动询问数据库http://book.cakephp.org/view/472/isUnique

    关于您的具体问题:您在同一页面上有两次相同的表单字段,passwordemail_id 字段用于相同的 User 模型。 Cake 无法知道这两个字段的哪个实例应该得到错误消息,它们都具有相同的名称。另外,我认为您不想对登录表单使用验证错误消息,您只想查看登录是否成功。使用Session::flash() 代替显示登录失败的错误消息,它不是特定于字段的。

    从您的模型中取出 loginregister 方法,它们不属于那里。只需为模型中的电子邮件、姓名和密码字段指定适当的验证规则,它们将在控制器中调用$this-&gt;User-&gt;save() 时自动检查。

    不要手动验证任何东西,除非用 Cake 验证规则确实无法做到这一点(这里不是这种情况)。如果内置的验证规则不能满足您的需求,您甚至可以制定自定义规则。 http://book.cakephp.org/view/150/Custom-Validation-Rules

    PS:组件不适用于模型。我认为您需要在继续之前了解更多关于 Cake 的基础知识:http://book.cakephp.org/view/218/Tutorials-Examples

    【讨论】:

    • 好的,我会按照您所说的进行更改,但我确实希望在登录页面中显示特定的验证错误。
    • 正如我所说,如果您在同一页面上两次使用基本相同的表单,您将遇到自动生成错误消息的问题。还让我重复一遍,我认为登录表单没有必要。话虽如此,如果您将表单分开,则可以使用此处描述的方法:book.cakephp.org/view/410/Validating-Data-from-the-Controller
    【解决方案2】:

    但是,如果您想查看来自 validate 数组的错误消息,您应该访问 $this->modelName->invalidFields() 它将返回未通过验证的字段和消息你已经为他们设置了......

    【讨论】:

    • 或 $this->modelName->validationErrors
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2019-02-22
    相关资源
    最近更新 更多