我有一个简单的博客应用程序,其中包含以下关联:
发表了很多评论
评论belongsTo Post
在帖子(PostsController::view
操作)的视图中,会显示现有评论,并且有一个Twitter模式弹出窗口,其中显示了一个用于添加评论的表单。
在posts控件视图操作中,我需要做什么才能在评论表中插入新评论?如何从另一个调用一个控制器动作?
答案 0 :(得分:4)
创建用于处理评论表单提交的控制器操作。这是一个非常简单(和愚蠢)的例子 - 根据需要进行增强:
// 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');
此步骤是可选的。
通过上述工作,评论表单应该在点击add comment
时显示(通过javascript),但由于它是普通表单,因此在提交时它将是正常的http请求。评论表已经有效,不要改变它,但很可能你会想要添加一个表单提交处理程序,以便表单由ajax提交。通过这种方式,用户不会被重定向到页面之外。
类似的东西:
$('form#CommentAdd').submit(function(e) {
e.preventDefault();
$.post(
$(this).attr('href'),
$(this).serialize(),
function(result) {
...
$('#myModal').modal('hide');
}
);
});
答案 1 :(得分:1)
您可以使用cakephp的requestAction函数在另一个控制器中调用一个控制器操作。
如果您有 PostsController 且操作是评论,则可以使用requestAction在 CommentsController 中添加评论数据。
以下是requestAction
的使用示例$response = $this->requestAction('/comments/add/comment:New comment/id:3');
$comments = $this->requestAction('/comments/latest');
答案 2 :(得分:0)
您根本不这样做,因为它会违反the MVC design pattern。
有几种方法可以解决这个问题,最简单的方法是将您的评论发布到/ comments / add并将用户重定向到他来自的地方。如果评论添加正确,您可以显示Flash消息。
替代方法是将其发布到相同的视图(假设帖子/视图)并拦截beforeFilter中的帖子并检查是否存在评论记录,如果是,则通过关联保存它有多个评论。 This comments plugin以这种方式解决了这个问题。
答案 3 :(得分:0)
你可以尝试类似的东西来调用模型
$myvar = ClassRegistry::init('OtherModel')->anyMethod();
$this->set(compact('myvar'));
您还可以使用ClassRegistry::init('OtherModel')->anyMethod($data);
您也可以使用loadModel来获取/使用控制器
$this->loadModel('Model');
$data = $this->Model->function();
答案 4 :(得分:0)
你不应该这样做,因为在CakePHP中从另一个控制器调用控制器函数是没有意义的:它不遵循MVC设计模式,如果你想编程违反该模式(当然这是允许的)但不是真的推荐),你不应该使用基于MVC的框架。你想要做的就是没有那种黑客。你似乎是从CakePHP开始的,所以不要从坏习惯开始!
你的问题很难回答,因为它非常不具体。您应该参考CakePHP文档,特别是Saving Your Data部分。另请参阅saveAll和saveMany方法。