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

[Решено] Спецпредложения, скидка в процентах


Recommended Posts

Здесь уже обсуждался вопрос о том, что система скидок в OpenCart не слишком гибкая. Например, на вкладке "Специальное" можно задать акционную цену на товар, но, к сожалению, только в абсолютном, т.е. денежном выражении. Сами понимаете, что это крайне не удобно: меняется цена на товар - вам нужно пересчитывать цену по акции, акции бывают разные и с разными скидками, и каждый раз нужно все считать, считать, считать... А как было бы здорово, если можно было бы указывать величину скидки в таких привычных и понятных для всех процентах! Ну что ж, попробуем реализовать нашу идею, минимальными затратами, без сложных переделок.

Например, можно сделать такое условие: если цена по акции больше 1, то значит она указана традиционным способом, т.е. в денежном выражении, если же цена по акции меньше 1, то она указана в процентном выражении. Например, значение цены 0.95 соответствует 5% скидке, а 0.85 скидке в 15%. Теперь осталось модифицировать код системы для правильного расчета цены по акции.

Начнем с основной страницы отображения товара, файла catalog\controller\product\product.php, необходимо модифицировать код следующим образом:

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

$special = $this->model_catalog_product->getProductSpecial($this->request->get['product_id']);

if ($special < 1) $special = (int)($product_info['price'] * $special); // наша строка для расчета скидки в процентах

if ($special) {

это для основного продукта страницы. И еще в одном месте:

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

$special = $this->model_catalog_product->getProductSpecial($result['product_id']);

if ($special < 1) $special = (int)($result['price'] * $special);  // наша строка для расчета скидки в процентах

if ($special) {

это для рекомендуемых продуктов.

Аналогично второму фрагменту нужно внести изменения в следующие файлы:

catalog\controller\product\category.php

catalog\controller\product\manufacturer.php

catalog\controller\product\search.php

catalog\controller\module\bestseller.php

catalog\controller\module\featured.php

catalog\controller\module\latest.php

catalog\controller\module\special.php

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

А вот корзина все равно считается не правильно! Пришлось повозиться. Изменения нужно внести в файл: system\library\cart.php

$product_special_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");

if ($product_special_query->num_rows) {
 if ($product_special_query->row['price'] < 1) $price = (int)($product_query->row['price'] * $product_special_query->row['price']); // это две новых строки
 else $price = $product_special_query->row['price']; // это две новых строки
} else {
 $price = $product_query->row['price'];
}

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

Вот и все, прошу экспериментировать и комментировать.

ПС: изменения производились на ocStore 0.1.1, но не думаю, что на других версиях что-то по-другому.

ППС: маленький бонус от переделки: теперь, наконец-то, можно легко и просто устанавливать постоянные скидки для постоянных клиентов в зависимости от статуса (группы) клиента. И не надо каждый раз пересчитывать кучу цен...

  • +1 4
Надіслати
Поділитися на інших сайтах


  • 1 month later...

а как узнать когда заканчивается акция?

Просто не могу найти решение

Пример отсчета

timer.zip

тупо внедрить хочу, выставив дату окончания акции

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


  • 5 months later...

Решение Очень помогло, большое Вам спасибо!!

У себя сделал округление цен в бОльшую сторону

if ($special < 1) $special = (int)($result['price'] * $special); $special = round($special,-1); // наша строка для расчета скидки в процентах

А в корзине так:

					$product_special_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");

			if ($product_special_query->num_rows) {
				if ($product_special_query->row['price'] < 1) $price = (int)($product_query->row['price'] * $product_special_query->row['price']);  // это две новых строки
					else $price = $product_special_query->row['price']; $price = round($price,-1); // это две новых строки
				} 
				  else {
					   $price = $product_query->row['price'];
					   }
			}

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


  • 1 year later...

у меня OpenCart 1.5.1.3 хз, но в product.php совпадает только первая строка, а как заменять и что добавлять.. непонятно ничего

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

  • 5 months later...
  • 11 months later...

Сделал vqmod xml для OpenCart 1.5.х.х, кому интересно - скачайте, попробуйте, должно работать :)

Спасибо дополнение действительно нужное, и рабочее... но если стоит просто цена то все хорошо по базовой цене скидка в процентах работает на ура!

Но если к товару добавлены опции Допустим размер и у каждого своя цена, то на них уже не работает, и отнимает только процент от базовой, подскажите пожалуйста как подправить!?

Вот ка у меня получается :

С базовой ценой ( я установил 50% скидки И БАЗОВАЯ ЦЕНА 1000 РУБ.) http://prntscr.com/36gssj

А Это уже с опцией должно было бы быть 1000 руб а показывает 1500 руб.

