OpenCart Call Different Controller

У меня есть пользовательский модуль, и теперь вы хотите вызвать функцию add() из checkout/cart . Как я могу назвать контроллер и функцию?

Я пробовал $this->load->controller('checkout/cart'); но это возвращает фатальное исключение.

Я использую OpenCart v 1.5.6.4

Чтобы решить ту же проблему, я использую контроллер $ this-> load-> («checkout / cart / add»).

Если я использую getChild, это исключение получится: «Вызовите undefined method Loader :: getChild ()».

В чем разница между двумя методами? Лучше ли getChild?

В OpenCart 1.5. *, getChild используется для загрузки других контроллеров. В частности, он выполняет маршрут до требуемого контроллера и функции. Например, common/home будет загружать home контроллер из common группы / папки. Добавив третий параметр, мы укажем функцию. В этом случае «add» – 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 – строка json, в которой checkout/cart/add echos.

Проблема с 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);