От автора: С релиза OpenCart 2.x.x прошло уже достаточно времени, и на данный момент, похоже, все стабилизировалось (насколько это относится к API ядра). Большая часть популярных расширений поддерживает версии 2.х.х, но код 1.5.х никуда не делся. В сети вы найдете множество расширений для мигрирования с 1.5.х на последнюю версию.
Есть, конечно, определенные ограничения с расширениями. Они не умеют конвертировать все подряд, особенно кастомные модули. В этой статье мы рассмотрим код основных компонентов модуля OpenCart. Затем узнаем, как конвертировать OpenCart модули в совместимый с OpenCart 2.x.x. Не будем разглагольствовать, перейдем к сути!
Изменения в файле контроллера
В этом разделе мы рассмотрим необходимые изменения в коде файла контроллера. В качестве примера я выбрал файл account.php в папке catalog/controller/account
URL редирект
Рассмотрим код редиректа на версиях 1.5.х. В старой версии метод redirect входил в абстрактный класс Controller, поэтому его можно было вызывать напрямую с помощью объекта $this.
1 |
$this->redirect($this->url->link('account/login', '', 'SSL')); |
Как теперь это выглядит в версии 2.х.х. В последней версии метод redirect принадлежит классу Response, поэтому и доступ к нему осуществляется через объект класса.
1 |
$this->response->redirect($this->url->link('account/login', '', 'SSL')); |
Загрузка файлы языка
В 1.5.х необходимо было использовать следующий код для загрузки соответствующего файла языкового модуля.
1 |
$this->language->load('account/account'); |
В OpenCart 2.x.x необходимо использовать слегка измененный код.
1 |
$this->load->language('account/account');<br> |
Присвоение переменных
Можно сказать, это одно из главных изменений в контексте метода контроллера, так как в большинстве случаев вы в итоге присваиваете переменной значение, чтобы потом вызвать их в файлах шаблонов представления.
В версии 1.5.х было так:
1 |
$this->data['heading_title'] = $this->language->get('heading_title'); |
В 2.х.х так:
1 |
$data['heading_title'] = $this->language->get('heading_title'); |
Как видите, в последней версии массив $data подготавливается отдельно и передается как аргумент представления. В ранней версии это было свойство абстрактного класса Controller.
Хлебные крошки
В последней версии не нужен ключ массива separator.
Код 1.5.х:
1 2 3 4 5 |
$this->data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/home'), 'separator' => false ); |
То же самое можно записать по-другому:
1 2 3 4 |
$data['breadcrumbs'][] = array( 'text' => $this->language->get('text_home'), 'href' => $this->url->link('common/home') ); |
Назначение дочерних шаблонов
В 1.5.х для назначения всех дочерних шаблонов типа header, footer, column_left и т.д. необходим был массив.
1 2 3 4 5 6 7 8 |
$this->children = array( 'common/column_left', 'common/column_right', 'common/content_top', 'common/content_bottom', 'common/footer', 'common/header' ); |
В 2.х.х для этого нужен метод controller класса Loader.
1 2 3 4 5 6 |
$data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); $data['content_top'] = $this->load->controller('common/content_top'); $data['content_bottom'] = $this->load->controller('common/content_bottom'); $data['footer'] = $this->load->controller('common/footer'); $data['header'] = $this->load->controller('common/header'); |
Назначение шаблонов
В ранней версии OpenCart назначение и рендер шаблонов можно было сделать так.
1 2 3 4 5 6 |
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/account/account.tpl')) { $this->template = $this->config->get('config_template') . '/template/account/account.tpl'; } else { $this->template = 'default/template/account/account.tpl'; } $this->response->setOutput($this->render()); |
В последней версии код немного короче.
1 2 3 4 5 |
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/account/account.tpl')) { $this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/account/account.tpl', $data)); } else { $this->response->setOutput($this->load->view('default/template/account/account.tpl', $data)); } |
В последней версии мы используем метод view класса Loader.
Относительно изменений контроллера все. С помощью чеклиста выше вы теперь можете конвертировать код контроллера со старой на новую версию.
Изменения в файле модели
Хотя файлы модели почти идентичны в обеих версиях, в последней версии OpenCart была представлена новая функция Event Notifications. Отличная концепция, с помощью которой можно запускать определенные события, тем самым информирую соответствующие обзорщики при их доступности.
С помощью Event Notifications можно разрешить модификацию данных другими модулями, которые реализуют обзорщики для связанных событий до сохранения в базу данных. Взглянем на пример кода из файла catalog/model/account/address.php.
1 |
$this->event->trigger('pre.customer.add.address', $data); |
Я вызову событие перед добавлением или обновлением адреса покупателя. Это позволяет другим модулям изменять адрес до его сохранения в базу данных. По сути, это единственное главное изменение в модели. Теперь вы тоже можете вызывать события из других компонентов модуля.
Изменения в файле представления
В последнем разделе этого урока мы обсудим изменения компонента view модуля. Введение библиотеки BootStrap – одно из основных изменений, которое сделало шаблоны адаптивными. Конечно, ваши старые шаблоны будут работать в последней версии тоже, но они не будут адаптивными. OpenCart 2.x.x придерживается подхода mobile first, поэтому вы не можете игнорировать адаптивность шаблона.
Откройте catalog/view/theme/default/template/account/account.tpl. В файле можно заметить классы CSS типа «col-sm-6» and «col-sm-9» – индикаторы присутствия библиотеки BootStrap. BootStrap теперь лежит в ядре, поэтому можно использовать ее функции.
В файлах представления необходимо конвертировать старый XHTML код в новую адаптивную структуру. В остальном все так же, переменные печатаются так же, дочерние шаблоны подключаются так же.
Для сегодняшней статьи достаточно. Уверен, что описанные выше шаги помогут вам конвертировать ваши модули с 1.5.х до 2.х.х.
Заключение
Сегодня мы обсудили, какие изменения необходимо внести в существующие файлы модулей 1.5.х, чтобы конвертировать их в 2.х.х. Надеюсь, вам понравилось. Не стесняйтесь делиться мыслями по теме!
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.