1

ブログ投稿を編集するための編集ページを設定しました。これがコントローラーのアクションです...

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'); ?>

何らかの理由で変更を加えて[変更を保存]をクリックすると、ページが更新され、更新後に変更がフォームに反映されますが、データベースに保存するには、もう一度[変更を保存]をクリックする必要があります。私をにリダイレクトするケーキ/

何が原因でしょうか?

4

1 に答える 1

1

フォームに何もないためPost.id、CakePHPはPUT(リクエストの代わりにPOST)リクエストを送信して、データベースに新しい行を最初に作成(または「配置」)します。これはリクエストチェックに合格しません:

if($this->request->is('post'))

この時点で、ロジックは対応する投稿の行全体を次のコードで取得します。

$this->request->data = $post;

これには、指定された投稿のIDが含まれます。これは、find()結果に含まれているため、2回目に送信するときに、IDがあり、POSTリクエストではなくリクエストを送信するためですPUT

既存の投稿のみを編集する場合は、フォームにフィールドを追加idします(FormHelper automagicはそのフィールドを非表示にする必要がありますが、以下の例のように、いつでも明示的に指示できます)。

echo $this->Form->input('Post.id', array('type' => 'hidden');

これはIDを渡す必要があるため、POSTリクエストではなくリクエストPUTをトリガーして、送信を一度にパスします。

于 2013-01-09T20:50:30.323 に答える