Forms CakePHP 2.1:以平滑的方式验证来自元素的表单?

Forms CakePHP 2.1:以平滑的方式验证来自元素的表单?,forms,validation,cakephp,cakephp-2.1,Forms,Validation,Cakephp,Cakephp 2.1,我有以下情况。 帖子有很多评论 属于帖子的评论 在我的/Views/Posts/view中,我显示带有评论的帖子。此外,每篇文章都应该显示一个评论表单。因此,我必须在视图中使用元素add_comment.ctp(如果我错了,请纠正我,但请参阅) /视图/帖子/view.ctp: // add comments echo $this -> element('add_comment',array('post_id' => $entry['Post']['id']), array('cac

我有以下情况。 帖子有很多评论

属于帖子的评论

在我的/Views/Posts/view中,我显示带有评论的帖子。此外,每篇文章都应该显示一个评论表单。因此,我必须在视图中使用元素add_comment.ctp(如果我错了,请纠正我,但请参阅)

/视图/帖子/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!')); ?>
/**
*用于添加注释的元素
*
*/
echo$this->Form->create('Comment',array('url'=>array(
“控制器”=>“注释”,
“操作”=>“添加”,
$post_id
)));
?>
如您所见,表单将提交给CommentsController的add操作。 现在,一个大问题是:add操作如何将验证结果等数据传递回表单?我的意思是,表单数据也应该被持久化,所以万一有人输入了无效数据,它就不会丢失

通常,add操作将呈现/View/Comments/add,但是我既不需要这个视图,也没有定义一个视图


到目前为止,我已经使用$this->redirect在注释保存后返回到/Views/Posts/view,但是重定向只调用/Views/Posts/view,而不传递任何内容。那么,如何将元素与平滑的自动表单处理结合起来使用呢?

我认为,如果您在提交后重定向,它将丢失任何基本上触发验证错误的
$this->invalidFields()
。有两种方法可以解决这个问题

1:无法在
注释/add.ctp
视图中重新重定向和呈现表单,因此表单将自动显示验证错误。然后,为了使过程再次顺利,请在保存成功且验证通过后重定向回您的帖子(您应该以某种方式拥有帖子ID)

2:您还可以将注释保存逻辑放入注释模型中,然后在您的POST视图操作(更新表单以指向此操作)中检查注释帖子,并使用
$this->POST->comment->savemethoddefinedmodel($this->request->data['POST')调用您在那里创建的保存函数


3:或。。。。您可以选择选项一并将其与ajax结合起来,这将非常棘手。

谢谢您的回答!澄清一下,1号是指评论/add.ctp将在验证后提交,而不显示帖子?即,仅用于添加注释的新视图?如果是,这不是最佳解决方案,但考虑到数字2显然打破了MVC模式,这可能是最容易实现的,对吗?是的,对于数字1,您将在两个位置显示添加注释表单,但在同一位置处理数据#2不一定会打破MVC模式,只是在post控制器中会有一些添加注释逻辑,这似乎有点奇怪。您是否以可接受的方式解决了这个问题?我也有同样的问题。