Возникла такая ситуация: доски продаются упаковками, а в каждой упаковке дробное количество квадратных метров. Цена указывается для квадратного метра.
Получается, нужно менять количество шагами равными количеству кв. м. в одной пачке.
Чтобы можно было использовать дробное количество товара нужно поменять тип поля с количеством в таблицах виртуемарта.
- Меняем в таблице virtuemart_products поле product_in_stock с integer на float.
- И в таблице virtuemart_order_items также меняем поле product_quantity.
Теперь нужно изменить поведение блока выбора цены. При увеличении-уменьшении количества товара, значение поля меняется с помощью javascript. Код этот находится в файле
components\com_virtuemart\assets\js\vmprices.js
- Открываем файл в текстовом редакторе и ищем все вхождения слова quantity. Если для поля количества используется приведение к целому parseInt, то мы меняем тип с целого на float - parseFloat.
При нажатии кнопки Добавить в корзину данные о количестве передаются ajax запросом в файл
components\com_virtuemart\helpers\cart.php
- Теперь и в этом файле нужно изменить обработку для типа числа. Ищем опять слово quantity и меняем приведение к int на приведение к float.
Еще вот такой странный момент..
Когда я заменил на строке 722 функцию getInt на getFloat, то почему-то последнее значение, массива с количеством, неправильно преобразовывалось - удалялась точка в последней числе, именно не везде, а в последнем). Поэтому, на этой строке я вместо getFloat сделал getString
После этого все работает, но не совсем правильно, почему-то добавляется лишняя единица к количеству товара.
Я закомментировал строчку
$quantity = $quantity + ($quantity%$step);
После этого количество товаров передавалось в корзину правильно.
Также можно еще подредактировать языковую константу COM_VIRTUEMART_CART_STEP_ORDER, чтобы выводилось дробное число в сообщении. Для этого меняем %d на %s.
Подробнее...