2012-07-05 26 views
2

我有以下情況。 帖子的hasMany評論CakePHP 2.1:以平穩的方式驗證元素的表單?

評論通過belongsTo帖子

在我/瀏覽/職位/視圖,我展示了郵政與它的評論。另外,每個帖子都應該顯示評論表單。因此,我必須使用元素add_comment.ctp來查看(請糾正我,如果我錯了,但請參閱this question here)。

/Views/Posts/view.ctp:

// add comments 
echo $this -> element('add_comment',array('post_id' => $entry['Post']['id']), array('cache' => array('config' => 'long'))); 

元素:

/** 
* Element for adding comments 
* 
*/ 
echo $this -> Form -> create('Comment', array('url' => array(
     'controller' => 'comments', 
     'action' => 'add', 
     $post_id 
    ))); 
?> 
    <fieldset> 
     <legend><?php echo 'Add Comment'; ?></legend> 
    <?php 
    echo $this -> Form -> input('author_name'); 
    echo $this -> Form -> input('author_email', array('type' => 'email required')); 
    echo $this -> Form -> input('author_website'); 
    //echo $this->Form->input('date_published'); 
    echo $this -> Form -> input('text'); 
    //echo $this->Form->input('is_archived'); 
    ?> 
    </fieldset> 
<?php echo $this -> Form -> end(array('label' => 'Post!')); ?> 

正如你可以看到,表單被提交到CommentsController的附加動作。 現在,一個大問題:添加動作如何將驗證結果等數據實際傳遞迴表單?我的意思是,表格數據也應該被保留下來,所以如果有人輸入無效數據,它不會丟失。

通常情況下,添加動作會渲染/查看/評論/添加,但我不需要這個視圖,我甚至沒有定義一個。

到目前爲止,我已經使用$ this-> redirect在評論保存之後返回到/ Views/Posts/view - 但只是調用/ Views/Posts/view而不傳遞任何東西。那麼,如何才能使用Elements與Smooth和Automagic表單處理結合使用呢?

回答

1

我認爲如果您在提交後重定向,它將失去任何基本上觸發驗證錯誤的$this->invalidFields()等。有一對夫婦的解決這個辦法....

:你可以不重定向在你comments/add.ctp視圖再次呈現形式,所以形式將驗證錯誤自動顯示。然後,一旦保存成功並且驗證通過,再次使流程平滑重定向回您的文章(您應該有Post ID)。

:您也可以將評論保存邏輯放入評論模型中,然後在您的發佈視圖操作中檢查評論POST(更新表單以指向此操作)並調用您在其中創建的保存功能$this->Post->Comment->saveMethodDefinedInModel($this->request->data['Post']);

3:或....你可以選擇一個,並將它與ajax結合起來,這將是相當粗糙。

+0

感謝您的回答!爲了澄清,通過編號1,您的意思是,評論/ add.ctp將在驗證後呈現,而不顯示帖子?即,僅用於添加評論的新視圖?如果是的話,這不是最佳的解決方案,但考慮到2號顯然打破了MVC模式,可能是最容易實現的,對嗎? – wnstnsmth 2012-07-06 10:10:04

+1

是的,您可以在第一個地方顯示添加評論表單,但在同一個地方處理數據。 #2不一定會破壞MVC模式,只是你會在後控制器中添加一些註釋邏輯,看起來有點奇怪 – Dunhamzzz 2012-07-06 10:24:25

+0

你是否設法以可接受的方式解決這個問題?我有同樣的問題。 – Cos 2012-09-23 14:07:13