Php 编辑页面必须提交两次才能保存更改
我设置了一个编辑页面来编辑博客文章。这是控制器的动作Php 编辑页面必须提交两次才能保存更改,php,forms,cakephp,Php,Forms,Cakephp,我设置了一个编辑页面来编辑博客文章。这是控制器的动作 public function edit($id = null) { $post = $this->Post->findById($id); if(!$post) { throw new NotFoundException('Post not found'); } if($this->request->is('post')) { $this->P
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将我重定向到/
是什么原因造成的?因为表单中没有
Post.id
,CakePHP第一次发送PUT
请求(而不是Post
请求)在数据库中创建(或“放置”)新行。这未通过您的请求检查:
if($this->request->is('post'))
现在,您的逻辑将获得相应post的整行,代码如下:
$this->request->data = $post;
这将包括给定帖子的ID,因为它在您的find()
结果中,因此在您第二次提交它时,它有一个ID,因此发送一个post
请求,而不是PUT
请求
假设您只想编辑现有的帖子,请在表单中添加一个id
字段(FormHelper automagic应该为其创建一个隐藏字段,但您可以始终明确地告诉它,如以下示例所示):
这应该传递id,从而触发
POST
请求,而不是PUT
请求,并立即使您的提交通过。因为表单中没有POST.id
,CakePHP发送PUT
请求(而不是POST
请求)来创建(或“PUT”)第一次将新行插入数据库。这未通过您的请求检查:
if($this->request->is('post'))
现在,您的逻辑将获得相应post的整行,代码如下:
$this->request->data = $post;
这将包括给定帖子的ID,因为它在您的find()
结果中,因此在您第二次提交它时,它有一个ID,因此发送一个post
请求,而不是PUT
请求
假设您只想编辑现有的帖子,请在表单中添加一个id
字段(FormHelper automagic应该为其创建一个隐藏字段,但您可以始终明确地告诉它,如以下示例所示):
这将传递id,从而触发一个
POST
请求,而不是PUT
请求,并立即使您的提交通过。回答得非常好,我现在明白了原因,谢谢。但是,当我将帖子ID添加到edit.ctp
视图并重试时,当我单击“保存更改”时,页面只会刷新。无论我点击了多少次,都不会对数据库进行任何更改。@JamesDawson尝试var_dump
查看视图中的$this->request->data
,看看它是否有id。否则,您需要手动将其传递给视图,以便Cake知道要更新的ID。它现在听起来像是空的/未设置的。为了修复它,Cake发送了一个PUT
请求,而不是POST
,即使给了ID。所以我不得不做if($this->request->is('PUT')){…
。这是否意味着发送PUT
?据我所知,蛋糕通常是以POST
的方式来做的。不管怎样,我已经接受了你的回答。再次感谢:)@JamesDawson不,默认操作应该是POST
,所以我不确定为什么它会改为PUT
。当您使用$this->form->create('POST',array('type'='POST')创建表单时,还可以将type
属性显式设置为POST
代码>。回答得很好,我现在明白为什么了,谢谢。但是,当我将帖子ID添加到edit.ctp
视图并重试时,当我单击“保存更改”时,页面只会刷新。无论我点击了多少次,都不会对数据库进行任何更改。@JamesDawson尝试var_dump
查看视图中的$this->request->data
,看看它是否有id。否则,您需要手动将其传递给视图,以便Cake知道要更新的ID。它现在听起来像是空的/未设置的。为了修复它,Cake发送了一个PUT
请求,而不是POST
,即使给了ID。所以我不得不做if($this->request->is('PUT')){…
。这是否意味着发送PUT
?据我所知,蛋糕通常是以POST
的方式来做的。不管怎样,我已经接受了你的回答。再次感谢:)@JamesDawson不,默认操作应该是POST
,所以我不确定为什么它会改为PUT
。当您使用$this->form->create('POST',array('type'='POST')创建表单时,还可以将type
属性显式设置为POST
代码>。