2013-01-09 86 views
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'); ?> 

出於某種原因,當我做出改變,並點擊「保存修改」,頁面只是刷新,雖然在更新將反映在刷新後的表單中,我必須再次單擊「保存更改」才能將它們保存到數據庫,並讓Cake將我重定向到/

可能是什麼原因造成的?

回答

1

由於表單中沒有Post.id,所以CakePHP發送PUT請求(而不是POST請求),以在第一次創建(或「放入」)新行到數據庫中。這不通過你的請求覈查:

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

現在,在這一點上你的邏輯得到了整個排爲相應的崗位,與此代碼:

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

這將包括的標識因爲它在您的find()結果中,因此它第二次提交它,因此它有一個ID並因此發送POST請求而不是PUT請求。

假設你只需要編輯現有帖子,一個id字段添加到您的書(表單助手AUTOMAGIC應該做它的隱藏字段,但你總是可以明確地告訴它,就像在下面的例子):

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

這應該沿着ID傳遞,從而引發POST請求,而不是一個PUT請求,並讓你通過提交一次。

+0

真的很好的答案,我明白爲什麼現在,謝謝。但是,當我將帖子ID添加到'edit.ctp'視圖並再次嘗試時,當我單擊保存更改時,頁面只會刷新。無論我點擊多少數據庫都不會更改。 –

+0

@JamesDawson在你的視圖中嘗試'var_dump'這個'$ this-> request-> data',看看它是否真的有一個id。否則,您需要手動將它傳遞給您的視圖,以便Cake知道要更新的ID。這聽起來像是空的/現在沒有設置。 – Oldskool

+0

爲了解決這個問題,Cake發送了一個'PUT'請求,而不是'POST',即使給了一個ID。所以我必須做'if($ this-> request->是('put')){...}'。這是否意味着發送'PUT'?這是我的理解,Cake通常將其作爲「POST」來執行。無論如何,我已經接受你的答案。再次感謝:) –

相關問題