[miniShop2] Релиз новой версии 4.4.0

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

Ниже расскажу, что в него попало.


Сразу скажу — лично я для себя закрыл тему с miniShop2 — хотелось бы уже третью версию запустить и не тратить силы на предыдущую.
Но ребята решили иначе и с долей энтузиазма вносили свои пул реквесты.
Роль лидера и движущей силы взял на себя @Евгений Webinmd, проверяя, вливая все обновления. Он же и написал треть всех новшеств. За что ему большое спасибо.

Из наиболее заметного хочу упомянуть следующее.

Управление стоимостью доставки оформленного заказа



Дает возможность менеджеру управлять стоимостью доставки. Прямо в админке, у заказа появилось поле, изменения стоимости доставки. Нет никаких уведомлений и прочего, просто прямое изменение значения. Пользоваться этой возможностью или нет, решать вам.



Удалены конфиги fotorama


На самом деле мы давно договорились, подобного рода библиотеки корректнее использовать внутри шаблона, а не загружать из компонента. Если у вас интернет-магазин, то почти наверняка в шаблоне уже есть какая то галерея или лайтбокс.
У @Руслан Алеев наконец дошли руки до конца удалить скрипт из компонента.

Добавлен пропущенный rank равный нулю в сниппете msGetOrder



Если у товара более одного изображения, то в результате будет попадать рандомное изображение. Проблема присутствует, если использовать вызов сниппета с параметром includeThumbs.

Проблемы с удалением опций



Не удаляются ресурсы в корзине. Не удаляются опции у категорий.
В логе сервера при этом ошибки вида:
PHP Fatal error:  Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, string given in .../core/components/minishop2/model/minishop2/mscategoryoption.class.php:<actual line>
В PHP 8 более строгая проверка типов. Мы больше не можем использовать string в count(), т.к. она принимает в качестве аргумента только Countable|array. В коде же мы записываем в переменную $products результат implode() (которая всегда возвращает string) и передаём это в count(), что приводит к ошибке (исключение TypeError):

$products = implode(',', $products); 
 $key = $this->getOne('Option')->get('key'); 
 $key = $this->xpdo->quote($key); 
 if (count($products) > 0) {


Добавлена возможность пропускать товары при перегенерации изображений


Добавлено поле для указания сколько товаров пропускать от начала при перегенерации изображений в галерее товаров.
Иногда скрипт не отрабатывает до конца, этот функционал позволит не начинать каждый раз с одних и тех же товаров

Исправление пропадания опций у товаров с несколькими категориями



Суть проблемы

Начиная с MySQL 5.7.5 по-умолчанию включён режим ONLY_FULL_GROUP_BY. В этом режиме мы не можем в запросе выбирать поля, которые не перечислены в GROUP BY, не определены явно в результаты группировки или для которых не применяются функции агрегации.

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

#1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'sandbox_print.msCategoryOption.rank' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Можно, конечно, отключить ONLY_FULL_GROUP_BY, но это уже более костыльный вариант, тем более что у самого modx с этим режимом проблем нет.

Как решено
Первичный ключ (поля option_id и category_id) таблицы ms_category_options, с которой джойнится таблица ms_options в запросе из msProductData::prepareOptionListCriteria(), добавлен в GROUP BY.

Также есть ряд более мелких исправлений и дополнений



Спасибо за внимание. Прошу вопросы по MiniShop3 придержать — по этому поводу, готовлю отдельную статью.
Николай Савин
06 августа 2024, 15:25
modx.pro
806
+24
Поблагодарить автора Отправить деньги

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

Артур Шевченко
06 августа 2024, 16:26
0
@Евгений Webinmd ты косарик себе взял за труды?)
    Евгений Webinmd
    06 августа 2024, 16:44
    0
    боюсь что потом за этот косарик буду должен отработать неделю
    Марат
    13 августа 2024, 12:50
    0
    Есть возможность оставить Фотораму при установке?
    Очень к ней привык и не хочется велосипед изобретать
      Николай Савин
      13 августа 2024, 13:06
      0
      Это же просто JS плагин. Что мешает его подключить в шаблон самостоятельно?
        Марат
        13 августа 2024, 13:28
        0
        Так-то там всё можно самостоятельно написать и подключить…
          Николай Савин
          13 августа 2024, 13:32
          +1
          О чем тогда речь?
          Я искренне не вижу проблем сделать в шаблоне примерно вот так

          <link href="/ajax/libs/fotorama/4.6.4/fotorama.css" rel="stylesheet">
          <script src="/ajax/libs/fotorama/4.6.4/fotorama.js"></script>
          alex87.ru
          13 августа 2024, 15:26
          0
          Просто оставьте чанк MSGalleryFotorama к примеру где подключена фоторама по CDN и сделан вызов галереи, а вообще хотелось бы что-то более интересное в плане галереи, например fancyapps.com/carousel/#combine (тоже в отдельный чанк к примеру)
        Alexey
        16 августа 2024, 09:32
        0
        Спасибо за труд!
        skrinshoter.ru/s/160824/aSRanUBk — я правильно понимаю, что эта версия компонента поддерживает php 8+?
          Николай Савин
          16 августа 2024, 16:34
          +1
          8.0 с небольшими нюансами поддерживает. А вот с 8.1 будет больше забот.
          Александр
          04 ноября 2024, 11:44
          0
          А для чего удалили ссылку на $customer в методе getCustomerId? Теперь в событие msOnBeforeGetOrderCustomer передается всегда null и после события тоже всегда null и осталась бесполезная проверка, которая всегда выполняется, при этом на $customer в событии msOnBeforeGetOrderCustomer никак не повлиять, об этом даже pull request есть. Верните, пожалуйста, ссылку обратно)
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10