Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Recommended Posts

Добрый день! Нужен модуль, который будет автоматически пересчитывать цену на странице товара (а не только в корзине), в зависимости от кол-ва товара и скидки от кол-ва или/и выбранной опции, и указывать сразу конечную цену с учётом скидки от указанного кол-ва и выбранных опций.
Т.е. в карточке товара указано например:
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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.