如何将表单提交给其他控制器

时间:2013-11-07 10:30:52

标签: php cakephp twitter-bootstrap

我有一个简单的博客应用程序,其中包含以下关联:

  

发表了很多评论

     

评论belongsTo Post

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

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

5 个答案:

答案 0 :(得分: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提交

此步骤是可选的。

通过上述工作,评论表单应该在点击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方法。