Cakephp从视图调用函数

时间:2013-09-29 21:58:25

标签: php cakephp

我有以下功能:

 public function make_order($id = null){
        if($this->request->is('post')){
            if(isset($id)){
                $single_product = $this->Product->find('first', array('Product.id' => $id));
                $this->placeOrder($single_product);
            }else{
                $product_array = $_SESSION['basket'];
                foreach($product_array as $product){
                    $this->placeOrder($product);
                }
            }

        }
}
private function placeOrder($product){
    $order_array = array();

    $order_array['Order']['Product_id'] = $product['Product']['id'];
    $order_array['Order']['lejer_id'] = $this->userid;
    $order_array['Order']['udlejer_id'] = $product['users_id'];
    $this->Order->add($order_array);
}

现在这两个功能没有“连接”到一个视图,但我仍然需要从另一个视图中调用它们

为此,我尝试了以下内容:

<?php echo $this->Html->link(__('Bestil'), array('action' => 'make_order')); ?>

然而,这会抛出一个错误,说它无法找到匹配make_order的视图,并且有充分的理由(我已经创建了一个,我不打算创建一个)

我的问题是如何从我的视图中调用和执行此函数?

2 个答案:

答案 0 :(得分:2)

make_order功能结束时,您需要:

a)指定要渲染的视图文件,或 b)重定向到具有要呈现的视图文件的不同控制器和/或动作。

a)看起来像这样:

$this->render('some_other_view_file');

b)可能看起来像这样(注意:设置flash消息是可选的)

$this->Session->setFlash(__('Your order was placed'));
$this->redirect(array('controller' => 'some_controller', 'action' => 'some_action'));

答案 1 :(得分:1)

您可以通过在控制器的操作中设置$this->autoRender = false;来关闭自动渲染(在这种情况下为make_order())。这样您就不需要视图文件,并且可以输出您需要的任何内容。

问题是屏幕上不会呈现任何内容。因此,我的建议是让你的“链接”简单地通过AJAX调用controller :: action。如果在您的情况下无法做到这一点,那么您必须在make_order()方法中呈现视图,或者重定向到将呈现视图的操作。