OpenCart 2.2.0.0_a1 - что нового?

Sorry for my English! English is not my native language. One of the reasons to create this blog is to improve my English writing. So I will be highly obliged if you will help me with this. If you find a grammar error on this page, please select it with your mouse and press Ctrl+Enter.

Вышел OpenCart 2.2.0.0_a1
Это альфа версия, она создана для тестов и исправления возможных ошибок, крайне не рекомендуется устанавливать ее на рабочий сайт. 
В ней достаточно много изменений по сравнению с 2.1.0.2, поэтому решил присвятить этому отдельную статью. 
Итак, что же нового?
 

Адмика

1. Настройки темы теперь находяться по адресу:
admin/index.php?route=theme/theme_default
что, конечно же, намного удобнее, чем искать их в настройках магазина
Плюс для каждой темы можно установить свои настройки
 
2. Новые методы оплаты (которые у нас все равно не используются): 
  • Lay-Buy
  • Cardinity
  • Eway
3. Новые модули:
  • Lay-Buy
  • sagepay
 

Структура

1. Появился composer:
composer.json
Я так понял, будет доступно 2 версии OpenCart - в одной будет composer и все библиотеки будут подгружаться через него. Для этой версии папку vendor стоит вынести выше каталога магазина.
 
2. index.php сильно уменьшился, он теперь занимает всего около 20 строк кода. 
 

// Version
define('VERSION', '2.2.0.0_a1');
 
// Configuration
if (is_file('config.php')) {
  require_once('config.php');
}
 
// Install
if (!defined('DIR_APPLICATION')) {
  header('Location: install/index.php');
  exit;
}
 
// Startup
require_once(DIR_SYSTEM . 'startup.php');
 
$application_config = 'catalog';
 
// Application
require_once(DIR_SYSTEM . 'framework.php');

Как видно, весь код из него добавили в в файл с гордым названием framework.php
Теперь OpenCart можно называть CMF :)
На самом деле это хорошо, так как нету дублирования кода, весь код и для каталога и для админки размещен в одном файле. 
 
3. Появилась папка 
/catalog/controller/startup
в которую перенесли все, что нужно загрузить при старте:
  • startup.php
  • session.php
  • seo_url.php
  • router.php 
  • maintenance.php
  • event.php
  • error.php
 
4. Появилась папка
/catalog/controller/event
с файлами:
  • theme.php
  • debug.php
 
5. Добавился /system/engine/proxy.php
6. Все что связано с корзиной перенесено в 
/system/library/cart:
  • weight.php
  • user.php
  • tax.php
  • length.php
  • customer.php
  • currency.php
  • cart.php
  • affiliate.php
7. Появилась папка 
/system/library/session
с файлами:
  • db.php
  • file.php
Как видно из названия, это сделано для того, чтобы хранить сессии также в базе данных, класс написан, правда он пока никак не подключается, это наверное будет сделано в следующих версиях
 
8. Локализации теперь размещены в 
language/en-gb
вместо
language/english
 

По коду

1. Поменялось создание ссылок,
было:

'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')

стало:

'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], true)

SSL теперь подключается в конструкторе библиотеки:
system/library/url.php

