Хотим того или не хотим, но она все равно будет Основная цель сборки - уйти от окмодов и перенести все на события Т.е. в четверке нет модификаторов Но как писать модули На примере простейшего модуля 1. install.xml - обязан быть Код: <?xml version="1.0" encoding="UTF-8"?> <modification> <name>Название</name> <version>4.0</version> <author>Автор</author> <link>Ссылка</link> </modification> Без него ничео не станет 2. Структура папок UPLOAD - Admin - Catalog - System Нет теперь подпапки extension Все будет развернуто в папку модуля, или папку вашего пространства Еще попробую.. Но должно сработать Если у вас 10500 своих модулей, то очень удобно бросать все в Свое пространство Ведь именно так развернуто дефолтный комплект модулей Пространство создается из названия файла Поэтому вы грузите my_name.ocmod.zip для любого мода внутри (надо пробовать) Файлы для установки после загрузки грузятся в storage/marketplace будет ли далее ocmod или ocmod4 не понятно, но тема уже поднималась Пока на этом все зы следите за namespace при написании модуля.
Что есть хорошо, что есть плохо Начну с плохо, или я не понял Доступ к своим стилям и скриптам Но в коде не увидел т.е. все в своих папках И.. тут оно же хорошо Никто не перепишет ваши скрипты загрузкой своих обновлений, Это касается плагинов и версий Плохо.. или Хорошо аddScript('/extension/mymodule/admin/view... и т.д.)
Кому как. Мне пока не очень нравится 4х Пока вижу, что система становится "сложнее". События они не всегда прозрачны, проблемы с отладкой. Свои пространства для модулей, может хорошо, но тут тоже не все так гладко., как написали выше, кто будет сравнивать подключенные скрипты? Держите нас в курсе
Пока такое мое мнение Повышается порог вхождения Кому как.. но мне нравится.. Отладка? Да, есть минус.. и тут же плюс.. Вы имеете данные которые пришли и только с ними, проверил порядок применения событий Но!!!! бегать по окмодам, если эти окмоды разбросаны.. Тоже не айс Я уже адаптировал пару своих модулей - для изучения Один для витрины, второй для админки На первом сильно обжегся, второй - почти сразу взлетел Сложность будет для модулей работающих с сырыми данными пример Добавить поле mpn в списки товара на витрине Код: foreach ($results as $result) { if (is_file(DIR_IMAGE . html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'))) { $image = $this->model_tool_image->resize(html_entity_decode($result['image'], ENT_QUOTES, 'UTF-8'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height')); } else { $image = $this->model_tool_image->resize('placeholder.png', $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_product_height')); } if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) { $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); } else { $price = false; } if ((float)$result['special']) { $special = $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); } else { $special = false; } if ($this->config->get('config_tax')) { $tax = $this->currency->format((float)$result['special'] ? $result['special'] : $result['price'], $this->session->data['currency']); } else { $tax = false; } $product_data = [ 'product_id' => $result['product_id'], 'thumb' => $image, 'name' => $result['name'], 'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..', 'price' => $price, 'special' => $special, 'tax' => $tax, 'minimum' => $result['minimum'] > 0 ? $result['minimum'] : 1, 'rating' => $result['rating'], 'href' => $this->url->link('product/product', 'language=' . $this->config->get('config_language') . '&path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url) ]; $data['products'][] = $this->load->controller('product/thumb', $product_data); } НУ ПОЧЕМУ!!!! он меня ограничивает этими данными??? Неужели сложно отдать $data['products'][] = $this->load->controller('product/thumb', $product); И пусть тумба сама разбирается что ей нужно А тут я могу уже на сырых данных пользовать свои события (напишу issue) Чего мне не хватает - это событийного queryBuider Но тогда... модель превращается в один метод
Наконец-то убрал либу пагинации и перенес ее в common/pagination Подумаешь? Не.. это уже очень хорошо, теперь можно делать нормальную, красивую пагинацию, со своими плюшками ВНИМАНИЕ!!!! НЕ существует!!!! $this->config->get('config_limit_admin'), Ибо нефик будки расслаблять (вот вам замена) $this->config->get('config_pagination') Эх еще бы и ХК...
чтоб жизнь малиной не казалась и чтоб было меньше совместимости.. Код: public function link($route, $args = '', $js = false) { $url = $this->url . 'index.php?route=' . (string)$route; Не поняли? напомню Код: public function link($route, $args = '', $secure = false) { Теперь поясню.. Ранее явно нужно было указывать протокол теперь третий параметр используется для валидности меняем & на & (валидно в html, но не валидно в js) Это надо чтобы в скриптах можно было указывать и токен в них не тащить url: '{{ same_url }}'
изменена версия font-awesone Понимаю, что беда не велика и это не проблема Даниеля но некоторые символы имеет другой класс