Статьи

Настройка общего кода контроллера в OpenCart

Если вы сталкивались с разработкой модулей в OpenCart, возможно, вы столкнулись с ситуацией, в которой вы объявили пару общих элементов в каждом контроллере. Не думаете ли вы, что было бы неплохо, если бы вы могли где-нибудь объявить общий код, и он будет подобран по мере необходимости! В этой статье мы обсудим, как настроить общий код контроллера и использовать его в разных модулях.

Для тех, кто знаком с разработкой модулей в OpenCart, это обычная процедура для установки общих элементов, таких как заголовки, нижний колонтитул и столбцы боковой панели в методе index класса контроллера. Хотя существуют разные способы централизации общего кода, мы рассмотрим способ OpenCart для достижения этой цели!

Я предполагаю, что вы используете последнюю версию OpenCart и знакомы с процессом разработки модулей, так как мы сконцентрируемся больше на концепции, а не на обсуждении основного кода.

Идем дальше и создаем catalog/controller/preactiondemo . Создайте файл common.php в этом каталоге со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
<?php
class ControllerPreactiondemoCommon extends Controller {
  public function setup($args) {
    // do the pre-processing here
    $data[‘header’] = $this->load->controller(‘common/header’);
    $data[‘footer’] = $this->load->controller(‘common/footer’);
    $data[‘preaction_text’] = «I’ve been set by the ‘setup’ method from ‘common’ controller file.»;
     
    $args[‘controller’]->$args[‘method’]($data, FALSE);
  }
}

Довольно легко и просто понять! Он просто инициализирует пару переменных в массиве $data , кроме последней строки метода setup . Мы вернемся к этому позже, так как он раскроет секрет массива $args .

Прежде чем мы создадим дальнейший код, я кратко объясню, как работает диспетчеризация в OpenCart.

Всякий раз, когда пользователь получает доступ к любому URL-адресу в OpenCart, создается соответствующий объект действия на основе переменной строки запроса маршрута . Вот фрагмент из index.php .

1
2
3
4
5
6
// Router
if (isset($request->get[‘route’])) {
  $action = new Action($request->get[‘route’]);
} else {
  $action = new Action(‘common/home’);
}

И после этого вызывается метод dispatch .

1
$controller->dispatch($action, new Action(‘error/not_found’));

Он вызовет метод dispatch определенный в файле, расположенном в system/engine/front.php . В этом методе вы найдете фрагмент кода, который выполняет цикл while до тех пор, пока для значения $action установлено значение false.

1
2
3
while ($action) {
  $action = $this->execute($action);
}

Как видите, он будет вызывать метод execute, определенный в том же файле, пока $action станет равным false. Это означает, что если метод контроллера возвращает объект действия, OpenCart выполнит это действие, прежде чем продолжить. Мы могли бы воспользоваться этим и вызвать другое действие из самого действия. Посмотрим, как этого добиться!

Теперь давайте создадим файл preactiondemo каталоге preactiondemo со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
class ControllerPreactiondemoPreactionDemo extends Controller {
  public function index($data=array(), $flag=TRUE) {
    if ($flag) {
      return new Action(‘preactiondemo/common/setup’, array(‘controller’ => $this, ‘method’=>’index’));
    }
     
    if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/preactiondemo/preaction_demo.tpl’)) {
      $this->response->setOutput($this->load->view($this->config->get(‘config_template’) . ‘/template/preactiondemo/preaction_demo.tpl’, $data));
    } else {
      $this->response->setOutput($this->load->view(‘default/template/preactiondemo/preaction_demo.tpl’, $data));
    }
  }
}

Если $flag равен true, мы вернем экземпляр класса действия, и, как мы только что видели, если процесс отправки получает объект действия, он продолжит это действие. Так что в этом случае он вызовет метод setup common контроллера. Вспомните файл common.php который мы создали в предыдущем разделе.

Важно отметить, что мы передаем array('controller' => $this, 'method'=>'index') в качестве аргумента, который в конечном итоге будет передан первому аргументу метода setup в common контроллер. Это поможет нам вернуться к методу preaction_demo контроллера preaction_demo после инициализации переменных.

Кроме того, в методе setup мы определили несколько общих переменных, таких как заголовок, нижний колонтитул и т. Д. И, наконец, мы переносим управление обратно в исходный контроллер, из которого был вызван метод setup используя следующую инструкцию.

1
$args[‘controller’]->$args[‘method’]($data, FALSE);

Конечно, нам нужно передать переменные, инициализированные в методе setup через $data на оригинальный контроллер, чтобы их можно было использовать там, что является главной целью этой статьи. Он передается как первый аргумент вызова метода выше. Второй аргумент очень важен, так как он будет инициализирован переменной $flag . Мы намеренно делаем это, чтобы избежать бесконечных циклов.

Наконец, давайте продолжим и catalog/view/theme/default/template/preactiondemo/preaction_demo.tpl наш файл представления в catalog/view/theme/default/template/preactiondemo/preaction_demo.tpl со следующим кодом.

1
2
3
4
5
6
7
<?php echo $header;
<div class=»container»>
  <div class=»row»>
    <?php echo $preaction_text;
  </div>
</div>
<?php echo $footer;

Теперь, когда мы закончили настройку, откройте URL-адрес http: //youropencartstoreurl/index.php? Route = preactiondemo / preaction_demo в вашем браузере. Вы должны увидеть сообщение «Я был установлен методом« setup »из« общего »файла контроллера». на этой странице!

Таким образом, вы можете настроить общий код в одном месте и вызывать это действие из других контроллеров. Конечно, это позволит избежать дублирования кода, и легче изменить код, общий для всех модулей.

Сегодня вы узнали один интересный трюк в OpenCart: как вызвать действие изнутри действия! Конечно, есть и другие способы для достижения этой цели, но это то, что я недавно вспомнил и подумал, что должен поделиться этим с вами и получить ваши отзывы!