2013-04-09 70 views
1

我的表单验证有一个奇怪的问题。我在表格中有4个输入,他们都被验证。cakephp中的表单验证问题

一切正常,直到它验证我的最后一个输入字段是一个电子邮件输入字段。我在电子邮件输入字段中设置了两个规则'rule' => 'notEmpty''rule' => 'email'。表单验证并发布时很好,因为它只需检查notEmpty规则,但如果找到无效的电子邮件,它会验证它,但即使在输入有效的电子邮件后也不会发布。

这里是一些假设:
一:所有输入用户输入有效的条目
一切工作正常,表单职位和将数据添加到数据库中。

二:为所有,但email输入用户输入有效的条目,但随后进入在所有输入
一个有效的电子邮件假设用户点击仅前三场
一切工作提供意见后提交在他们首先输入一个有效的电子邮件地址后,表格帖子和数据被添加到数据库中。

三:所有除了电子邮件用户输入有效条目(提供了一个无效的电子邮件)
它显示错误消息,但即使提供了一个有效的电子邮件地址后,它不会做任何事情。我注意到,如果您不断点击提交按钮,页面会继续使用相同的数据重新加载。
此外,该错误信息消失,如果提交按钮的第一次点击

这里后,再次点击是我的模型:

class Member extends AppModel 
{ 
    public $validate = array(
     'id' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_First_Name' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_Last_Name' => array(
      'rule' => 'notEmpty' 
      ), 
     'Student_Email' => array(
      'emailRule-1' => array(
       'rule' => 'notEmpty', 
       'last' => false 
       ), 
      'emailRule-2' => array(
       'rule' => 'email', 
       'message' => 'Please enter a valid email address.' 
      )) 
     ); 

} 

这里是控制器:

class MembersController extends AppController 
{ 
    ... 
    public function add() 
    { 
     if($this->request->is('post')) 
     { 
      $this->Member->create(); 

      if($this->Member->save($this->request->data)) 
      { 
       $this->Session->setFlash('Member has been added!'); 
       $this->redirect(array('action' => 'members')); 
      } 
      else 
      { 
       $this->Session->setFlash('Unable to add member.'); 
      } 
     } 
    } 
    } 

对于这样一个简单/烦恼问题的长篇帖子,我表示歉意,但我讨厌在我的应用程序/网站上有这样的东西。

谢谢。

+0

你为什么使用''last'=> false'?对我来说没有意义..如果一个人没有输入任何电子邮件,就没有必要检查一个有效的电子邮件形式...... – mark 2013-04-09 11:48:13

+0

是它的不必要的,我只是查阅文档,并尝试不同的东西。 – Archon 2013-04-09 12:04:29

回答

0

您的表单很可能是另一种形式的帖子:put。

快速的解释是:

POST is simulated by FormHelper for 'create' form, or any post form that isn't modifying an existing record. 

PUT is for updating existing records. 

http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::create

你添加动作计为 “创造”。顺便说一句:蛋糕代码表明它实际上应该是一个POST(见下面的评论)。因此,在代码中的某处,您可以使帮助程序将其从POST更改为PUT。也许你正在做一些非常规的事情。

提示:如果你想成为安全起见,检查两个:

if ($this->request->is('post') || $this->request->is('put')) {} 

,以确保这两种文章类型都有效。

也尝试遵守惯例并使用lower_case_underscored字段名称。最后但并非最不重要的是放弃“ID”验证。验证主键是毫无意义的。

+0

太棒了!那就是诀窍......我感觉很蠢。花了几个小时。一般而言,对框架和Web开发不熟悉,我熟悉POST和GET请求。无论如何,真的很感谢帮助! – Archon 2013-04-09 12:07:16

+0

不正确。创建新记录是POST,编辑记录是PUT。它在[手册](http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::create)中说明,并且由烘焙[template](https:// github.com/cakephp/cakephp/blob/master/lib/Cake/Console/Templates/default/actions/controller_actions.ctp#L54)代码。 – ADmad 2013-04-09 13:05:14

+0

@Archon为什么你的id字段有一个notEmpty验证?创建新记录时它将为空。 – ADmad 2013-04-09 13:08:07