• Узнать стоимость приложения
  • Получить бесплатную консультацию
  • Заказать мобильное приложение
Отправить запрос
* Контактное лицо:
* E-mail:
* Веб-сайт или страница компании:
* Ваш вопрос:
Настоящим подтверждаю, что я ознакомлен и согласен с условиями политики конфиденциальности. Узнать больше

Почему не стоит делать сайт на OpenCart

Почему не стоит делать сайты на OpenCart

Недавно у меня была возможность поработать над интернет-магазином на основе OpenCart.

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

Повторения кода

Система до отказа забита кодом, подобным нижеследующему:

$this->language->load(’account/account’);
$this->data[’heading_title’] = $this->language->get(’heading_title’);
$this->data[’text_my_account’] = $this->language->get(’text_my_account’);
$this->data[’text_my_orders’] = $this->language->get(’text_my_orders’);
$this->data[’text_my_newsletter’] = $this->language->get(’text_my_newsletter’);
$this->data[’text_edit’] = $this->language->get(’text_edit’);
$this->data[’text_password’] = $this->language->get(’text_password’);
$this->data[’text_address’] = $this->language->get(’text_address’);
$this->data[’text_wishlist’] = $this->language->get(’text_wishlist’);
$this->data[’text_order’] = $this->language->get(’text_order’);
$this->data[’text_download’] = $this->language->get(’text_download’);
$this->data[’text_reward’] = $this->language->get(’text_reward’);
$this->data[’text_return’] = $this->language->get(’text_return’);
$this->data[’text_transaction’] = $this->language->get(’text_transaction’);
$this->data[’text_newsletter’] = $this->language->get(’text_newsletter’);


Итак, мы загружаем языковой файл и вручную переносим каждое значение из простого массива (которым и является любой языковой файл) в новый массив, с тем же самым ключом. Это, как правило, превращает 10 строчек в контроллере в 50 или 60 строк… Контроллеры покрупнее имеют по 150 избыточных строк только для работы с языковыми переменными!!!

Далее, переходим к обработке форм. Системы обработки форм в OpenCart нет и весь ввод обрабатывается примерно так:

if (isset($this->request->post[’model’])) {
    $this->data[’model’] = $this->request->post[’model’];
} elseif (!empty($product_info)) {
    $this->data[’model’] = $product_info[’model’];
} else {
    $this->data[’model’] = ’’;
}

if (isset($this->request->post[’sku’])) {
    $this->data[’sku’] = $this->request->post[’sku’];
} elseif (!empty($product_info)) {
    $this->data[’sku’] = $product_info[’sku’];
} else {
    $this->data[’sku’] = ’’;
}

if (isset($this->request->post[’upc’])) {
    $this->data[’upc’] = $this->request->post[’upc’];
} elseif (!empty($product_info)) {
    $this->data[’upc’] = $product_info[’upc’];
} else {
    $this->data[’upc’] = ’’;
}

if (isset($this->request->post[’ean’])) {
    $this->data[’ean’] = $this->request->post[’ean’];
} elseif (!empty($product_info)) {
    $this->data[’ean’] = $product_info[’ean’];
} else {
    $this->data[’ean’] = ’’;
}


Опять же, для формы с 50 полями, мы имеем 50 блоков, подобных вышеприведенным. Конечно, весь этот код можно заменить тремя строками, которые будут делать то же самое - чем-то вроде этого:

if(!empty($this->request->post)){
    foreach($this->request->post as $k => $v){
        if (!empty($this->request->post[$k])) {
            $this->data[$k] = $this->request->post[$k];
        }
    }
}


Поскольку система валидации отсутствует, каждый контроллер вызывает метод валидации для каждого обрабатываемого объекта, в котором валидация производится старыми добрыми PHP-функциями в ручном режиме для каждого поля формы. Я упомянул последнее ввиду того, что это вроде бы ничего для PHP-приложения 10-летней давности, но в наши дни такая реализация крайне нерациональна.

База данных

Каждый контроллер включает в себя метод валидации, где проверяются разнообразные ограничения (constraints) — вместо того, чтобы использовать движок MySQL для этих действий. То же самое и с удалением объектов из БД, т.е. вместо каскадных внешних ключей, мы сначала вручную находим все связанные записи, а затем удаляем их.

На этом безумие не заканчивается. Запрос для извлечения реальной единицы товара довольно громоздкий, он объединяет 8 или 9 таблиц, чтобы собрать всю информацию о товаре. Уму непостижимо именно то, что этот запрос осуществляется неоднократно, в разных местах внутри циклов и без какого бы то ни было кэширования. То же и с функцией getProducts, которая представляет тяжелейший во всей системе запрос. Никаких признаков кэширования.

И во всей CMS OpenCart кэширования почти не встретишь. Еще забавнее то, что оно есть в некоторых местах бэкенда, но не во фронтенде. Там, где применяется кэширование, единственно поддерживаемый метод - файловый, который, если мы имеем нормальное кэширование в сервере MySQL, даже замедляет работу, т.к. нужно открыть и прочитать файл, затем десериализовать результат. Список можно продолжать и дальше, но суть в том, что это бардак.

