OpenCart Call другой контроллер

0

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

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

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

Теги:
opencart

3 ответа

2
Лучший ответ

В 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.

2

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

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

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

  • 1
    Приведенный выше код работает для OpenCart 1.5.6.4. Вы используете v2?
  • 0
    Да, я использую v2. В этом все дело?
Показать ещё 1 комментарий
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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню