У меня есть пользовательский модуль, и теперь вы хотите вызвать функцию 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);