http://prntscr.com/36gtk4

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


  • 3 months later...

Спасибо дополнение действительно нужное, и рабочее... но если стоит просто цена то все хорошо по базовой цене скидка в процентах работает на ура!

Но если к товару добавлены опции Допустим размер и у каждого своя цена, то на них уже не работает, и отнимает только процент от базовой, подскажите пожалуйста как подправить!?

Вот ка у меня получается :

С базовой ценой ( я установил 50% скидки И БАЗОВАЯ ЦЕНА 1000 РУБ.) http://prntscr.com/36gssj

А Это уже с опцией должно было бы быть 1000 руб а показывает 1500 руб.

http://prntscr.com/36gtk4

 

Нашли решение?

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


  • 7 months later...

Сделал vqmod xml для OpenCart 1.5.х.х, кому интересно - скачайте, попробуйте, должно работать :)

 

Работает, спасибо. Единственное место, где возникли проблемы - закладки (wishlist). Исправляется добавлением  

	<file name="catalog/controller/account/wishlist.php">
		<operation>
			<search position="after"><![CDATA[
			if ((float)$product_info['special']) {
			]]></search>
			<add><![CDATA[
			if ((float)$product_info['special'] < 1) {$product_info['special'] = $product_info['price'] * (float)$product_info['special'];}
			]]></add>
		</operation>	
    	</file>	
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

А может кто поможет подобное решение прикрутить к СКИДКЕ? Другими словами, заказал 5 единиц, получи 2% скидку. Заказал 10 единиц товара скидка 5%
 

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


  • 1 month later...

 

Работает, спасибо. Единственное место, где возникли проблемы - закладки (wishlist). Исправляется добавлением  

	<file name="catalog/controller/account/wishlist.php">
		<operation>
			<search position="after"><![CDATA[
			if ((float)$product_info['special']) {
			]]></search>
			<add><![CDATA[
			if ((float)$product_info['special'] < 1) {$product_info['special'] = $product_info['price'] * (float)$product_info['special'];}
			]]></add>
		</operation>	
    	</file>	

 

Еще в сравнении тоже самое

 

Ну и для округления, добавил везде round:

if ((float)$product_info['special'] < 1) {$product_info['special'] = round($product_info['price'] * (float)$product_info['special']);}
Надіслати
Поділитися на інших сайтах


  • 10 months later...

Спасибо дополнение действительно нужное, и рабочее... но если стоит просто цена то все хорошо по базовой цене скидка в процентах работает на ура!

Но если к товару добавлены опции Допустим размер и у каждого своя цена, то на них уже не работает, и отнимает только процент от базовой, подскажите пожалуйста как подправить!?

Вот ка у меня получается :

С базовой ценой ( я установил 50% скидки И БАЗОВАЯ ЦЕНА 1000 РУБ.) http://prntscr.com/36gssj

А Это уже с опцией должно было бы быть 1000 руб а показывает 1500 руб.

http://prntscr.com/36gtk4

Вы решили эту проблему?... мне тоже нужно чтобы при выборе Акции (у меня стоит в %) я например делал -20% скидку Акции, и чтобы этот % так же ставился в Опциях на все цены (в основном я использую в опциях " = "), кто-то может помочь?

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


  • 7 months later...

Вы решили эту проблему?... мне тоже нужно чтобы при выборе Акции (у меня стоит в %) я например делал -20% скидку Акции, и чтобы этот % так же ставился в Опциях на все цены (в основном я использую в опциях " = "), кто-то может помочь?

Так никто и не решил?

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


Прикольно, а можно конкретно пояснить?

 

 

1. В акциях нельзя ставить проценты, если специально это не делать

2. Что вы хоитет от опций?, чтобы и на них действовала акционаая скидка?

 

Т.е.

товар     цена 100 акция 50  (50%)

   опция  цена 50  акция 25 (50%)

 

общая цена 150 без акций

С акцией

общая цена 75

 

Если учитывать что на опцию нет скидки то

общая цена 100

 

или возможно и такое

товар     цена 100

   опция  цена 50  акция 25 (50%)

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

  • 2 months later...
Т.е.

товар     цена 100 акция 50  (50%)

   опция  цена 50  акция 25 (50%)

 

Да, именно это интересует, у меня например опциями висят разные размеры , но скидка на все опции а не на базовый размер нужна)

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


Вам нужны акции на опции

 

 

Т.е.

 

опция1 префикс ЦЕНА1 акционнаяЦЕНА Датастарт Датафиниш

опция2 префикс ЦЕНА2

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

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

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

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

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

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

Вхід

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

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

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

Important Information

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