我有一个具有以下关联的简单博客应用程序:
发表有很多评论
评论属于发布
在帖子(PostsController::view
操作)的视图中,会显示现有评论,并且有一个 twitter 模式弹出窗口,其中显示了添加评论的表单。
从帖子控制器视图操作中,我需要做什么才能在评论表中插入新评论?如何从另一个控制器调用一个控制器操作?
我有一个具有以下关联的简单博客应用程序:
发表有很多评论
评论属于发布
在帖子(PostsController::view
操作)的视图中,会显示现有评论,并且有一个 twitter 模式弹出窗口,其中显示了添加评论的表单。
从帖子控制器视图操作中,我需要做什么才能在评论表中插入新评论?如何从另一个控制器调用一个控制器操作?
创建用于处理评论表单提交的控制器操作。这是一个非常简单(且愚蠢)的示例 - 根据需要进行增强:
// 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());
}
}
创建一个评论表单,因为您在问题中提到使用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">×</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 -->
创建元素后,只需将其包含在适当的位置,例如在帖子索引的末尾:
// View/Posts/index.ctp
...
echo $this->element('comment_form');
此步骤是可选的。
通过上述工作,单击时应显示评论表单(通过 javascript),add comment
但由于它是普通表单,因此在提交时将是普通的 http 请求。评论表单已经可以使用,不要更改它,但很可能您需要添加表单提交处理程序,以便通过 ajax 提交表单。通过这种方式,用户不会被重定向离开页面。
就像是:
$('form#CommentAdd').submit(function(e) {
e.preventDefault();
$.post(
$(this).attr('href'),
$(this).serialize(),
function(result) {
...
$('#myModal').modal('hide');
}
);
});
您可以使用 cakephp 的 requestAction 函数在另一个控制器中调用一个控制器动作。
如果你有PostsController并且 action 是comment,你可以使用 requestAction在CommentsController中添加评论数据。
下面是 requestAction 的使用示例
$response = $this->requestAction('/comments/add/comment:New comment/id:3');
$comments = $this->requestAction('/comments/latest');
您可以尝试类似的方法来调用模型
$myvar = ClassRegistry::init('OtherModel')->anyMethod();
$this->set(compact('myvar'));
你也可以传递任何数据ClassRegistry::init('OtherModel')->anyMethod($data);
您还可以使用 loadModel 在控制器中获取/使用
$this->loadModel('Model');
$data = $this->Model->function();
你不应该这样做,因为从另一个控制器调用一个控制器函数在 CakePHP 中是没有意义的:它不遵循 MVC 设计模式,如果你想违反该模式进行编程(这当然是允许的,但不是真的推荐),你不应该使用基于 MVC 的框架。你想做的事情可以在没有那种黑客的情况下完成。你似乎是从 CakePHP 开始的,所以不要从坏习惯开始!
你的问题很难回答,因为它太不具体了。您应该参考 CakePHP 文档,特别是保存您的数据部分。还要查看 saveAll 和 saveMany 方法。