我有自定义模块,现在想要从add()
调用checkout/cart
函数。如何调用控制器和功能?
我尝试了$this->load->controller('checkout/cart');
,但这会返回一个致命的例外。
我正在使用OpenCart v 1.5.6.4
答案 0 :(得分:3)
在OpenCart 1.5。*中,getChild
用于加载其他控制器。具体来说,它正在运行到所需控制器和功能的路径。例如,common/home
将从home
组/文件夹加载common
控制器。通过添加第三个选项,我们指定一个函数。在这种情况下,'添加' - checkout/cart/add
。
class ControllerModuleModule1 extends Controller {
protected function index() {
ob_start();
$this->getChild('checkout/cart/add');
$this->response->output();
$response = ob_get_clean();
}
}
大多数控制器不返回或回显任何内容,而是指定在$this->response
对象中输出的内容。要获得正在呈现的内容,您需要调用$this->response->output();
。在上面的代码$response
中是checkout/cart/add
echos。
答案 1 :(得分:2)
要解决同样的问题,我使用$ this-> load-> controller(“checkout / cart / add”)。
如果我使用getChild,则抛出此异常:“调用未定义的方法Loader :: getChild()”。
两种方法有什么区别? getChild更好吗?
答案 2 :(得分:0)
getChild()
的问题是它只有在控制器最后调用$this->response->setOutput()
或echo
时才会生效 - 产生实际输出。另一方面,如果要调用返回变量响应的控制器方法,则它不起作用。由于getChild()
只接受一个要传递的参数$args
,因此也无法传递多个参数。
我的解决方案是将1.5.6.4中的这一位添加到 system / engine / loader.php ,这允许您加载控制器并以与模型相同的方式调用它的方法:
public function controller($controller) {
$file = DIR_APPLICATION . 'controller/' . $controller . '.php';
$class = 'controller' . preg_replace('/[^a-zA-Z0-9]/', '', $controller);
if (file_exists($file)) {
include_once($file);
$this->registry->set('controller_' . str_replace('/', '_', $controller), new $class($this->registry));
} else {
trigger_error('Error: Could not load controller ' . $controller . '!');
exit();
}
}
现在你可以这样做:
$this->load->controller('catalog/example');
$result = $this->controller_catalog_example->myMethod($var1, $var2, $var3);