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

Изменить поведение Discount (скидки)


Recommended Posts

Привет.

 

Для зарегистрированных пользователей определенной группы необходимо выставить свою цену на всю продукцию через discount. Загружаться в базу все будет автоматом. Проблема в том, что размер скидки нужно указывать в процентах, а не новую цену (в валюте) как по дефолту. Я поправил 3 SQL-запроса в файле catalog/model/catalog/product.php (в функциях  getProduct, getProducts и getProductDiscounts). В магазине стало все гуд, но когда добавляем в корзину товар с дискаунтом, то в корзине цена отображается не новая (посчитанная), а число, например 5, т.е. проценты которые указаны в админке в дискаунте.

Вот кусок запроса:

 

162 Query SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT (p.price-(p.price/100*pd2.price)) AS price FROM oc_product_discount AS pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '2' AND (pd2.quantity = '0' OR pd2.quantity = '1')AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, ...

 

Тут видно, что селект пересчитывает процент скидки. В  pd2.price - указан процент скидки. Но как быть с корзиной. Не могу найти код, который делает запрос о цене товара с таблички oc_product_discount.


162 Query SELECT price FROM oc_product_discount WHERE product_id = '205' AND customer_group_id = '2' AND quantity <= '13' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1

 

Смотрел в код common.js, но что-то ничего не видно. Подскажите, плиз, как ведет себя опенкарт в этом случае.

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


Я делал по-другом, добавил в базу в product_discount поле percent

вывел его во вьюху в админке, поле с ценой закоментил

<!--<td class="right"><input type="text" name="product_discount[<?php echo $discount_row; ?>][price]" value="<?php echo $product_discount['price']; ?>" /></td>-->
                <td class="right"><input type="text" name="product_discount[<?php echo $discount_row; ?>][percent]" value="<?php echo $product_discount['percent']; ?>" /></td>

 

потом в модель добавил код, который отминусовует процент от основной цены

foreach ($data['product_discount'] as $product_discount) {

                $price_gen = (float)$data['price'] - ((float)$product_discount['percent']*((float)$data['price']*0.01));

				$this->db->query("INSERT INTO " . DB_PREFIX . "product_discount SET
				product_id = '" . (int)$product_id . "',
				customer_group_id = '" . (int)$product_discount['customer_group_id'] . "',
				quantity = '" . (int)$product_discount['quantity'] . "',
				priority = '" . (int)$product_discount['priority'] . "',
				price = '" . $price_gen . "',
				percent = '" . (float)$product_discount['percent'] . "',
				date_start = '" . $this->db->escape($product_discount['date_start']) . "',
				date_end = '" . $this->db->escape($product_discount['date_end']) . "'");
			}

И в каталоге мне не пришлось вообще искать где выводится discount.  :-)

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

Я то же так думал, но не захотел изменять структуру таблиц БД. Как оно будет при обновлении ОС?

И второе. У меня скидка заноситься с пом. шелл-скрипта на все товары (своя категория - своя скидка), а в вашем коде необходимо через админку прощелкать все товары с кнопкой "Save", что не очень подходит. Так что вопрос пока актуален.

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


Можно и так, я не спорю, но я не настолько силен в PHP ООП, что бы это сделать. Мне подскажите лучше, когда нажимаем на кнопку в "Купить", откуда береться цена, которую мы видим в корзине. Просто если товар уже с нужной мне ценой (отминусован дискаунт), то в корзине светится другая цена (DB_PREFIX_product_discount/price)?? Не пойму какой код выполняется в этом случае. Кто знает - подскажите.

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


Что за "вредные советы"? По делу, нужно создать новый extantions с типом total и сценарий расчета скидки написать....

Хм, я всегда полагал что тоталы учитывают только общую сумму в корзине. Под каждый товар в корзине их можно разве использовать?

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

pashast, нет. Я как раз и говорю: "... не трогайте цену товара".

Не трогать цену товара - это как раз и есть "вредные советы".

Для меня общая скидка - проблемы с выгрузкой заказов в систему учета складом.

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

Для интересующихся. Нашел модификацию - скидки в процентах http://forum.opencart.com/viewtopic.php?t=6375 но это только половинчатое решение.

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

Для интересующихся. Нашел модификацию - скидки в процентах http://forum.opencart.com/viewtopic.php?t=6375 но это только половинчатое решение.

 

Это все хорошо, но кто подскажет где код, который выполняется, когда нажимаем на кнопку "купить" и товар попадает в корзину??

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


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

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

  • 1 month later...

Vladzimir, в OpenCart - нет.

Ну почему "нет", есть :)

И сделать очень легко.

Причем выгрузка заказов работает с динамически измененной ценой.

Причем без vqmod и без изменений системных файлов

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

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

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

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

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

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

Вхід

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

Вхід зараз
×
×
  • Створити...

Important Information

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