Opencart (OcStore) | Дробное количество товаров | Decimal quantity
- Подробности
- Категория: Opencart (OCstore)
- Обновлено 21.06.2018
Как добавлять в корзину дробное количество товаров в Virtuemart смотрите здесь.
Для Opencart-2 (ocStore-2)
- Работаем с таблицами базы данных.
Таблица oc_cart . В этой таблице нужно изменить тип данных поля quantity на decimal( 15, 2 )
В таблицах product, product_option_value, product_discount и order_product меняем тип данных полей quantity на decimal(15,2) - Редактируем файлы.
- /system/library/cart.php здесь заменяем
(int)$quantity на $quantity
- /admin/model/catalog/product.php здесь делаем замены
(int)$data['quantity'] на $data['quantity']
(int)$product_option_value['quantity'] на $product_option_value['quantity']
(int)$product_discount['quantity'] на $product_discount['quantity']
(int)$data['minimum'] на $data['minimum']
- /catalog/model/checkout/order.php здесь делаем замены
(int)$product['quantity'] на $product['quantity'] (4 раза)
(int)$order_product['quantity'] на $order_product['quantity']
- /catalog/controller/checkout/cart.php здесь делаем замены
в функции public function add() находим блок
if ($product_info) {
if (isset($this->request->post['quantity']) && ((int)$this->request->post['quantity'] >= $product_info['minimum'])) {
$quantity = (int)$this->request->post['quantity'];
} else {
$quantity = $product_info['minimum'] ? $product_info['minimum'] : 1;
}
и убираем (int)
if ($product_info) {
if (isset($this->request->post['quantity']) && ($this->request->post['quantity'] >= $product_info['minimum'])) {
$quantity = $this->request->post['quantity'];
} else {
$quantity = $product_info['minimum'] ? $product_info['minimum'] : 1;
} - Если добавить дробное количество одного товара (например 1,5), то в хедере в инфоблоке отобразится "В корзине 1,5 товра(ов)", или как в том мультфильме про Виктора Перестукина - "полтора землекопа".
Это недоразумение нужно исправить, а именно, нам нужно вывести в инфоблок не количество товаров, а количество строк отобранных товаров. Тем более, что мы не имеем права складывать дробные товары с целочисленными. Для этого нужно внести исправление в файле /system/library/cart.php , слегка модифицировать функцию countProducts()
public function countProducts() { $product_total = 0; $i=0; $products = $this->getProducts(); foreach ($products as $product) { $product_total += $product['quantity']; $i++; } $product_total = $i; return $product_total; }
Как добавить поле для ввода количества товара на странице Категории Opencart?
Для решения этой задачи нужно
1. Добавить элемент input в файле
/catalog/view/theme/default/template/product/category.tpl
<div class="cataddprod">
<label class="control-label" for="input-quantity">Кол-во</label>
<input type="text" name="quantity" value="<?php echo $product['minimum']; ?>" size="2" id="input_quantity_<?php echo $product['product_id']; ?>" class="form-control" />
</div>
2. Подправить код Javascript
На этом с количеством все.
Теперь можно добавить две кнопки "Плюс" и "Минус" для шагового изменения количества
Откроем файл каркаса страницы товара
/catalog/view/theme/default/template/product/product.tpl
находим блок
<div class="form-group">
<label class="control-label" for="input-quantity"><?php echo $entry_qty; ?></label>
<input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" id="input-quantity" class="form-control" />
<input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
<br />
<button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><?php echo $button_cart; ?></button>
</div>
и заменим его на этот код
<div class="form-group">
<div class="inputwrap">
<div class="minimumtext"><?php echo $entry_qty; ?><br />Минимальное количество для заказа: <?php echo $minimum; ?></div>
<input type="button" class="qty minus" value="" />
<input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" id="input-quantity" class="form-control" />
<input type="button" class="qty plus" value="" />
</div>
<input type="hidden" name="minimum" value="<?php echo $minimum; ?>" id="minimum" />
<input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
<br />
<button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><?php echo $button_cart; ?></button>
</div>
в конец файла дописываем скрипт jQuery
<script type="text/javascript" ><!--
$(document).ready(function() {
var step = parseFloat($('input[name="minimum"]').val());
$('.minus').click(function () {
var $input = $(this).parent().find('#input-quantity');
var count = parseFloat($input.val()) - step;
count = count < step ? step : count;
$input.val(Math.round(count * 10) / 10);
$input.change();
return false;
});
$('.plus').click(function () {
var $input = $(this).parent().find('#input-quantity');
$input.val( Math.round ((parseFloat($input.val()) + step) * 10 ) / 10 );
$input.change();
return false;
});
});
//--></script>
Примерные стили для кнопок
#button-cart {
width: 140px;
}
#input-quantity {
display: inline-block;
margin: 0 8px;
text-align: center;
vertical-align: middle;
width: 84px;
}
.qty {
background-repeat: no-repeat;
background-size: contain;
border: 1px solid #ccc;
border-radius: 15px;
display: inline-block;
height: 33px;
vertical-align: middle;
width: 45px;
}
.qty:hover {
cursor: pointer;
}
.qty.minus {
background-image: url("/image/catalog/pics/minus.gif");
}
.qty.plus {
background-image: url("/image/catalog/pics/plus.gif");
}
Результат можно посмотреть здесь
http://webxeon.ru/aaa/index.php?route=product/product&path=20&product_id=33
Если будут вопросы, - пишите.