使用CakePHP$validate数组显示自定义验证消息
我试图使用模型中的$validate数组显示自定义消息,如“此字段不应为空”或“name not null”。我有两个控制器,主控制器和用户控制器 主控制器的索引文件具有登录和注册视图。登录和注册功能的操作部分位于用户控制器中。如果登录和注册功能有效,它们将重定向到主控制器的主页,否则它们将保留在索引页本身中 我希望验证消息显示在索引页本身中。但只有当登录和注册有单独的视图文件时,这些消息才会出现,即存在/views/forms/register.ctp和/views/forms/login.ctp 是否有一种方法可以显示这些验证消息,而无需为这些函数提供单独的视图文件?我已经在下面给出了我的密码。请有人给我指路 模型类:使用CakePHP$validate数组显示自定义验证消息,cakephp,validation,Cakephp,Validation,我试图使用模型中的$validate数组显示自定义消息,如“此字段不应为空”或“name not null”。我有两个控制器,主控制器和用户控制器 主控制器的索引文件具有登录和注册视图。登录和注册功能的操作部分位于用户控制器中。如果登录和注册功能有效,它们将重定向到主控制器的主页,否则它们将保留在索引页本身中 我希望验证消息显示在索引页本身中。但只有当登录和注册有单独的视图文件时,这些消息才会出现,即存在/views/forms/register.ctp和/views/forms/login.c
<?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>
登记
登录
我认为你做得不对。你在模型中做的太多了,事实发生后,你在控制器中也做了几乎相同的事情。那不好。总的来说,老实说,对于这么简单的东西,代码是相当混乱的
一个巨大的WTF标志会在此处弹出:
$existingUsers= $this->find('all');
foreach($existingUsers as $existingUser):
if($this->data['User']['email_id']==$existingUser['User']['email_id']){
你是在认真地从数据库中检索所有用户(这可能是一项非常昂贵的任务),然后逐个检查它们以比较单个字段您可以简单地定义一个验证规则,说明
'email\u id'
应该是唯一的,并且如果'email\u id'
已经存在,Cake将自动询问数据库
关于您的具体问题:您在同一页面上有两个相同的表单字段,password
和email\u id
字段用于相同的用户
型号。Cake无法知道这两个字段的哪个实例应该得到错误消息,它们都有相同的名称。另外,我认为您不想对登录表单使用验证错误消息,您只想查看登录是否成功。使用Session::flash()
显示登录失败的错误消息,它不是特定于字段的
将login
和register
方法从您的模型中删除,它们不属于您的模型。仅为模型中的电子邮件、名称和密码字段指定正确的验证规则,在控制器中调用$this->User->save()
时将自动检查这些字段
不要手工验证任何东西,除非确实无法使用蛋糕验证规则(这里不是这种情况)。如果内置的验证规则不能满足您的需要,您甚至可以创建自定义规则
注:组件不适用于模型。我认为在继续之前,你需要了解更多关于蛋糕的基本知识:我认为你做得不对。你在模型中做的太多了,事实发生后,你在控制器中也做了几乎相同的事情。那不好。总的来说,老实说,对于这么简单的东西,代码是相当混乱的 一个巨大的WTF标志会在此处弹出:
$existingUsers= $this->find('all');
foreach($existingUsers as $existingUser):
if($this->data['User']['email_id']==$existingUser['User']['email_id']){
你是在认真地从数据库中检索所有用户(这可能是一项非常昂贵的任务),然后逐个检查它们以比较单个字段您可以简单地定义一个验证规则,说明
'email\u id'
应该是唯一的,并且如果'email\u id'
已经存在,Cake将自动询问数据库
关于您的具体问题:您在同一页面上有两个相同的表单字段,password
和email\u id
字段用于相同的用户
型号。Cake无法知道这两个字段的哪个实例应该得到错误消息,它们都有相同的名称。另外,我认为您不想对登录表单使用验证错误消息,您只想查看登录是否成功。使用Session::flash()
显示登录失败的错误消息,它不是特定于字段的
将login
和register
方法从您的模型中删除,它们不属于您的模型。仅为模型中的电子邮件、名称和密码字段指定正确的验证规则,在控制器中调用$this->User->save()
时将自动检查这些字段
不要手工验证任何东西,除非确实无法使用蛋糕验证规则(这里不是这种情况)。如果内置的验证规则不能满足您的需要,您甚至可以创建自定义规则
注:组件不适用于模型。我认为在继续之前,您需要进一步了解Cake的基本知识:但是,如果您想查看来自验证数组的错误消息,您应该访问$this->modelName->invalidFields(),它将返回未通过验证的字段以及您为它们设置的消息 但是,如果您想查看来自验证数组的错误消息,您应该访问$this->modelName->invalidFields(),它将返回未通过验证的字段以及为它们设置的消息 好的,我会像你提到的那样进行更改,但是我确实希望在登录页面中显示特定的验证错误。正如我所说的,如果在同一页面上有两次基本相同的表单,那么自动生成错误消息将遇到问题。我还要重复一次,我认为登录表单是不必要的。话虽如此,如果你分开你的表单,你可以使用这里描述的方法:好的,我会做你提到的更改,但是我确实希望在登录页面中显示特定的验证错误。正如我所说,如果你有两次基本相同的表单