admin Опубликовано 11 марта, 2022 Поделиться Опубликовано 11 марта, 2022 Часто бывает что цена идет за кв.м., а в упаковке, например ламината, находится более одного квадратного метра. В таком случае наш магазин должен автоматически все считать. Часто бывает, особенно в строительных магазинах, что цена идет за квадратный метр, а в упаковке, например ламината, находится более одного квадратного метра. Покупатель будет заказывать определенное количество упаковок, а Opencart должен автоматически подсчитывать сколько это в квадратных метрах. Например, нам надо купить ламинат на комнату 20 кв.м. Первое что бы делаем это находим интернет магазин, выбираем товар и ставим в количество упаковок. Но без автоматического подсчета неудобно совершать покупки. Из-за этого надо вручную считать сколько заказывать. В этой доработке мы сделаем автоматический подсчет упаковок товара. План работ Добавление в админку поле ввода количества квадратных метров в упаковке. (Например 1,56 кв.м. в пачке ламината) Добавляем в карточке товара + и - для увеличения или уменьшения количества упаковок в кв.м. Добавляем код для правильного отображения в категории.. Добавляем в админку поле ввода. Открываем файл 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 кв.м. Для вывода информации о количестве штук в упаковке добавьте в этом файле в удобном месте вывод Количество в упаковке <?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 после всех изменений в коде магазина надо зайти в Модули — Модификаторы и нажать на кнопку Очистить и Обновить справа вверху. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.