我有一个编辑页面,用于编辑博客帖子。这是控制器动作......
public function edit($id = null) {
$post = $this->Post->findById($id);
if(!$post) {
throw new NotFoundException('Post not found');
}
if($this->request->is('post')) {
$this->Post->id = $id;
if($this->Post->save($this->request->data)) {
$this->Session->setFlash('Post updated!');
$this->redirect('/');
} else {
$this->Session->setFlash('Unable to update post!');
}
}
if (!$this->request->data) {
$this->request->data = $post;
}
$this->set('tags', $this->Post->Tag->find('list'));
$this->set('pageTitle', 'Edit blog post');
}
编辑页面视图......
<h1>Edit blog post</h1>
<?php echo $this->Form->create('Post'); ?>
<?php echo $this->Form->input('Post.title'); ?>
<?php echo $this->Form->input('Post.body'); ?>
<?php echo $this->Form->input('Tag.Tag', array('type' => 'text', 'label' => 'Tags (seperated by space)', 'value' => $tags)); ?>
<?php echo $this->Form->input('Post.slug'); ?>
<?php echo $this->Form->end('Save Changes'); ?>
出于某种原因,当我进行更改并单击“保存更改”时,页面只会刷新,虽然更新会在刷新后反映在表单中,但我必须再次单击“保存更改”才能将其保存到数据库和Cake将我重定向到/
。
可能导致什么?
答案 0 :(得分:1)
由于表单中没有Post.id
,CakePHP会发送PUT
请求(而不是POST
请求)以在您的数据库中创建(或“put”)新行第一次。这不会通过您的请求检查:
if($this->request->is('post'))
现在,此时您的逻辑将使用以下代码获取相应帖子的整行:
$this->request->data = $post;
这将包含给定帖子的ID,因为它在您的find()
结果中,因此第二次提交时,它有一个ID,因此发送POST
请求而不是{ {1}}请求。
假设您只想编辑现有帖子,请在表单中添加PUT
字段(FormHelper automagic应该为其创建隐藏字段,但您始终可以明确告诉它,如下例所示):
id
这应该传递ID,从而触发echo $this->Form->input('Post.id', array('type' => 'hidden');
请求而不是POST
请求,并立即传递您的提交。