Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...
  • записів
    6
  • коментарів
    128
  • перегляд
    4 081

Взгляд на Opencart после Magento и других продвинутых систем


konorws

27 063 перегляди

Добрый день.

Немного истории вот где то года три назад я начал свой путь в работе с Opencart. Скажем так полюбил я Opencart всем сердцем.

Но в один солнечный день мне пришел лист о том что я прошел собеседование в относительно большую IT кампанию. И с того дня мой взгляд на хороший код изменился... 

Вот не так давно меня попросили немного доработать функционал на OC. Мне не сложно в принципе вот я и приступил к работе. Я сидел и говорил себе Боже как я раньше с этим работал.

 

Ну теперь давайте я вам попробую описать то что меня возмутило.

 

1. Удобство разработки и интеграция в IDE

Да когда я работал с Sublime Text все было вроде гуд. Но уже полгода работаю через PhpStorm (PS. Лицензия есть даже на домашнем ПК а не только на работе).

При запуске сразу получаем кучу предупреждений. Давайте взглянем на простой класс http://joxi.ru/52alLM0UGzO1Om

Причин тут две:
1) Отсутствие PhpDoc

2) Упрощенная структура самой CMS

Ну если добавить PHPDoc то большую часть проблем это реши. 
Зачем нужен PHPDoc ??
Я напишу коротко если будет интересно загуглите.

1) Это читабельность кода
2) Автокомплит и информация о методах на лету  http://joxi.ru/brRZkROHQveeLr как не крути сразу видно что и как надо передавать тому или другому методу или то что он возвращает. Или же увидеть ошибку на моменте написания кода а не запуска.

 

2) Это наверное бесит меня на данный момент больше всего. Это дублирования кода.

Хотя Опенкарт и как бы MVC но он нарушает один из принципов MVC потому что с дублирование кода тут просто беда.

Давайте посмотрим на один из контроллеров админ панели. http://joxi.ru/nAyKdw3tXz1oVm 
И это один из множества примеров. который есть в каждом файле я молчу о генерации $url вот пример из файла файла покупателя. Этот кусок кода встереатся в одном файле 9 раз. ????? 
Давайте посчитаем: 9 * ~40 строк = ~360 строчек кода которые можно отрефакторить к 20 максимум и будет один метод для всех файлах а в контролере это будет одна строка вместо 40  

			$url = '';

			if (isset($this->request->get['filter_name'])) {
				$url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
			}

			if (isset($this->request->get['filter_email'])) {
				$url .= '&filter_email=' . urlencode(html_entity_decode($this->request->get['filter_email'], ENT_QUOTES, 'UTF-8'));
			}

			if (isset($this->request->get['filter_customer_group_id'])) {
				$url .= '&filter_customer_group_id=' . $this->request->get['filter_customer_group_id'];
			}

			if (isset($this->request->get['filter_status'])) {
				$url .= '&filter_status=' . $this->request->get['filter_status'];
			}

			if (isset($this->request->get['filter_approved'])) {
				$url .= '&filter_approved=' . $this->request->get['filter_approved'];
			}

			if (isset($this->request->get['filter_ip'])) {
				$url .= '&filter_ip=' . $this->request->get['filter_ip'];
			}

			if (isset($this->request->get['filter_date_added'])) {
				$url .= '&filter_date_added=' . $this->request->get['filter_date_added'];
			}

			if (isset($this->request->get['sort'])) {
				$url .= '&sort=' . $this->request->get['sort'];
			}

			if (isset($this->request->get['order'])) {
				$url .= '&order=' . $this->request->get['order'];
			}

			if (isset($this->request->get['page'])) {
				$url .= '&page=' . $this->request->get['page'];
			}

А теперь представте волшебство Если бы можна было бы так

$url = $this->url->saveUrlParametrs('filter_name', 'filter_email', 'filter_customer_group_id');

И подобных ситуаций уйма. Про дублирование верстки я молчу вообще. Чтоб добавить чтото к товару нада єто продлублировать в 100500 файлах.
В мадженте к примеру страница редактирования или список в админке создается с помощью двох XML файлов где просто описиваются конфигурации и єтими конфигами можна решить около 75% задач что ставлятса к кодингу доходит редко и економит просто уйму времени. С версткой аналогично создаеш блок и подтягиваеш в нужное место и живеш и радуешся жизни.

 

Ну думал написать по больше но с временем не сложилось. Может потом добавлю что то.


 

118 коментарів