Шаблоны

Шаблоны OpenCart, вы можете подумать, являются просто старым добрым PHP, так что может быть не так? Не так… Система работает таким образом, что она трактует каждый отдельный блок контента на странице как модуль, так что, чтобы добавить что-нибудь — даже что-нибудь настолько простое, как:

<p>asdasd</p>

вы должны создать модуль. А создание модуля состоит из: добавления backend-модуля, которое заключается в копировании существующего пустого модуля, переписывании имен, изменении всех 50 языковых строк и т.д.; затем создания frontend-вида и контроллера для него, и вуаля! - 2 часа спустя вы можете что-то отобразить в браузере. Если простота здесь - основной коммерческий аргумент, то это, наверное, что угодно, но только не просто (или поправьте меня: это просто, но настолько утомительно и отнимает столько времени, что можно сказать, что сложно).

SEO URL

Опять невероятно. Взгляните на этот фрагмент (SEO-обработчик URL):

foreach ($parts as $part) {
    $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = ’" . $this->db->escape($part) . "’");

    if ($query->num_rows) {
        $url = explode(’=’, $query->row[’query’]);

        if ($url[0] == ’product_id’) {
            $this->request->get[’product_id’] = $url[1];
        }

        if ($url[0] == ’category_id’) {
            if (!isset($this->request->get[’path’])) {
                $this->request->get[’path’] = $url[1];
            } else {
                $this->request->get[’path’] .= ’_’ . $url[1];
            }
        }

        if ($url[0] == ’manufacturer_id’) {
            $this->request->get[’manufacturer_id’] = $url[1];
        }


        if ($url[0] == ’information_id’) {
            $this->request->get[’information_id’] = $url[1];
        }
    } else {
        $this->request->get[’route’] = ’error/not_found’;
    }
}


Связывающая таблица url_alias содержит два поля: entity_id=id(идентификатор объекта) и keyword (ключевое слово) для этого объекта. Что произойдет, если у вас есть производитель (manufacturer) и категория (category) с одинаковыми именами, к которым будет произведен запрос... Да, что вы получите в результате - это решать создателям OpenCart. Конечно, они могли бы добавить префиксы category/ к категориям и manufacturer/ к производителям и добавить тип объекта в таблицу рерайта, но зачем заморачиваться.

Вы не можете добавить собственную логику разбора и рерайта, если вы хотите расширить систему (это из-за архитектурных проблем, до которых мы вскоре доберемся), и это значит, что вы находите этот самый блок if и дописываете туда свой код (не забывая также сделать там что-то, чтобы один и тот же ключ не указывал на разные объекты). В методе перезаписи (rewrite), собственно, все так же. В значительной степени - наихудшая система маршрутизации.

Архитектура

Начну с указания на то, что OpenCart не является объектно-ориентированной. Здесь используется объектно-ориентированный синтаксис PHP, но делается все в чисто процедурном стиле. Здесь нет абстракции, нет разделения ответственности, методы вызывают друг друга повсеместно, иногда так, что подсистема налогов и доставки передает ссылку на одну переменную сквозь 10 различных налоговых классов вообще без никакой ясности. Это не является объектно-ориентированным программированием или правильно структурированным приложением. Естественно, вы не можете наследовать и расширить (extend) ни один из сервисов ядра, вы должны модифицировать само ядро.

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

Пожалуйста, не вздумайте использовать это: после установки нескольких модулей, вы придете к тому, что будете работать больше с XML, содержащим PHP, нежели, собственно, с PHP кодом. Огромнейший беспорядок.

Заключение

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

Я посчитал, что неплохо будет поделиться своими впечатлениями с вами, чтобы вы, выбирая платформу для своего проекта, связанного с e-commerce, никогда не рассматривали в качестве варианта OpenCart.

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

Поэтому, если вам кто-то предлагает создать интернет-магазин на OpenCart - это значит, что даный разработчик хочет заработать максимально денег на бесплатной CMS и ему глубоко параллельно как вы дальше будете жить с CMS, которую даже обновить не сможете, т.к. старые модули не будут поддерживать новую версию CMS. Вы же не думаете, что этот товарищ вам бесплатно обновит CMS и зачастую нелицензионные/ломанные модули.  

Источник на буржуйском: http://www.techchattr.com/never-use-opencart


Теги: почему не стоит делать интернет-магазин на OpenCart, ошибки, проблемы и нерациональности в OpenCart, отзывы об OpenCart

Связанные статьи:

Мобильное приложение для продажи товаров / услуг
= всего за 25 тыс.р.
5CMS

Комментарии:

Пока нет комментариев

Написать комментарий




Настоящим подтверждаю, что я ознакомлен и согласен с условиями политики конфиденциальности. Узнать больше

Только у нас!

Вы можете получить приложение с программой лояльности, CRM и Push-рассылками

Всего за 25 тыс.р.!

Узнать больше