0

我有一个具有以下关联的简单博客应用程序:

发表有很多评论

评论属于发布

在帖子(PostsController::view操作)的视图中,会显示现有评论,并且有一个 twitter 模式弹出窗口,其中显示了添加评论的表单。

从帖子控制器视图操作中,我需要做什么才能在评论表中插入新评论?如何从另一个控制器调用一个控制器操作?

4

5 回答 5

4

1.创建控制器动作

创建用于处理评论表单提交的控制器操作。这是一个非常简单(且愚蠢)的示例 - 根据需要进行增强:

// Controller/CommentsContorller.php
class CommentsController extends AppController {

    public $components = array('RequestHandler');

    public function add() {
        $return = false;
        if ($this->request->data) {
            $return = $this->Comment->save($this->request->data);
        }

        if ($this->RequestHandler->isAjax()) {
            // return error or result as json
        }

        // fallback in case of direct access
        $this->redirect($this->referer());
    }
}

2.创建评论表单

创建一个评论表单,因为您在问题中提到使用bootstrap modals,请将表单包装在适当的标记中:

// View/Elements/comment_form.ctp
<!-- Button trigger modal -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Add a comment
</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>     
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        <?php
        echo $this->Form->create('Comment', array('url' => '/comments/add/'));
        echo $this->Form->inputs(array(
            'comment',
            'author'
        ));
        echo $this->Form->submit('add comment');
        ?>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

3.将其包含在相关的视图文件中

创建元素后,只需将其包含在适当的位置,例如在帖子索引的末尾:

// View/Posts/index.ctp
...
echo $this->element('comment_form');

4.通过javascript提交

此步骤是可选的。

通过上述工作,单击时应显示评论表单(通过 javascript),add comment但由于它是普通表单,因此在提交时将是普通的 http 请求。评论表单已经可以使用,不要更改它,但很可能您需要添加表单提交处理程序,以便通过 ajax 提交表单。通过这种方式,用户不会被重定向离开页面。

就像是:

$('form#CommentAdd').submit(function(e) {
    e.preventDefault();

    $.post(
        $(this).attr('href'), 
        $(this).serialize(),
        function(result) {
            ...
            $('#myModal').modal('hide');
        }
    );
});
于 2013-11-07T15:44:46.617 回答
1

您可以使用 cakephp 的 requestAction 函数在另一个控制器中调用一个控制器动作。

如果你有PostsController并且 action 是comment,你可以使用 requestAction在CommentsController中添加评论数据。

下面是 requestAction 的使用示例

$response = $this->requestAction('/comments/add/comment:New comment/id:3');

$comments = $this->requestAction('/comments/latest');
于 2013-11-08T07:29:05.610 回答
0

您根本不这样做,因为它会违反MVC 设计模式

有几种方法可以解决这个问题,最简单的方法是将您的评论发布到 /comments/add 并将用户重定向回他来自的地方。如果评论添加正确与否,您可以显示一条消息。

另一种方法是将其发布到同一个视图(假设帖子/视图)并在 beforeFilter 中截取帖子并检查是否存在评论记录,如果是,则通过关联 Post hasMany Comment 保存它。这个评论插件就是这样解决的。

于 2013-11-07T12:10:14.857 回答
0

您可以尝试类似的方法来调用模型

$myvar = ClassRegistry::init('OtherModel')->anyMethod();
$this->set(compact('myvar'));

你也可以传递任何数据ClassRegistry::init('OtherModel')->anyMethod($data);

您还可以使用 loadModel 在控制器中获取/使用

$this->loadModel('Model');
$data = $this->Model->function();
于 2013-11-07T12:21:42.220 回答
0

你不应该这样做,因为从另一个控制器调用一个控制器函数在 CakePHP 中是没有意义的:它不遵循 MVC 设计模式,如果你想违反该模式进行编程(这当然是允许的,但不是真的推荐),你不应该使用基于 MVC 的框架。你想做的事情可以在没有那种黑客的情况下完成。你似乎是从 CakePHP 开始的,所以不要从坏习惯开始!

你的问题很难回答,因为它太不具体了。您应该参考 CakePHP 文档,特别是保存您的数据部分。还要查看 saveAll 和 saveMany 方法。

于 2013-11-07T12:37:24.530 回答