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

时间:2012-07-05 15:02:31

标签: forms validation cakephp cakephp-2.1

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

评论属于帖子

在我的/ Views / Posts / view中,我显示Post及其Comments。此外,对于每个帖子,都应显示评论表。因此,我必须在视图中使用Element 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的add操作。 现在,一个大问题:添加操作如何实际将验证结果等数据传递回表单?我的意思是,表单数据也应该保留,所以如果有人输入了无效数据,它就不会丢失。

通常情况下,添加操作会呈现/查看/评论/添加,但我既不需要这个视图也不需要定义一个。

到目前为止,我已经使用$ this-&gt;重定向在保存注释后返回到/ Views / Posts /视图 - 但重定向只调用/ Views / Posts / view而不传递任何内容。那么如何结合使用Elements和平滑自动的表单处理呢?

1 个答案:

答案 0 :(得分:1)

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

1 :您可以重定向并在comments/add.ctp视图中再次呈现表单,以便自动显示表单并显示验证错误。然后,为了使流程再次平滑,重新定向回到您的帖子(您应该以某种方式拥有帖子ID)一旦保存成功并且验证已经过去。

2 :您还可以将注释保存逻辑放在注释模型中,然后在Post View操作中检查注释POST(更新表单以指向此操作)并调用保存功能你用$this->Post->Comment->saveMethodDefinedInModel($this->request->data['Post']);创建那里。

3:或....你可以选择一个并将它与ajax结合起来,这样就相当粗糙了。