我是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参数,或者有更好的方法来完成这个我完全缺失?
非常感谢任何建议。
答案 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
中控制器的验证手册