Часто бывает, особенно в строительных магазинах, что цена идет за квадратный метр, а в упаковке, например ламината, находится более одного квадратного метра. Покупатель будет заказывать определенное количество упаковок, а Opencart должен автоматически подсчитывать сколько это в квадратных метрах.
Например, нам надо купить ламинат на комнату 20 кв.м.
Первое что бы делаем это находим интернет магазин, выбираем товар и ставим в количество упаковок. Но без автоматического подсчета неудобно совершать покупки. Из-за этого надо вручную считать сколько заказывать.
В этой доработке мы сделаем автоматический подсчет упаковок товара.
План работ
- Добавление в админку поле ввода количества квадратных метров в упаковке. (Например 1,56 кв.м. в пачке ламината)
- Добавляем в карточке товара + и - для увеличения или уменьшения количества упаковок в кв.м.
- Добавляем код для правильного отображения в категории.
Добавляем в админку поле ввода.
Открываем файл admin/catalog/view/template/catalog/product_form.tpl
ищем строки:
после них вставляем:
Эти строки удаляем:
Этим кодом мы добавили поле ввода количества м2 для товара в админке, путем удаления ненужного mpn и присвоения этой переменной нашему полю.
Также добавим поле для ввода количества штук в упаковке (для информации покупателю). Для этого после строк выше добавляем:
И удаляем код для ввода isbn, который практически никому не нужен:
Далее открываем файл 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 (которое учитывается при добавлении) для реального количества упаковок.
В этом файле ищем код:
Меняем его на:
-+
Этим кодом мы добавили +/- и правильное отображение количества квадратных метров и упаковок. Отображение кнопок можно менять под свою тему или на свое усмотрение как будет удобно. В этом же файле находим:
И перед этой строкой вставляем скрипты для оживления кнопок + и -
После этого у нас все хорошо отображается и в корзину добавляется в упаковках. Возле вывода цены, можно писать что это за 1 кв.м.
Для вывода информации о количестве штук в упаковке добавьте в этом файле в удобном месте вывод
Количество в упаковке шт.
Правильное отображение цены за квадратный метр в категории
После всех изменений нам надо вывести цену за кв.м. в категории, для этого открываем файл 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 после всех изменений в коде магазина надо зайти в Модули — Модификаторы и нажать на кнопку Очистить и Обновить справа вверху.
Демо работы: Подсчет квадратных метров