Если вы сталкивались с разработкой модулей в 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: как вызвать действие изнутри действия! Конечно, есть и другие способы для достижения этой цели, но это то, что я недавно вспомнил и подумал, что должен поделиться этим с вами и получить ваши отзывы!