Добавляем количество квадратных метров в упаковке и подсчет конечной цены, вводя цену за кв.м.

категория: , Дорабатываем


Опубликовано: 07.10.2015 Обновлено: 03.11.2015 Просмотров: 8200 Комментарии: 7


Добавляем количество квадратных метров в упаковке и подсчет конечной цены, вводя цену за кв.м.

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


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

Например, нам надо купить ламинат на комнату 20 кв.м.

Первое что бы делаем это находим интернет магазин, выбираем товар и ставим в количество упаковок. Но без автоматического подсчета неудобно совершать покупки. Из-за этого надо вручную считать сколько заказывать.

В этой доработке мы сделаем автоматический подсчет упаковок товара.

План работ

  1. Добавление в админку поле ввода количества квадратных метров в упаковке. (Например 1,56 кв.м. в пачке ламината)
  2. Добавляем в карточке товара + и - для увеличения или уменьшения количества упаковок в кв.м.
  3. Добавляем код для правильного отображения в категории.

Добавляем в админку поле ввода.

Открываем файл admin/catalog/view/template/catalog/product_form.tpl

ищем строки:

<div class="form-group">
  <label class="col-sm-2 control-label" for="input-price"><?php echo $entry_price; ?></label>
  <div class="col-sm-10">
	<input type="text" name="price" value="<?php echo $price; ?>" placeholder="<?php echo $entry_price; ?>" id="input-price" class="form-control" />
  </div>
</div>

после них вставляем:

<div class="form-group">
  <label class="col-sm-2 control-label" for="input-mpn">Количество м<sup>2</sup> в упаковке</label>
  <div class="col-sm-10">
    <input type="text" name="mpn" value="<?php echo $mpn; ?>" id="input-mpn" class="form-control" />
  </div>
</div>

Эти строки удаляем:

<div class="form-group">
  <label class="col-sm-2 control-label" for="input-mpn"><span data-toggle="tooltip" title="<?php echo $help_mpn; ?>"><?php echo $entry_mpn; ?></span></label>
  <div class="col-sm-10">
   <input type="text" name="mpn" value="<?php echo $mpn; ?>" placeholder="<?php echo $entry_mpn; ?>" id="input-mpn" class="form-control" />
  </div>
</div>

Этим кодом мы добавили поле ввода количества м2 для товара в админке, путем удаления ненужного mpn и присвоения этой переменной нашему полю.

Ввод количества квадратных метров в админке

Также добавим поле для ввода количества штук в упаковке (для информации покупателю). Для этого после строк выше добавляем:

<div class="form-group">
  <label class="col-sm-2 control-label" for="input-isbn"><span data-toggle="tooltip" >Количество шт. в упаковке</span></label>
  <div class="col-sm-10">
    <input type="text" name="isbn" value="<?php echo $isbn; ?>" placeholder="<?php echo $entry_isbn; ?>" id="input-isbn" class="form-control" />
  </div>
</div>

И удаляем код для ввода isbn, который практически никому не нужен:

<div class="form-group">
  <label class="col-sm-2 control-label" for="input-isbn"><span data-toggle="tooltip" title="<?php echo $help_isbn; ?>"><?php echo $entry_isbn; ?></span></label>
  <div class="col-sm-10">
    <input type="text" name="isbn" value="<?php echo $isbn; ?>" placeholder="<?php echo $entry_isbn; ?>" id="input-isbn" class="form-control" />
  </div>
</div>

Далее открываем файл admin/model/catalog/product.php

Ищем в документе отрезок кода:

price = '" . (float)$data['price'] . "',

И меняем его на:

price = '" . (float)$data['price'] * ($data['mpn']?$data['mpn']:1) . "',

Этим мы добавили калькуляцию цены в зависимости от количества квадратов в упаковке. Если количество квадратов не заполнено, цена будет оригинальная.

Далее открываем файл admin/controller/catalog/product.php

Находим строки:

if (isset($this->request->post['price'])) {
	$data['price'] = $this->request->post['price'];
} elseif (!empty($product_info)) {
	$data['price'] = $product_info['price'];
} else {
	$data['price'] = '';
}  

Меняем их на:

if (isset($this->request->post['price'])) {
	$data['price'] = $this->request->post['price']/($this->request->post['mpn']?$this->request->post['mpn']:1);
} elseif (!empty($product_info)) {
	$data['price'] = $product_info['price'] / ($product_info['mpn']?$product_info['mpn']:1);
} else {
	$data['price'] = '';
}

Этим мы добавили отображения цены в поле цена за один квадратный метр. По админке все готово.

При добавлении цены с количеством квадратов в упаковке идет автоматический подсчет и в базу пишется цена за упаковку то есть фактическая за конкретный товар.

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

Добавляем в карточку товара + и -

Для этого открываем файл catalog/controller/product/product.php

Находим строки:

if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
	$data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
} else {
	$data['price'] = false;
}

Меняем их на:

if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
	$data['price'] = $this->currency->format($this->tax->calculate($product_info['price'] / ($product_info['mpn']?$product_info['mpn']:1), $product_info['tax_class_id'], $this->config->get('config_tax')));
} else {
	$data['price'] = false;
}

Этим действием мы выводим цену за квадратный метр. Далее, после этих строк вставляем

$data['in_box'] = $product_info['mpn'];
$data['count_in_box'] = $product_info['isbn'];

Этой переменной мы передаем количество квадратных метров в упаковке (in_box) и количество штук в упаковке (count_in_box) Далее открываем файл catalog/view/theme/default/template/product/product.tpl

И добавляем плюс и минус возле поля количество, где мы будем выводить его в квадратных метрах. Также добавим скрытое поле quantity (которое учитывается при добавлении) для реального количества упаковок.

В этом файле ищем код:

