Как сделать количество товара в minishop2 дробным?
Приветствую, вопрос этот встречался мне не один раз тут и здесь и ещё вон там, но решения, которое не требует вмешательства в исходники и подробно расписанное, я не нашёл. Поэтому, взяв за основу этот комментарий и получив подсказку от @PG, я сделал следующее:
1. В таблице ms2_order_products был изменен тип поля count с int на decimal.
2. Был создан файл core/components/minishop2/plugins/floatcount/index.php со следующим содержимым:
4.1 из файла core/components/minishop2/model/minishop2/mscarthandler.class.php копируем метод add;
4.2 создаем файл core/components/minishop2/custom/cart/customCartHandler.class.php и вставляем в него код
4.5 здесь же по ключу ms2_services находим список кастомных служб minishop2 и если там cart:[], то меняем на
В целом это всё, но есть нюансы.
Во-первых, я добавлял новый класс корзины вручную, но в документации написано как это можно сделать через Console.
Во-вторых, файлы плагина были добавлены простым способом, но в документации есть ещё рекомендованный, кто хочет, может использовать его.
В-третьих, если при редактировании количества товара в админке нужна точность до 3-х знаков, то нужно скопировать файл assets/components/minishop2/js/mgr/orders/orders.window.product.js в /assets/components/minishop2/plugins/orders.window.product.js и после 30-ой строки вставить
Как сказал @PG «есть красивее способы», «extjs можно переопределять и расширять», но это уже по желанию.
P.S. @PG подсказал ещё один способ сделать то же самое, но через плагины modx. Вместо п.п. 2 и 3 надо сделать как написано в этой заметке
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 надо сделать как написано в этой заметке
Поблагодарить автора
Отправить деньги
Комментарии: 7
4.5 здесь же по ключу ms2_services находим список кастомных служб minishop2 и если там cart:[], то меняем на…А это для кого? Есть же API, зачем лезть руками в настройки, да ещё приучать разработчиков к этому?
если там что-то типа…
то дописываем в конец, вот так...
Изначально я хотел остановиться на пункте 4, но решил, что раз это инструкция пошаговая надо все шаги написать, а ссылка на документацию есть в пункте 4, но когда нет доступа к Console лично я не знаю как пользоваться API, поэтому сделал всё руками. К тому же не лишним будет объяснить, что происходит, когда делают так
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addService('payment', 'CustomerAccount',
'{core_path}components/msprofile/model/msprofile/customeraccount.class.php'
);
}
Подскажите, какой товар продаётся с дробью?
Что значит какой? Любой какой вам надо.
Значит тип товара. Автозапчасти, продукты питания и т.п.
продукты питания
Спасибо, пригодилось
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.