Recommended Comments



В 01.10.2019 в 15:25, EVMedvedev сказал:

Ну при разработке - да, в какой то степени. У каждого свой техпроцесс, а значит и настройки среды.

При разработке много и часто. 
А еще очень часто используется для работы по крону в виде фоновых задач. Которые запускаются по несколько раз в день.

Надіслати

У Мадженто имеется еще одно существенное отличие от ОС. В движке есть возможность модифицировать функционал и ядра и модулей сторонних разработчиков не трогая их кода, просто заменяя функции своими override (ом). Это дает большие плюсы при групповой работе над сложным проектом при его долгосрочной поддержке и развитии. ОС с его vqmod и другими архитектурными решениями подходит только для работы одни разработчиком или же сами владельцем ИМ при наличии начальных знаний по программированию на PHP. Вот почему многие владельцы ИМ по мере роста бизнеса и возникновения потребностей в развитии сайта отказываются от ОС и переходят на другие платформы. И реакция ТС на ОС с переходом в крупную компанию с промышленными технологиями командной разработки софта на самом деле вполне типична. 

Надіслати

Я тоже так могу:

Цитата

class Foo
{
    public function 
printItem($string)
    {
        echo 
'Foo: ' $string PHP_EOL;
    }
    
    public function 
printPHP()
    {
        echo 
'PHP просто супер.' PHP_EOL;
    }
}

class 
Bar extends Foo
{
    public function 
printItem($string)
    {
        echo 
'Bar: ' $string PHP_EOL;
    }
}


$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Выведет: 'Foo: baz'
$foo->printPHP();       // Выведет: 'PHP просто супер' 
$bar->printItem('baz'); // Выведет: 'Bar: baz'
$bar->printPHP();       // Выведет: 'PHP просто супер'