<input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" id="input-quantity" class="form-control" />

Меняем его на:

<div class="col-sm-12 form-group">
  <div class="col-sm-3">
    <span data-type="q_minus" class="control-in-de btn btn-primary btn-block">-</span>
  </div>
  <div class="col-sm-6">
    <input type="text" name="quantity_in_box" value="<?php echo $minimum * ($in_box?$in_box:1); ?> кв.м. (<?php echo $minimum; ?> уп.)" size="2" id="input-quantity" class="form-control" />
    <input type="hidden" name="quantity" value="<?php echo $minimum; ?>" />
  </div>
  <div class="col-sm-3">
    <span data-type="q_plus" class="control-in-de btn btn-primary btn-block">+</span>
  </div>
</div>

Этим кодом мы добавили +/- и правильное отображение количества квадратных метров и упаковок. Отображение кнопок можно менять под свою тему или на свое усмотрение как будет удобно. В этом же файле находим:

<?php echo $footer; ?>

И перед этой строкой вставляем скрипты для оживления кнопок + и -

<script>
$('.control-in-de').click(function(){ 
	if($(this).data('type') == 'q_minus'){
	  if($('input[name="quantity"]').val() > '<?php echo $minimum; ?>'){
		$('input[name="quantity"]').val(parseInt($('input[name="quantity"]').val())-1);
	  }
	}else{
		$('input[name="quantity"]').val(parseInt($('input[name="quantity"]').val())+1);					
	}
	in_box = parseInt($('input[name="quantity"]').val())*<?php echo $in_box; ?>;
	$('input[name="quantity_in_box"]').val(in_box.toFixed(2) + ' кв.м. (' + $('input[name="quantity"]').val() + ' уп.)');
});
</script>

После этого у нас все хорошо отображается и в корзину добавляется в упаковках. Возле вывода цены, можно писать что это за 1 кв.м.

Подсчет квадратных метров в товаре Opencart

Для вывода информации о количестве штук в упаковке добавьте в этом файле в удобном месте вывод

	Количество в упаковке <?php echo $count_in_box; ?> шт.

Правильное отображение цены за квадратный метр в категории

После всех изменений нам надо вывести цену за кв.м. в категории, для этого открываем файл catalog/controller/product/category.php

И находим строку:

$price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));

Меняем ее на:

$price = $this->currency->format($this->tax->calculate($result['price'] / ($result['mpn']?$result['mpn']:1), $result['tax_class_id'], $this->config->get('config_tax')));

По аналогии делаем вывод цены за кв.м. В других модулях, такие как новинки, скидки, хиты продаж и т. д.

P.S. В Opencart 2 после всех изменений в коде магазина надо зайти в Модули Модификаторы и нажать на кнопку Очистить и Обновить справа вверху.

Демо работы: Подсчет квадратных метров


Комментарии:


Фото комментатора

Игорь 12.10.2015

Было бы еще хорошо иметь более классический калькулятор площади. Возможно на js, с полями для ввода площади и получению упаковок и наоборот.
Администратор

Ответ for-opencart.com 12.10.2015

Ну по аналогии уже надо дотачивать под каждые отдельные требования. Да, было бы и правда удобно что бы клиент вводил нужную ему площать. Например сделать поле "Нужное количество квадратов" и после ввода идет подсчет упаковок. Могу такое сделать но в свободное время, пока что занят.

Фото комментатора

Микаэль 10.10.2016

Здравствуйте. А такое есть для версии OPENCART 1.5 Магазин будет для плитки и никак и нигде боьше не могу найти как это делать.
Администратор

Ответ for-opencart.com 10.10.2016

Добрый день. По аналогии делайте для 1.5 там все похожее. Различия в размещении.

Фото комментатора

Алексей 10.10.2016

Спасибо, очень помогло. Есть несколько вопросов. 1. Как в админке в списке товаров вывести цену за м2, а не за упаковку? 2. Как правильно прописать отображения цены для акций и скидок, а то она постоянно умножается?
Администратор

Ответ for-opencart.com 10.10.2016

Такое не подскажу, надо по аналогии сделать изменения только в админке.

Фото комментатора

Сергей 17.05.2017

А можно похожую инструкцию для продажи в граммах? Т.е в одной упаковке 200г, соответственно как вывести в окно подсчета количества 200г(1 шт.) 400г (2 шт.) и так далее с шагом в 200г?
Администратор

Ответ for-opencart.com 17.05.2017

Просто сделать select с выбором количества либо подвязать js

Фото комментатора

Алексей 17.05.2017

Добрый вечер, подскажите пожалуйста, а как убрать округление? К примеру поставил 2.22 и при прибавлении становится 4.44, а если прибавить еще, то становится 6.67. Как это исправить?
Администратор

Ответ for-opencart.com 17.05.2017

По округлению:

javascript: toFixed(2) - это до сотых

php: функция round() http://www.php.su/round()

Фото комментатора

Юлия 15.06.2017

Можно использовать модуль Мега калькулятор http://white-blue.com.ua/mega-calculator
Администратор

Ответ for-opencart.com 15.06.2017

Конечно можно, если есть готовые решения почему бы не юзать. Главное что бы подошло все по функционалу.

Фото комментатора

Сергей 04.06.2018

А как вывести цену за квадратный метр еще и в карточке товара?
Администратор

Ответ for-opencart.com 04.06.2018

Пока что не помогу. Очень загружен.

Быстрый поиск

Похожее

  • Обзор Opencart 2.0

    Обзор нового Opencart 2.0 внешний вид, функциональность и код - все это было пощупано

  • Цена

    Описание поле цена в Opencart, настройка

  • Количество

    Количество это показатель физического наличия товара на вашем складе. Данное поле важно, в случае если вы ведете учет в интернет магазине

Новое на сайте