2

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

评论属于帖子

在我的 /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!')); ?>

如您所见,表单被提交到 CommentsController 的 add 操作。现在,最大的问题是:添加操作如何将验证结果等数据实际传递回表单?我的意思是,表单数据也应该被持久化,所以万一有人输入了无效数据,它不会丢失。

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

到目前为止,我已经使用 $this->redirect 在保存评论后返回到 /Views/Posts/view ——但重定向只是调用 /Views/Posts/view 而不传递任何内容。那么如何使用 Elements in Combination 以及平滑和自动的表单处理呢?

4

1 回答 1

1

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

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

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

3:或者....您可以采用选项一并将其与 ajax 结合使用,这将是相当粗糙的。

于 2012-07-05T16:21:21.283 回答