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

Validation 如何在CakePHP表单验证失败时保留URL参数,validation,cakephp,Validation,Cakephp,我是cakephp新手,试图用它编写一个简单的应用程序,但是我遇到了一些表单验证问题 我有一个名为“Person”的模型,它有许多“PersonSkill”对象。要向某人添加“PersonSkill”,我将其设置为调用如下url: function add() { if (!empty($this->data)) { if ($this->PersonSkill->save($this->data)) {

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

我有一个名为“Person”的模型,它有许多“PersonSkill”对象。要向某人添加“PersonSkill”,我将其设置为调用如下url:

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());        
    }
}   
echo $form->create('PersonSkill', array('url' => $this->params['named']));

我一直在传递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());        
    }
}   
echo $form->create('PersonSkill', array('url' => $this->params['named']));
在我的person\u skill add.ctp中,我设置了一个隐藏字段,用于保存person\u id,例如:

echo $form->input('person_id', array('type'=>'hidden','value'=>$person['Person']['id']));
当表单验证失败时,有没有一种方法可以持久化person_id url参数,或者有没有一种更好的方法可以做到这一点,而我完全没有找到


任何建议都将不胜感激。

您可以手动验证数据,然后使用自己的重定向参数保留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 ) );
  }
 }
}
在控制器中的验证手册中,FormHelper::create()方法允许您在创建的表单标记的action属性中配置URL

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

试着这样做:

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());        
    }
}   
echo $form->create('PersonSkill', array('url' => $this->params['named']));
CakePHP应该将命名的参数,即数组('person_id'=>3)与当前控制器和操作合并,并返回与当前控制器和操作相同的URL

顺便说一下,如果$this->data不为空,您还希望读取人员详细信息并将其设置为在视图中可用,因此我将丢失控制器中的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());        
}   

谢谢-这正是我需要的!即使更整洁,如果参数已经存在,它也不会复制参数。很好的解决方案。