У меня есть пользовательский модуль, и теперь вы хотите вызвать функцию add()
из checkout/cart
. Как я могу назвать контроллер и функцию?
Я попробовал $this->load->controller('checkout/cart');
но это возвращает фатальное исключение.
Я использую OpenCart v 1.5.6.4
В 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.
Чтобы решить ту же проблему, я использую контроллер $this-> load-> ("checkout/cart/add").
Если я использую getChild, это исключение получится: "Вызовите undefined method Loader :: getChild()".
В чем разница между двумя методами? Лучше ли getChild?
Проблема с 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);