我有以下功能:
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
的视图,并且有充分的理由(我已经创建了一个,我不打算创建一个)
我的问题是如何从我的视图中调用和执行此函数?
答案 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()
方法中呈现视图,或者重定向到将呈现视图的操作。