Конвертация модулей OpenCart с 1.5.х до 2.х.х
29 Мая 2022г. в 04:33Есть, конечно, определенные ограничения с расширениями. Они не умеют конвертировать все подряд, особенно кастомные модули. В этой статье мы рассмотрим код основных компонентов модуля OpenCart. Затем узнаем, как конвертировать OpenCart модули в совместимый с OpenCart 2.x.x. Не будем разглагольствовать, перейдем к сути!
Изменения в файле контроллера
В этом разделе мы рассмотрим необходимые изменения в коде файла контроллера. В качестве примера я выбрал файл account.php в папке catalog/controller/account
URL редирект
Рассмотрим код редиректа на версиях 1.5.х. В старой версии метод redirect входил в абстрактный класс Controller, поэтому его можно было вызывать напрямую с помощью объекта $this.
$this->redirect($this->url->link('account/login', '', 'SSL'));
1
$this->redirect($this->url->link('account/login', '', 'SSL'));
Как теперь это выглядит в версии 2.х.х. В последней версии метод redirect принадлежит классу Response, поэтому и доступ к нему осуществляется через объект класса.
$this->response->redirect($this->url->link('account/login', '', 'SSL'));
1
$this->response->redirect($this->url->link('account/login', '', 'SSL'));
Загрузка файлы языка
В 1.5.х необходимо было использовать следующий код для загрузки соответствующего файла языкового модуля.
$this->language->load('account/account');
1
$this->language->load('account/account');
В OpenCart 2.x.x необходимо использовать слегка измененный код.
$this->load->language('account/account');<br>
1
$this->load->language('account/account');<br>
Присвоение переменных
Можно сказать, это одно из главных изменений в контексте метода контроллера, так как в большинстве случаев вы в итоге присваиваете переменной значение, чтобы потом вызвать их в файлах шаблонов представления.
В версии 1.5.х было так:
$this->data['heading_title'] = $this->language->get('heading_title');
1
$this->data['heading_title'] = $this->language->get('heading_title');
В 2.х.х так:
$data['heading_title'] = $this->language->get('heading_title');
1
$data['heading_title'] = $this->language->get('heading_title');
Как видите, в последней версии массив $data подготавливается отдельно и передается как аргумент представления. В ранней версии это было свойство абстрактного класса Controller.
Хлебные крошки
В последней версии не нужен ключ массива separator.
Код 1.5.х:
$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home'),
'separator' => false
);
1
2
3
4
5
$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home'),
'separator' => false
);
То же самое можно записать по-другому:
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home')
);
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 и т.д. необходим был массив.
$this->children = array(
'common/column_left',
'common/column_right',
'common/content_top',
'common/content_bottom',
'common/footer',
'common/header'
);
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.
$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');
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 назначение и рендер шаблонов можно было сделать так.
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
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());
В последней версии код немного короче.
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));
}
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.
$this->event->trigger('pre.customer.add.address', $data);
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.х.х. Надеюсь, вам понравилось. Не стесняйтесь делиться мыслями по теме!