CakePHP - 在单独的视图元素中错误处理表单

时间:2013-09-27 14:02:29

标签: php forms cakephp

刚开始玩CakePHP,如果这是一个简单的问题,请耐心等待。

我正在使用CakePHP 2.4.0,我希望在多个视图中重用特定的表单。因此,我将此表单添加到view-element并在每个视图中包含此元素。

这是element.ctp文件:

<?php

echo $this->Form->create('Lead', array('type' => 'post',
                                       'url'  => array('controller' => 'Lead', 'action' => 'index'),
                                       'novalidate'   => true));

echo $this->Form->input('name', array('label' => 'Achternaam'));
echo $this->Form->input('email', array('label' => 'Email'));
echo $this->Form->input('phone', array('label' => 'Telefoon'));
echo $this->Form->submit('submit', array('name'  => 'submit'));    
?>

此元素以下列方式包含在多个视图中:

这是home.ctp(视图)文件:

<?php echo $this->element('element'); ?>

这是从表单接收post操作的LeadController.php文件:

<?php
class LeadController extends AppController{

    public function index(){
        $this->autoRender = false;
        if(!empty($_POST))
           $this->Lead->save($this->request->data);
        $this->redirect('/Pages/home');
    }
}
?>

这是引发所有验证检查的Lead.php文件。

class Lead extends AppModel{

public $useTable = 'Leads';

public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'required' => true,
            'message' => 'need email'
        ),
        'validEmailRule' => array(
            'rule' => array('email'),
            'required' => true,
            'message' => 'invalid emial'
        )
    ),
    'name' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'required' => true,
            'message' => 'need name'
        )
    ),....

当view-element中的表单完全有效时,表单中的数据将成功添加到数据库中。但是当表单无效时,错误不会返回到视图中。如果我在LeadController中将以下内容写入日志文件,而不是显示它们。

$this->Lead->invalidFields();

如果我将LeadController / index中的代码添加到PagesController / home并更改表单提交URL,则错误会显示在每个表单元素的视图中。

当表单放在一个单独的视图元素中并在多个页面中重复使用时,您需要做什么才能在每个表单元素的视图中显示表单中的错误?

这可能与我使用重定向的事实有关,但我认为它们比在会话中临时保存错误更好。

1 个答案:

答案 0 :(得分:1)

  

这可能与我使用的事实有关   重定向...

实际上,您完全使用重定向这一事实。通过重定向,您将失去验证错误。

有很多方法可以解决这个问题,因为你的想象力可以想到(并且每个方法都有自己的优点,具体取决于你的情况),但它已经在网上被广泛询问/回答:

CakePHP preserving validation errors after redirecting

http://bakery.cakephp.org/articles/binarycrafts/2010/01/20/persistentvalidation-keeping-your-validation-data-after-redirects-2

CakePHP: Keep validation data upon redirect

https://groups.google.com/forum/#!topic/cake-php/NsfckwSfY5c