OpenCart调用不同的控制器

时间:2014-11-19 12:44:14

标签: php opencart

我有自定义模块,现在想要从add()调用checkout/cart函数。如何调用控制器和功能?

我尝试了$this->load->controller('checkout/cart');,但这会返回一个致命的例外。

我正在使用OpenCart v 1.5.6.4

3 个答案:

答案 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。

的json字符串

答案 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);