источник (https://www.php.net/manual/ru/language.oop5.inheritance.php). И что? Причем здесь ОС?

Надіслати
53 минуты назад, nikifalex сказал:

так я дал пример как это сделать в ОС

чтобы не говорили что так нельзя.

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

Надіслати
В 13.05.2020 в 12:03, EVMedvedev сказал:

У Мадженто имеется еще одно существенное отличие от ОС. В движке есть возможность модифицировать функционал и ядра и модулей сторонних разработчиков не трогая их кода, просто заменяя функции своими override (ом). Это дает большие плюсы при групповой работе над сложным проектом при его долгосрочной поддержке и развитии. ОС с его vqmod и другими архитектурными решениями подходит только для работы одни разработчиком или же сами владельцем ИМ при наличии начальных знаний по программированию на PHP. Вот почему многие владельцы ИМ по мере роста бизнеса и возникновения потребностей в развитии сайта отказываются от ОС и переходят на другие платформы. И реакция ТС на ОС с переходом в крупную компанию с промышленными технологиями командной разработки софта на самом деле вполне типична. 

А системы событий не хватает?

Надіслати
3 часа назад, optimlab сказал:

А системы событий не хватает?

 

Это еще одно слабое место в ОС по сравнению с Magento. В последней можно навешивать события на работу практически любого класса. Там есть динамически формируемая система событий, с которыми можно связывать обработчики (before и after). В ОС такого механизма нет и события задаются вручную. Это все же ограничение, которое как раз и подметил коллег @chukcha . В Мадженто такой проблемы нет, потому что там есть классы взаимодействия с данными в БД (работающие одинаково и во фронте и в админке в отличие от ОС), на любой из которых можно навешивать обработчики. А с учетом единого механизма такая же возможность сохраняется и в отношении кода сторонних разработчиков.

И события не заменяют возможностей overrid, а скорее дополняют.

 

Змінено користувачем EVMedvedev
Надіслати
2 часа назад, optimlab сказал:

@chukcha , согласен, в некоторых местах проще окмод-ом. Ну он обещает: // In future version we can use runkit

Посмотрим что из этого выйдет..

 

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

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

Змінено користувачем EVMedvedev
Надіслати
23 минуты назад, EVMedvedev сказал:

з нескольких десятков или даже сотен изменений, вносимых десятком кодеров, причем в одни и те же файлы. Замучаетесь устранять конфликты.

Недавно видел 5 страниц модификаторов  + еще с десятка два в system

Событиями не все разрулишь

самый простой пример - Это опции
Добавить новый тип опции, его нужно обработать как минимум в 4-х местах + шаблон
Т.е. нужны еще внутренние события, или хотя бы отдельные контроллеры/модули
 

Надіслати
44 минуты назад, chukcha сказал:

Недавно видел 5 страниц модификаторов  + еще с десятка два в system

Событиями не все разрулишь

самый простой пример - Это опции
Добавить новый тип опции, его нужно обработать как минимум в 4-х местах + шаблон
Т.е. нужны еще внутренние события, или хотя бы отдельные контроллеры/модули
 

 

А что имеется ввиду под новым типом опций?  В Мадженто можно задавать атрибуты с разными типами данных и доступные в коробке типы покрывают весь спектр основных типов данных (числа, цены, дата-время, строки, логические) а так же добавлены перечисляемые типы с единичным и множественным выбором. Этого хватает чтобы описать любой атрибут (опцию). И использовать модификации кода в классах модели данных нет необходимости. А вот то, что в ОС нужно контроллеры модифицировать - это архитектурная проблема. Это неверное использование MVC паттерна. В Мадженто контроллеры вообще ни когда не модифицируются. В это просто нет необходимости.

Надіслати

например вам нужна, особая опция из чекбоксов, потмоу как у нее особое поведение

Или вот еще лучше
опция размер ширина и длина
Вы создаете особуй тип опции - опция размер
Добавляете в товар
Выводите  form-inline

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

Для этого на фронте нужно проверить тип
и вывести в шаблон
А также.. в корзине..
Может еще где..

 

8 минут назад, EVMedvedev сказал:

В это просто нет необходимости.

Сильно сомневаюсь

 

Хотя наверное соглашусь, что не хватает некого понятия сырых данных
например получили product_info, но за пределами контроллера его нет - т.е. тяни из базы
но все это вполне реализуемо.. Памяти будет жрать поболее, но зато экономия на запросах



 

Надіслати
44 минуты назад, chukcha сказал:

но все это вполне реализуемо.. Памяти будет жрать поболее, но зато экономия на запросах

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

 

Надіслати
9 минут назад, optimlab сказал:

И как вы его реализовали, поделитесь решением?

Получаю нужный контент
И пихаю в config или registry

В нужном месте проверяю наличие ресурса, и в случае отсутсвия делаю запрос

Т.к. по сути  объем не очень велик, то over memory не существенен

  • +1 1
Надіслати
1 час назад, chukcha сказал:

например вам нужна, особая опция из чекбоксов, потмоу как у нее особое поведение

Или вот еще лучше
опция размер ширина и длина
Вы создаете особуй тип опции - опция размер
Добавляете в товар
Выводите  form-inline

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

Для этого на фронте нужно проверить тип
и вывести в шаблон
А также.. в корзине..
Может еще где..
 

С чекбоксами в Мадженто это реализацется логическими атрибутами. Нужно только для фронта сделать правку в шаблоне, чтобы для нужного атрибута выдавался не селект (да/нет), а чекбокс.

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

У атрибутов Мадженто удобно то, что численные типы хранятся в базе как числа и поэтому их можно включать в состав атрибутов, по которым доступна сортировка. То есть для сортировки задать любое множество атрибутов (они же опции в ОС). И это делается в админке одним кликом.

Надіслати
2 часа назад, chukcha сказал:

 

Хотя наверное соглашусь, что не хватает некого понятия сырых данных
например получили product_info, но за пределами контроллера его нет - т.е. тяни из базы
но все это вполне реализуемо.. Памяти будет жрать поболее, но зато экономия на запросах

В Мадженто используется объекты модели и коллекции таких обхектов. Если не пишете SQL запросы, а создаете коллекции объектов то по умолчанию грузятся для каждого объекта все данные. Для этого Мадженто строит на основе RAW дата плоские таблицы, для ускорения работы (оригинальные данные хранятся в EAV структуре и без плоских таблиц движок становится очень тормозной и ресурсоемкий). А если нужно экономить память, то можно использовать механизм конструирования запроса через имеющийся ORM-инструмент типа QueryBuilder в Doctrine. 

Змінено користувачем EVMedvedev
Надіслати
1 час назад, chukcha сказал:

Получаю нужный контент
И пихаю в config или registry

В нужном месте проверяю наличие ресурса, и в случае отсутсвия делаю запрос

Т.к. по сути  объем не очень велик, то over memory не существенен

Красавчик!! Лайк!

Вечером протестирую..

 

Причем сам же в этом модуле обманывал конфиг, а не догадался туда отправить..

Надіслати

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.