CakePHP表单验证失败时如何保留URL参数

时间:2010-03-17 12:09:12

标签: validation cakephp

我是cakephp的新手并试图用它编写一个简单的应用程序,但是我遇到了一些表单验证问题。

我有一个名为“Person”的模型,它有很多“PersonSkill”对象。要向某人添加“PersonSkill”,我已将其设置为调用这样的网址:

http://localhost/myapp/person_skills/add/person_id:3

我一直在通过person_id,因为我想显示我们为其添加技能的人的姓名。

我的问题是如果验证失败,则person_id参数不会持久保存到下一个请求,因此不会显示此人的姓名。

控制器上的add方法如下所示:

function add() {        
    if (!empty($this->data)) {          
        if ($this->PersonSkill->save($this->data)) {
            $this->Session->setFlash('Your person has been saved.');
            $this->redirect(array('action' => 'view', 'id' => $this->PersonSkill->id));
        }       
    } else {
        $this->Person->id = $this->params['named']['person_id'];
        $this->set('person', $this->Person->read());        
    }
}   

在我的person_skill add.ctp中我设置了一个隐藏字段,其中包含person_id,例如:

echo $form->input('person_id', array('type'=>'hidden','value'=>$person['Person']['id']));

有没有办法在表单验证失败时保留person_id url参数,或者有更好的方法来完成这个我完全缺失?

非常感谢任何建议。

2 个答案:

答案 0 :(得分:6)

FormHelper :: create()方法允许您在其创建的表单标记的action属性中配置URL。

您希望确保使用当前网址,以便发布到同一网址,如果验证失败,则person_id命名参数仍然存在。

尝试这样的事情:

echo $form->create('PersonSkill', array('url' => $this->params['named']));

CakePHP应该将命名参数,即数组('person_id'=> 3)与当前控制器和操作合并,并返回与您相同的URL。

顺便说一下,如果$ this->数据不为空,你还想阅读人员详细信息并在视图中设置它们,所以我在控制器中丢失了else语句,只有:

function add() {        
    if (!empty($this->data)) {          
        if ($this->PersonSkill->save($this->data)) {
            $this->Session->setFlash('Your person has been saved.');
            $this->redirect(array(
                'action' => 'view',
                'id' => $this->PersonSkill->id
            ));
        }       
    }
    $this->Person->id = $this->params['named']['person_id'];
    $this->set('person', $this->Person->read());        
}   

答案 1 :(得分:0)

您可以手动验证数据,然后使用您自己的重定向参数来保留URL参数。如,

if( !empty( $this->data ) ) {
 if( $this->PersonSkill->validates() ) {
  if( $this->PersonSkill->save( $this->data ) {
   ...
  }
  else { // invalid data
   $this->redirect( array( 'action' => 'view', 'id' => $this->PersonSkills->id ) );
  }
 }
}

来自http://book.cakephp.org/view/410/Validating-Data-from-the-Controller

中控制器的验证手册