Статьи

Конвертировать модули OpenCart из 1.5.x в 2.xx

Прошел год с момента выпуска OpenCart 2.xx, и теперь, похоже, все стабилизировалось в том, что касается основных API. Очевидно, что большинство популярных расширений поддерживают версию 2.xx и существуют вместе с их кодом версии 1.5.x. Вы также найдете множество расширений, которые позволяют перейти от существующей установки 1.5.x к последней версии.

Конечно, с такими расширениями есть определенные ограничения, поскольку они не могут конвертировать все, в частности пользовательские модули.

Поэтому в этой статье мы продолжим анализ фрагментов кода основных компонентов модуля OpenCart. Далее, мы увидим, как вы можете конвертировать его для совместимости с OpenCart 2.xx. Без какой-либо теории я сразу же погрузлюсь в гиковские вещи!

В этом разделе мы увидим необходимые изменения кода в файле контроллера. В этом примере я выбрал файл контроллера «account.php» в каталоге «catalog / controller / account».

Давайте посмотрим на фрагмент 1.5.x для перенаправления. В более старой версии метод redirect был частью абстрактного класса Controller , поэтому вы можете вызывать его напрямую, используя объект $this .

1
$this->redirect($this->url->link(‘account/login’, », ‘SSL’));

Теперь, вот как это выглядит в версии 2.xx. В последней версии метод redirect принадлежит классу Response и, таким образом, доступен через этот объект.

1
$this->response->redirect($this->url->link(‘account/login’, », ‘SSL’));

В 1.5.x вы использовали бы следующий фрагмент для загрузки соответствующего языкового файла модуля.

1
$this->language->load(‘account/account’);

С другой стороны, вам нужно использовать немного другую версию в случае OpenCart 2.xx, как показано в следующем фрагменте.

1
$this->load->language(‘account/account’);

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

В версии 1.5.x вы бы сделали что-то вроде этого:

1
$this->data[‘heading_title’] = $this->language->get(‘heading_title’);

В 2.xx то же самое может быть достигнуто путем:

1
$data[‘heading_title’] = $this->language->get(‘heading_title’);

Как вы можете видеть, в последней версии массив $data подготовлен исключительно и передается в качестве аргумента представления. В более ранней версии это был правильный класс Controller .

В последней версии вам не нужно указывать разделитель в качестве ключа массива, в отличие от более ранней версии.

Вот фрагмент из версии 1.5.x:

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.x вам нужно было предоставить массив для назначения всех дочерних шаблонов, таких как 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.xx вы будете использовать метод 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’) .
} 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 появилась новая функция «Уведомления о событиях». Это хорошая концепция, которая позволяет вам запускать определенные события и, таким образом, информировать соответствующих наблюдателей, если таковые имеются.

Используя функцию «Уведомления о событиях», вы можете разрешить изменение данных другими модулями, которые реализуют наблюдатели для связанных событий, перед сохранением в базе данных. Давайте возьмем пример фрагмента из файла «catalog / model / account / address.php».

1
$this->event->trigger(‘pre.customer.add.address’, $data);

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

В последнем разделе этого руководства мы обсудим изменения в компоненте представления модуля. Одним из основных изменений является введение библиотеки «Bootstrap», что делает шаблон отзывчивым. Конечно, ваши старые шаблоны будут работать и в последней версии, но не будут отзывчивыми. OpenCart 2.xx в первую очередь для мобильных устройств, поэтому вы не можете игнорировать отзывчивость вашего шаблона.

Я хотел бы, чтобы вы изучили «catalog / view / theme / default / template / account / account.tpl», в которой вы увидите имена классов CSS, такие как «col-sm-6» и «col-sm-9», которые указывают на наличие библиотеки начальной загрузки. Таким образом, в основном, поскольку bootstrap находится в самом ядре, вы хотели бы использовать большинство функций, предоставляемых им.

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

Вот и все, что касается сегодняшней статьи. Я уверен, что шаги, упомянутые выше, помогут вам конвертировать ваши модули из версии 1.5.x в версию 2.xx.

Сегодня мы обсудили, какие именно изменения необходимо внести в существующие модули OpenCart на основе 1.5.x, чтобы преобразовать их в 2.xx-совместимые. Я надеюсь, что вам понравилось, и не стесняйтесь оставлять свои мысли на эту тему!

Если вы хотите поднять свое обучение на новый уровень, посмотреть, что это такое, увидеть его в действии и практически применить то, что вы узнали в этом учебном пособии, а затем проверить отзывчивый шаблон OpenCart MediaCenter .