gexagen

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

Рекомендуемые сообщения

gexagen    8

Здесь уже обсуждался вопрос о том, что система скидок в 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, но не думаю, что на других версиях что-то по-другому.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
r00t    7

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

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

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

timer.zip

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
inoplanetny    0

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

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

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'];
					   }
			}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
sobwoofer    37

Неплохо былобы все это дело в XML )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
sobwoofer    37

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
excalibur    17

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

special.xml

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
grebovich    5

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

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

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

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

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

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

http://prntscr.com/36gtk4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
G22    0

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

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

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

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

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

http://prntscr.com/36gtk4

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
alex79    0

Сделал 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>	

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Baion    11

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Helloween    6

 

Работает, спасибо. Единственное место, где возникли проблемы - закладки (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']);}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
goprodaga    0

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

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

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

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

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

http://prntscr.com/36gtk4

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
thesqu    3

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 019

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

 

 

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

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

 

Т.е.

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

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

 

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

С акцией

общая цена 75

 

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

общая цена 100

 

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

товар     цена 100

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
lobster    0
Т.е.

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
chukcha    1 019

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

 

 

Т.е.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу