Добрый день.
Немного истории вот где то года три назад я начал свой путь в работе с 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% задач что ставлятса к кодингу доходит редко и економит просто уйму времени. С версткой аналогично создаеш блок и подтягиваеш в нужное место и живеш и радуешся жизни.
Ну думал написать по больше но с временем не сложилось. Может потом добавлю что то.