Opencart (OcStore) | Дробное количество товаров | Decimal quantity

Как добавлять в корзину дробное количество товаров в Virtuemart смотрите здесь.

 

 Для Opencart-2 (ocStore-2)

  1. Работаем с таблицами базы данных.
    Таблица oc_cart . В этой таблице нужно изменить тип данных поля quantity на decimal( 15, 2 )
    В таблицах product, product_option_value, product_discount и order_product меняем тип данных полей quantity на decimal(15,2)
  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 раза)
    $product['quantity'] на $product['quantity'] (6 раз)
    (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;
        }



  3. Если добавить дробное количество одного товара (например 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

в функции cart .add в файле /catalog/view/javascript/common.js

Нужно после строки

'add': function(product_id, quantity) {

 добавить строку

var quantity = $('#input_quantity_' + product_id).val();

 

3. В файле /catalog/controller/checkout/cart.php найти функцию

public function add()

и заменить в двух местах
(int)$this->request->post['quantity'] на (float)$this->request->post['quantity']

 

На этом с количеством все.

Теперь можно добавить две кнопки "Плюс" и "Минус" для шагового изменения  количества

Откроем файл каркаса страницы товара

/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

 

Если будут вопросы, - пишите.