Добрый день! Нужен модуль, который будет автоматически пересчитывать цену на странице товара (а не только в корзине), в зависимости от кол-ва товара и скидки от кол-ва или/и выбранной опции, и указывать сразу конечную цену с учётом скидки от указанного кол-ва и выбранных опций.
Т.е. в карточке товара указано например:
1шт. - 1000₽ (исходная цена)
5шт. или более: 800₽
10шт. или более: 700₽
И когда вводишь в карточке товара допустим 11шт. то сразу выводилась бы общая цена в карточке товара - 7700руб.
Скидки при этом указываются в админке как обычно в карточке товара в пункте (скидка) и меняются от кол-ва товара.
Движок - OCSHOP 1.5.6.4.1
Посоветуйте пожалуйста готовое решение или где можно поправить ручками код?
Сейчас в принципе ближайший из подходящего и работающего это бесплатный модуль - Price change with option https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=28277
Но этот модуль умеет только пересчитывать цену в зависимости от кол-ва товара или выбранной опции, а скидки при этом не учитываются. Как можно допилить возможность обновления цены с учётом скидок, желательно в VQmod.
Код используемого модуля:
<?xml version="1.0" encoding="UTF-8"?>
<modification>
<id>Price Option Change</id>
<version>1.0.x</version>
<vqmver required="true">2.4.0</vqmver>
<author>Pinnacle Web Solutions</author>
<file name="catalog/controller/product/product.php">
<operation>
<search position="before"><![CDATA[ public function upload() {]]></search>
<add><![CDATA[
public function price_option_change() {
$json = array();
$options_makeup = 0;
if (isset($this->request->post['product_id'])) {
$product_id = (int)$this->request->post['product_id'];
} else {
$product_id = 0;
}
if (isset($this->request->post['quantity'])) {
$quantity = (int)$this->request->post['quantity'];
} else {
$quantity = 1;
}
$this->language->load('product/product');
$this->load->model('catalog/product');
$product_info = $this->model_catalog_product->getProduct($product_id);
// Product Information
if ($product_info) {
if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
$data['price'] = $product_info['price'];
} else {
$data['price'] = false;
}
if ((float)$product_info['special']) {
$data['special'] = $product_info['special'];
} else {
$data['special'] = false;
}
if (isset($this->request->post['option']) && $this->request->post['option']) {
foreach ($this->model_catalog_product->getProductOptions($product_id) as $option) {
if($option['type'] == 'select' || $option['type'] == 'radio' || $option['type'] == 'checkbox' || $option['type'] == 'image'){
foreach ($option['option_value'] as $option_value) {
//If options checkbox
if(isset($this->request->post['option'][$option['product_option_id']]) && is_array($this->request->post['option'][$option['product_option_id']])) {
array_filter($this->request->post['option'][$option['product_option_id']]);
foreach($this->request->post['option'][$option['product_option_id']] as $checked_option) {
if ($checked_option == $option_value['product_option_value_id']) {
if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
$price = $option_value['price'];
} else {
$price = false;
}
if ($price) {
if ($option_value['price_prefix'] === '+') {
$options_makeup = $options_makeup + (float)$price;
} else {
$options_makeup = $options_makeup - (float)$price;
}
}
}
}
}
}
//If options not checkbox
if (isset($this->request->post['option'][$option['product_option_id']]) && $this->request->post['option'][$option['product_option_id']] == $option_value['product_option_value_id']) {
if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
$price = $option_value['price'];
} else {
$price = false;
}
if ($price) {
if ($option_value['price_prefix'] === '+') {
$options_makeup = $options_makeup + (float)$price;
} else {
$options_makeup = $options_makeup - (float)$price;
}
}
}
}
}
}
unset($price);
}
}
if ($data['price']) {
$json['new_price']['price'] = $this->currency->format($this->tax->calculate((($data['price'] + $options_makeup) * $quantity ), $product_info['tax_class_id'], $this->config->get('config_tax')));
} else {
$json['new_price']['price'] = false;
}
if ($data['special']) {
$json['new_price']['special'] = $this->currency->format($this->tax->calculate((($data['special'] + $options_makeup ) * $quantity), $product_info['tax_class_id'], $this->config->get('config_tax')));
} else {
$json['new_price']['special'] = false;
}
if ($this->config->get('config_tax')) {
$json['new_price']['tax'] = $this->currency->format(((float)$product_info['special'] ? ($product_info['special'] + $options_makeup): ($product_info['price'] + $options_makeup)) );
} else {
$json['new_price']['tax'] = false;
}
$json['success'] = true;
} else {
$json['success'] = false;
}
echo json_encode($json);
exit;
}
]]
</add>
</operation>
</file>
<file name="catalog/view/theme/*/template/product/product.tpl">
<operation>
<search position="replace"><![CDATA[ <?php echo $price; ?>]]></search>
<add><![CDATA[<span class="price-old"><?php echo $price; ?></span>]]></add>
</operation>
<operation>
<search position="before"><![CDATA[<?php echo $footer; ?>]]></search>
<add><![CDATA[<script type="text/javascript">
function PriceOptionChange(){
$.ajax({
type: 'POST',
url: 'index.php?route=product/product/price_option_change',
data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
dataType: 'json',
success: function(json) {
if (json.success) {
$('.product-info .price-old').html(json.new_price.price);
$('.product-info .price-new').html(json.new_price.special);
$('.product-info .price-tax').html("<?php echo $text_tax; ?> " + json.new_price.tax);
}
}
});
}
$('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\'], .product-info input[type=\'checkbox\'], .product-info select, .product-info textarea').on('change', function() {
PriceOptionChange();
});
$('.product-info input[name=\'quantity\']').on('keyup', function() {
PriceOptionChange();
});
</script>
]]></add>
</operation>
</file>
</modification>
price_change_ajax.xml