Как сделать количество товара в minishop2 дробным?

Приветствую, вопрос этот встречался мне не один раз тут и здесь и ещё вон там, но решения, которое не требует вмешательства в исходники и подробно расписанное, я не нашёл. Поэтому, взяв за основу этот комментарий и получив подсказку от @PG, я сделал следующее:
1. В таблице ms2_order_products был изменен тип поля count с int на decimal.
2. Был создан файл core/components/minishop2/plugins/floatcount/index.php со следующим содержимым:
<?php
return array(
    'map' => array(
        'msOrderProduct' => require_once 'msorderproduct.map.inc.php',
    )
);
3. Был создан файл core/components/minishop2/plugins/floatcount/msorderproduct.map.inc.php со следующим содержимым:
<?php

return array(
    'fields' => array(
        'count' => null,
    ),
    'fieldMeta' => array(
        'count' => array(
            'dbtype' => 'decimal',
            'precision' => '13,3',
            'phptype' => 'float',
            'attributes' => 'unsigned',
            'null' => true,
            'default' => 1.0,
        ),
    )   
);
4. Был расширен класс корзины , а именно
4.1 из файла core/components/minishop2/model/minishop2/mscarthandler.class.php копируем метод add;
4.2 создаем файл core/components/minishop2/custom/cart/customCartHandler.class.php и вставляем в него код
<?php
if(!class_exists('msCartInterface')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/mscarthandler.class.php';    
}
class customCartHandler extends msCartHandler implements msCartInterface{

//сюда вставляем скопированный метод

}
4.3 в новом файле вместо
$count = intval($count);
напишем
$count = floatval($count);
4.4 в системных настройках по ключу ms2_cart_handler_class меняем класс корзины на customCartHandler;
4.5 здесь же по ключу ms2_services находим список кастомных служб minishop2 и если там cart:[], то меняем на
"cart":{"customcarthandler":"{core_path}components\/minishop2\/custom\/cart\/customCartHandler.class.php"},
если там что-то типа
"cart":{"someservice":"{core_path}components\/minishop2\/custom\/cart\/someHandler.class.php"},
то дописываем в конец, вот так
"cart":{"someservice":"{core_path}components\/minishop2\/custom\/cart\/someHandler.class.php","customcarthandler":"{core_path}components\/minishop2\/custom\/cart\/customCartHandler.class.php"},

В целом это всё, но есть нюансы.
Во-первых, я добавлял новый класс корзины вручную, но в документации написано как это можно сделать через Console.
Во-вторых, файлы плагина были добавлены простым способом, но в документации есть ещё рекомендованный, кто хочет, может использовать его.
В-третьих, если при редактировании количества товара в админке нужна точность до 3-х знаков, то нужно скопировать файл assets/components/minishop2/js/mgr/orders/orders.window.product.js в /assets/components/minishop2/plugins/orders.window.product.js и после 30-ой строки вставить
decimalPrecision: 3,
а затем написать плагин, который этот файл подключит
<?php
switch ($modx->event->name) {
    case 'msOnManagerCustomCssJs':
        if ($page != 'orders') return;
        $modx->controller->addHtml('<script src="/assets/components/minishop2/plugins/orders.window.product.js" type="text/javascript"></script>');
    break;
}

Как сказал @PG «есть красивее способы», «extjs можно переопределять и расширять», но это уже по желанию.

P.S. @PG подсказал ещё один способ сделать то же самое, но через плагины modx. Вместо п.п. 2 и 3 надо сделать как написано в этой заметке
Артур Шевченко
20 июня 2021, 19:26
modx.pro
3
1 463
+1
Поблагодарить автора Отправить деньги

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

Павел Гвоздь
21 июня 2021, 05:38
+1
4.5 здесь же по ключу ms2_services находим список кастомных служб minishop2 и если там cart:[], то меняем на…
если там что-то типа…
то дописываем в конец, вот так...
А это для кого? Есть же API, зачем лезть руками в настройки, да ещё приучать разработчиков к этому?
    Артур Шевченко
    21 июня 2021, 10:30
    0
    Изначально я хотел остановиться на пункте 4, но решил, что раз это инструкция пошаговая надо все шаги написать, а ссылка на документацию есть в пункте 4, но когда нет доступа к Console лично я не знаю как пользоваться API, поэтому сделал всё руками. К тому же не лишним будет объяснить, что происходит, когда делают так
    if ($miniShop2 = $modx->getService('miniShop2')) {
        $miniShop2->addService('payment', 'CustomerAccount',
            '{core_path}components/msprofile/model/msprofile/customeraccount.class.php'
        );
    }
Дмитрий
24 января 2024, 16:27
0
Спасибо, пригодилось
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7