Делаем дробное количество товаров в MiniShop2

Всем привет! Было дело, меня попросили помочь сделать на сайте дробное количество товаров…
Само собой погуглил, нашёл от силы 3-4 вопроса на эту тему и 1 статью от @Артур Шевченко за которую ему большое спасибо. Которая однако, к сожалению не помогла полностью решить вопрос, т.к. возможно способ уже устарел.



Итак, погнали:
1. Открываем через phpMyAdmin таблицу modx_ms2_order_products, переходим во вкладку «Структура», нажимаем «Изменить» у поля count.
Выставляем значения:
  • Тип — DECIMAL
  • Длина/Значения — 13,3
  • По умолчанию — NULL
Должно получиться вот так:


2. Скачиваем файл и загружаем его по следующему пути:
core/components/minishop2/custom/cart/
Переименовываем его в customCartHandler.class.php (т.е. меняем название вместе с форматом файла с .txt на .php)

3. Открываем консоль и выполняем код:
<?php
if ($miniShop2 = $modx->getService('miniShop2')) {
    $miniShop2->addService('cart', 'customCartHandler',
        '{core_path}components/minishop2/custom/cart/customCartHandler.class.php'
    );
}

Переходим в Системные настройки -> MiniShop2 -> Корзина, или ищем по ключу ms2_cart_handler_class и меняем его значение с msCartHandler на наш новый customCartHandler.

4. Создаём плагин changeCountOnFloat со следующим содержимым:
<?php
switch ($modx->event->name) {
	case 'OnMODXInit':
		$modx->loadClass('msOrder');
		$modx->map['msOrder']['fields']['count'] = null;
		$modx->map['msOrder']['fieldMeta']['count'] = array(
			'dbtype' => 'decimal',
                        'precision' => '13,3',
                        'phptype' => 'float',
                        'attributes' => 'unsigned',
                        'null' => true,
                        'default' => 1.0,
		);
		break;
}
Во вкладке Системные события ставим галочку у OnMODXInit.

5. Теперь дело за малым, меняем везде в коде товара (карточки/страница) input name=«count», на какой именно писать не буду, у всех свои классы стилизации и условия, главное отмечу, что надо изменить/добавить min=«0.**», max="" и step=«0.**»

P.S. Если на Вашем сайте предполагается добавление товаров в корзину от 0.1 или от 0.01, то необходимо поправить скрипт:
assets/components/minishop2/js/web/default.js
Здесь находим
if (status['total_count'] < 1) {
и вместо 1 ставим 0.1 или 0.01

Вот и всё, если что то упустил, или можно сделать какой то шаг проще, пишите, буду очень благодарен!

Поблагодарить автора, а также немного порадовать других активных участников сообщества можно,
отправив донат одним из следующих способов:
Спасибо за внимание!
Денис Усманов
17 мая 2023, 15:08
modx.pro
4
657
+10

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

Александр
26 мая 2023, 11:02
+1
Не понял зачем плагин, я делал без него меняя класс корзины и JS. Вообще ничего вроде больше не трогал. Отлично работает. Только обычно когда реализовывается добавление дробного кол-ва товаров нужно отображать в миникорзине(если такая есть) не кол-во товаров всего, а кол-во позиций в корзине.

UPD: Понял зачем плагин. Закинул клиенту где делал такой функционал :)
    Денис Усманов
    26 мая 2023, 11:05
    0
    Всё равно тут поясню зачем) Затем, что бы Minishop2 воспринимал поле count как DECIMAL а не INT.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2