В этой небольшой статье мы рассмотрим ситуацию когда вместо стандартного поля ввода количества нужно показать выпадающий список.
Это часто используется, например, в чайных магазинах.
При клике на кнопку Купить из формы с классом product собираются значения всех полей и передаются на сервер. За количество отвечает поле с атрибутом name="quantity[]"
.
Он выводится в файле /components/com_virtuemart/sublayouts/addtocartbar.php кодом
1 2 3 4 5 6 7 8 9 10 11 |
<span class="quantity-box"> <input type="<?php echo $editable ?>" class="quantity-input js-recalculate" name="quantity[]" data-errStr="<?php echo vmText::_ ('COM_VIRTUEMART_WRONG_AMOUNT_ADDED')?>" value="<?php echo $init; ?>" init="<?php echo $init; ?>" step="<?php echo $step; ?>" <?php echo $maxOrder; ?> /> </span> <?php if ($product->orderable) { ?> <span class="quantity-controls js-recalculate"> <input type="button" class="quantity-controls quantity-plus"/> <input type="button" class="quantity-controls quantity-minus"/> </span> <?php } |
Соответственно, чтобы вывести количество в выпадающем списке, этот код нужно заменить на тег select с тем же атрибутом name="quantity[]"
.
Используем в новом коде максимальное значение количества по умолчанию. Если в настройках товара будет указано минимальное, максимальное значение и шаг, то они также будут учитываться.
Конечный код код будет следующий.
1 2 3 4 5 6 7 8 9 10 11 |
<?php $maxNumber = ($maxOrder) ? preg_replace("/[^0-9]/", '', $maxOrder) : 10; // 10 - максимальное значение по умолчанию ?> <span class="quantity-box"> <select name="quantity[]"> <?php for ($i = $init; $i <= $maxNumber; $i += $step) { ?> <option value="<?php echo $i; ?>"><?php echo $i; ?> шт.</option> <?php } ?> </select> </span> <?php |
В итоге на сайте это будет выглядеть так.
Если нужно вывести выбор количества каким-то другим способом, то пишите вопросы в комментариях, постараюсь дополнить статью.
Виталий
Здравствуйте, а если нужны дробные варианты, например, 1.2, 1.5 ?
admin
Здравствуйте!
Вы можете прислать пример магазина где это реализовано?
denism300
Несколько лет назад я пытался реализовать подобное для магазина напольных покрытий, но работало все через одно место, поэтому, на это дело забил.
Если вкратце, то так (было актуально для VM-2, в VM-3, возможно, по-другому):
/components/com_virtuemart/assets/js/vmprices.js
заменить все вхождения parseInt на parseFloat
\components\com_virtuemart\helpers\cart.php
заменить
на
В базе данных
#__virtuemart_products поле product_in_stock с integer на float
#__virtuemart_order_items поле product_quantity с integer на float
после каждого обновления VM проделать пункты выше заново.
в настройках товара поменять шаг по изменению количества (например, 0,1)
работать будет, но количество товара при изменении шага по 0,1 будет отображаться примерно так:
0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999
admin
Спасибо, что поделились.