1

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

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

以下是一些场景:
一:用户为所有输入输入有效条目
一切正常,表单发布和数据被添加到数据库中。

二:用户为除电子邮件输入之外的所有输入输入有效条目,但随后在所有输入中输入有效电子邮件
假设用户仅在为前三个字段提供输入后点击提交,
在他们第一次输入有效的电子邮件地址后一切正常,表单帖子和数据被添加到数据库中。

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

这是我的模型:

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.');
            }
        }
    }
    }

对于这么简单/烦人的问题,我为这么长的帖子道歉,但我讨厌在我的应用程序/网站中有这样的东西。

谢谢你。

4

1 回答 1

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”验证。验证主键是没有意义的。

于 2013-04-09T11:49:57.560 回答