public function __construct($ssl = false) {

 
2. Поменялась генерация представлений,
было:

$this->response->setOutput($this->load->view('analytics/google_analytics.tpl', $data));

стало:

$this->response->setOutput($this->load->view('analytics/google_analytics', $data));

теперь не нужно указывать расширение для файлов, оно добавляется автоматически
Также рендеринг вынесен в адаптер:
upload/system/library/template.php

public function render($template) {
  return $this->adaptor->render($template);
}

название которого поменялось, теперь
/system/library/template/basic.php 
в 2.1 было php.php
Да, появились, правда немного раньше, неймспейсы:
namespace Template;
 
Использование адаптеров в шаблонах не совсем понятно, так как он все равно один и задается при создании класса шаблона жестко в тексте. 

$template = new Template('basic');

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

$this->language->load('catalog/attribute_group');

стало:

$this->load->language('catalog/attribute_group');

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

$this->registry->get('event')->trigger('language/' . $route . '/before', $route);
$this->registry->get('language')->load($route);      
$this->registry->get('event')->trigger('language/' . $route . '/after', $route);

Которые могут использоваться другими модулями.
Также картинка языка теперь в папке самого языка, а не в папке image,
было:

<img src="image/flags/<?php echo $language['image']; ?>" alt="<?php echo $language['name']; ?>" title="<?php echo $language['name']; ?>">

стало:

<img src="catalog/language/<?php echo $language['code']; ?>/<?php echo $language['code']; ?>.png" alt="<?php echo $language['name']; ?>" title=">

 
4. По Событиям (Events)
Они опять переписаны (уже наверное раз десятый с момента появления)
было:

if (version_compare(VERSION, '2.0.1', '>=')) {
  $this->load->model('extension/event');
  $this->model_extension_event->addEvent('openbay', 'post.admin.product.delete', 'extension/openbay/eventDeleteProduct');
  $this->model_extension_event->addEvent('openbay', 'post.admin.product.edit', 'extension/openbay/eventEditProduct');
} else {
  $this->load->model('tool/event');
  $this->model_tool_event->addEvent('openbay', 'post.product.delete', 'extension/openbay/eventDeleteProduct');
  $this->model_tool_event->addEvent('openbay', 'post.product.edit', 'extension/openbay/eventEditProduct');
}

стало:

$this->load->model('extension/event');
$this->model_extension_event->addEvent('openbay', 'admin/model/catalog/product/deleteProduct/before', 'extension/openbay/eventDeleteProduct');
$this->model_extension_event->addEvent('openbay', 'admin/model/catalog/product/editProduct/before', 'extension/openbay/eventEditProduct');

 
Удаление было:

if (version_compare(VERSION, '2.0.1', '>=')) {
  $this->load->model('extension/event');
  $this->model_extension_event->deleteEvent('openbay');
} else {
  $this->load->model('tool/event');
  $this->model_tool_event->deleteEvent('openbay');
}

стало:

$this->model_extension_event->deleteEvent('openbay');

 
Добавление тригеров, было

$this->event->trigger('pre.view.' . str_replace('/', '.', $template), $data);

стало

$result = $this->registry->get('event')->trigger('view/' . $route . '/before', array(&$route, &$data));

Почти все тригеры удалены из моделей и контроллеров, их было особенно много в моделях и контроллерах покупателя, заказа 
Остались только в 
  • system/engine/loader.php
  • catalog/model/openbay/etsy_order.php
  • catalog/model/openbay/ebay_openbay.php
  • catalog/controller/startup/router.php
  • admin/controller/startup/router.php
все!
 
5. Валидацию емейлов изменили
было:

if (utf8_strlen($email) > 0 && preg_match('/^[^\@]+@.*.[a-z]{2,15}$/i', $email)) {

стало:

if (utf8_strlen($email) > 0 && filter_var($email, FILTER_VALIDATE_EMAIL)) {

 
6. переписан system/engine/action.php
теперь в нем используется класс Reflection (рефлексия или отражение), очень спорное решение, так как это API работает очень медленно, а вызывается оно для каждого контроллера. 
 

Заключение

Рефлексия, композер, неймспейсы.. это точно OpenCart? :)
На самом деле меня это не может не радовать, что OpenCart не стоит на месте и постоянно развивается. 
Плохо то, что делается это неимоверно медленно. Те же События можно было запустить еще со второй версии, уже 2.2, за это время их уже раз десять переписали, а теперь вообще половину тригеров выбросили, оставив только несколько в лоадере.. Такими темпами полноценную поддержку Событий мы получим лет через 5.. в то время когда сейчас практически все популярные движки их уже имеют. 
 
Стоит ли переходить с 2.1 на 2.2. 
Каких-то существенных улучшений я не увидел. Поменялась структура, что в будущем может только добавить проблем с совместимостью модулей, которые были написаны под старую структуру, добавились некоторые косметические улучшения в админке, которые ничего особо не меняют. Поэтому особого смысла срочно переходить на новую версию с 2.1.0.2 я не вижу. Хотя, конечно, желательно всегда иметь свежую версию движка.  
 
Замечание. В этой статье приведены не все изменения в версии 2.2, а только те, что мне удалось обнаружить при беглом изучении новой версии и те, которые я посчитал существенными. 
Если вы обнаружили другие изменения - пишите в комментариях. 
 

Add new comment

CAPTCHA
Spam protection
Target Image