Возникла такая ситуация: доски продаются упаковками, а в каждой упаковке дробное количество квадратных метров. Цена указывается для квадратного метра.

Получается, нужно менять количество шагами равными количеству кв. м. в одной пачке.

Чтобы можно было использовать дробное количество товара нужно поменять тип поля с количеством в таблицах виртуемарта. 

  • Меняем в таблице 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);
Она находится примерно на 1702 строке файла cart.php

После этого количество товаров передавалось в корзину правильно.

Также можно еще подредактировать языковую константу COM_VIRTUEMART_CART_STEP_ORDER, чтобы выводилось дробное число в сообщении. Для этого меняем %d на %s.

Чтобы сделать комментарий, нужно авторизоваться на сайте!