Перенос модулей с OpenCart 1.5.x на OpenCart 2.0.x mini howto или изменения в OpenCart 2.0
С выходом opencart 2.0.0.0, которая значительно отличается от 1.5.6 остро стал вопрос переноса моделей на эту версию движка со старых версий.
Поэтому решил написать об этом пост, где можно было бы описать все нюансы переноса. Чтобы все было в 1 месте.
Сначала даю минимум, то, с чем столкнулся сам, потом в процессе получения новой информации пост будет пополняться новыми данными.
И так изменения:
- Стандарты кодирования. Они немного поменялись, теперь не нужно добавлять закрывающий php тег ?> в конце каждого файла. Это правильно, во многих движках это уже давно сделано.
- bootstrap Именно он заберет у вас больше всего времени при переносе модулей. С одной стороны это шаг в будущее - вместо своих велосипедов использовать стандартный инструмент, протестированный на сотнях тысяч сайтов. Но с другой это дает много головной боли разработчикам при создании модулей. Для тех, кто не в курсе, очень коротко что такое bootstrap - это css фреймворк, для создания универсальных элементов управления, форм, сетки сайта итд. Например для создания 2-х равных колонок можно написать:
<div class="col-sm-6"></div>
<div class="col-sm-6"></div>
(сетка имеет 12 колонок, соответственно col-sm-6 это половина, если нужны не равные колонки то можно сделать col-sm-2 и class="col-sm-10) и вам не нужно переживать как это будет работать на куче устройств (планшеты, смартфоны, мониторы) с кучей расширений экрана. Более детально о bootstrap-е можно тут (ru, ua, eng). При создании модулей можно и нужно также смотреть как сделаны другие модули и открыть форму редактирования товара в админке - там много примеров всех возможных элементов. - OCMOD вместо VQMOD. Это почти тоже самое, синтаксис такой же, только OCMOD уже встроен в движок, его не нужно дополнительно устанавливать. OCMOD планировался стать менее функциональным, чем vQmod для уменьшения конфликтов, например там не должно было быть offset-ов. Но со временем offset-ы тоже добавились для совместимости.
- События (Events) Лично для меня это наибольшее событие в новой версии. События это возможность вносить изменения в логику работы магазина БЕЗ изменения кода движка, как это делает VQMOD(OCMOD). Эта возможность есть наверное во всех серьезных движках, opencart-у ее очень сильно не хватало, так как VQMOD делал кучу конфликтов и разрабатывать серьезные магазины на opencarte из-за этого было очень сложно. События еще правда только появились и находятся на начальной стадии развития, до уровня хуков в Drupal еще очень далеко но начало есть и это не может не радовать.
- Контроллер.
1. Назначение переменных шаблона
Вместо:
$this->data['foo'] = $foo;
Нужно:
$data['foo'] = $foo;
2. Назначение шаблона
Вместо:
$this->template = 'module/module.tpl';
Нужно:
$this->response->setOutput($this->load->view('module/module.tpl', $data));
3. Добавление дочерных контроллеров
Вместо:
$this->children = array( 'common/header', 'common/footer' );
Нужно (теперь через load можно загружать контроллеры):
$data['header'] = $this->load->controller('common/header'); $data['column_left'] = $this->load->controller('common/column_left'); $data['footer'] = $this->load->controller('common/footer');
4. Редирект
Вместо:
$this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
Нужно:
$this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
5. Поле статус для модуля теперь обязательное:
if (isset($this->request->post['module_name_status'])) { $data['featured_status'] = $this->request->post['module_name_status']; } else { $data['featured_status'] = $this->config->get('module_name_status'); }
Если в процессе переноса модуля вы столкнетесь с новым нюансом, не описанным тут - напишите это в комментариях, добавлю в пост.