Пишем общий код контроллера в OpenCart

Пишем общий код контроллера в OpenCart

От автора: если вы разрабатывали модули, то могли попасть в ситуацию, когда писали общие элементы, подходящие под все контроллеры OpenCart. Как думаете, было бы круто, если бы вы могли писать общий код где-то в одном файле и вызывать его по необходимости! В этой статье мы обсудим, как написать общий код контроллера и использовать его в разных модулях.

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

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

Создаем общий код контроллера

Создайте папку catalog/controller/preactiondemo. Создайте файл common.php в этой папке со следующим кодом.

<?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!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию

Понятие процесса отправки

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

Когда пользователь переходит по любому URL в OpenCart, создается соответствующий объект action на основе переменной строки запроса route. Кусок кода из index.php.

// Router
if (isset($request->get['route'])) {
  $action = new Action($request->get['route']);
} else {
  $action = new Action('common/home');
}

Далее вызывается метод dispatch.

$controller->dispatch($action, new Action('error/not_found'));

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

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

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

Вызов общего контроллера и настройка представления

Создайте файл preaction_demo.php в папке preactiondemo со следующим кодом.

<?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, мы возвращаем объект класса action. А если процесс отправки получает объект action, он продолжает работу с этим action. То есть в нашем случае будет вызван метод setup контроллера common. Вспомните файл common.php, который мы создали в предыдущем разделе.

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

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

$args['controller']->$args['method']($data, FALSE);

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

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

<?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. Должно появиться сообщение «I’ve been set by the ‘setup’ method from the ‘common’ controller file.»!

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

Заключение

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

Автор: Sajal Soni

Источник: http://code.tutsplus.com/

Редакция: Команда webformyself.

Интернет-магазин на OpenCart!

Создайте интернет-магазин на самой популярной CMS – OpenCart с нуля!

Приступить к созданию
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Интернет-магазин на OpenCart

Создание магазина с уникальным шаблоном на CMS OpenCart

Научиться

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree