Автор Тема: Создать правило корзины 25% на одну категорию и 15% на другую  (Прочитано 43 раз)

16 Ноябрь 2017, 09:57:03
  • Старожил
  • ****
  • Сообщений: 331
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Добрый день!
подскажите, может сталкивались?

Требуется создать определённое правило корзины.

25% на одну категорию товаров.
15% на другую категорию товаров.

Название кода должно быть одинаковым в обоих случаях.

Можно ли реализовать подобное?

Пробовал создать два купона с одним и тем же названием, получаю: "Это правило корзины покупателя уже используется".

16 Ноябрь 2017, 10:49:52
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 33084
  • Репутация: +26762/-0
    • Просмотр профиля
Нельзя установить один купон под разные скидки. Нужно создавать два раздельных правила.
16 Ноябрь 2017, 11:13:27
Ответ #2
  • Старожил
  • ****
  • Сообщений: 331
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Нельзя установить один купон под разные скидки. Нужно создавать два раздельных правила.

Какие есть варианты? Что пилить?
16 Ноябрь 2017, 11:37:41
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 33084
  • Репутация: +26762/-0
    • Просмотр профиля
Вариантов не много.
1. Разные купоны
2. Модуль типа Promotions and discounts, в котором можно создавать несколько условий.
16 Ноябрь 2017, 12:29:29
Ответ #4
  • Старожил
  • ****
  • Сообщений: 331
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вариантов не много.
1. Разные купоны
2. Модуль типа Promotions and discounts, в котором можно создавать несколько условий.

Для себя вижу такой вариант.
Создаю один купон со всему необходимыми категориями. Скидку выбираю одну из двух.

Нахожу место в коде где применяется скидка к товару и добавляю проверку:
если товар принадлежит категории с 15% скидкой добавляю её
, а если товар принадлежит категории с 25% скидкой добавляю её

Как то так.

Подскажите класс, метод где применяется скидка купона в корзине?

Предполагаю, что здесь: /classes/cartRule.php
16 Ноябрь 2017, 13:27:39
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 14239
  • Репутация: +14572/-2
  • Сообщество PrestaShop
    • Просмотр профиля
Значения скидок получают из бд. Так создавать нужно 2 скидки для кажлой категории.
При проверке уже в функции добавления товара определять какой из категорий принадлежит товар и какая скидка должна применяться.
16 Ноябрь 2017, 14:36:46
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 21092
  • Репутация: +25282/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Создайте несколько условий для скидок.
15% - категория 1 + производитель или какой-то аттрибут
25% - категория 2 + производитель или какой-то аттрибут
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
16 Ноябрь 2017, 15:14:01
Ответ #7
  • Старожил
  • ****
  • Сообщений: 331
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если возникнет такой вариант.

Хорошо я создам 2 скидки для каждой категории:
15%. - пусть id = 15
25%. - пусть id = 25

Допустим в корзине будет два товара.
Один товар из категории 15%.
Другой товар 20%.

Смогу ли я последовательно применить две скидки?
$this->context->cart->addCartRule(15);
$this->context->cart->addCartRule(25);
17 Ноябрь 2017, 11:00:49
Ответ #8
  • Старожил
  • ****
  • Сообщений: 331
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо,
всем кто откликнулся! Проблема решена.

Вот пример кода

public function processDiscount()
    {
        if ($this->context->cart->nbProducts() > 0) {
            if (Tools::getValue('action_discount') == 'add' && Tools::getValue('discount_name')) {
                $code = trim(Tools::getValue('discount_name'));
                if (!Validate::isCleanHtml($code)) {
                    $this->errors[] = $this->l('Voucher name invalid.');
                } else {
                    if (($cart_rule = new CartRule(CartRule::getIdByCode($code)))
                        && Validate::isLoadedObject($cart_rule)
                    ) {
                        if (($error = $cart_rule->checkValidity($this->context, false, true)) && ($cart_rule->id != 57)) {
                            $this->errors[] = $error;
                        } else {
                            $this->context->cart->addCartRule($cart_rule->id);

if($cart_rule->id == 57)
$this->context->cart->addCartRule(58);

                        }
                    } else {
                        $this->errors[] = $this->l('Voucher name invalid.');
                    }
                }
            } elseif (Tools::getValue('action_discount') == 'delete'
                && ($id_cart_rule = (int) Tools::getValue('id_discount'))
                && Validate::isUnsignedId($id_cart_rule)
            ) {
                $this->context->cart->removeCartRule($id_cart_rule);
            }
        }

        return array('hasError' => !empty($this->errors), 'errors' => $this->errors);
    }

В оригинал функции добавлена строка
if($cart_rule->id == 57)
$this->context->cart->addCartRule(58);

57 - Промокод на 25%
58 - Промокод на 15%