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