[UPDATE] Разные скидки в зависимости от общей суммы корзины

По следам записи Михаила Воеводского и этого объявления о работе был написан плагин для miniShop2, который позволяет выставить скидку в процентах для всей корзины в зависимости от общей суммы корзины.
Скидка выставляется пошагово: по достижении определённых сумм применяется своя скидка. К примеру, корзина стоит 100кр — скидка 10%, 150кр — 15%. При желании можно выставить сколько угодно шагов и какой угодно процент. Данные указываются массивом в самом начале плагина, вот так:
$discounts = array(
    '100000' => '10%',
    '150000' => '15%',
    '200000' => '20%',
);
Часть кода была взята из компонента msPromoCode, в частности для того, чтобы цены на товары в корзине обновлялись динамически при смене кол-ва или удалении товара из корзины.

Инструкция по установке

  1. Создаём плагин (код плагина) и вешаем на события:
    • msOnAddToCart
    • msOnChangeInCart
    • msOnRemoveFromCart
    • OnHandleRequest
    • OnLoadWebDocument

  2. Создаём чанк tpl.msdfcMsg с таким содержимым:
    [[+current.discount:ne=`0`:then=`<p>Текущая скидка <b>[[+current.discount]]</b> и <b>[[+discount_amount]] [[%ms2_frontend_currency]]</b></p>`]]
    [[+next.discount:ne=`0`:then=`<p>Если наберете на <b>[[+next.total_cost]] [[%ms2_frontend_currency]]</b>, то получите скидку <b>[[+next.discount]]</b>.</p>`]]

    На странице корзины или где-либо в ином месте шаблона, где надо вывести надпись:
    Текущая скидка 10% и 10 699.9 руб.
    Если наберете на 150 000 руб., то получите скидку 15%.
    добавляем такой код:
    <div class="msdfc_msg"></div>

  3. Для динамического обновления цен на товары в корзине, при вызове сниппета msCart дублируем чанк из параметра &tplRow, например назовём его tpl.msCart.row.2:
    [[!msCart?
    	&tplRow=`tpl.msCart.row.2`
    ]]

    В этом чанке указываем класс .price не тегу td, а на тег span, обрамляющий плейсхолдер [[+price]] и дополнительно оборачиваем его в span. На примере будет понятнее:
    Было:
    <td class="price"><span>[[+price]]</span> [[%ms2_frontend_currency]][[+old_price]]</td>
    Стало:
    <td><span class="price"><span>[[+price]]</span></span> [[%ms2_frontend_currency]][[+old_price]]</td>

    И в быстром плейсхолдере old_price в самом низу чанка оборачиваем [[+old_price]] в span:
    Было:
    <!--minishop2_old_price 
    <span class="old_price">[[+old_price]] [[%ms2_frontend_currency]]</span>-->
    Стало:
    <!--minishop2_old_price 
    <span class="old_price" style="display: none;"><span>[[+old_price]]</span> [[%ms2_frontend_currency]]</span>-->
Код плагина можно взять тут.

Внимание

Плагин может конфликтовать с другими дополнениями, работающими с ценами товаров в корзине или вывешанными на эти же события. Если происходит непонятное поведение плагина, попробуйте выставить приоритет 10 или выше на все события, на которых работает плагин.
Павел Гвоздь
22 апреля 2016, 17:54
modx.pro
23
6 750
+11
Поблагодарить автора Отправить деньги

Комментарии: 29

Алексей
23 апреля 2016, 13:17
0
Спасибо!
    Алексей
    23 апреля 2016, 13:58
    0
    Сейчас попробовал. Не отражаются скидки, все как обычно. Вроде все проверил. Выставил скидки от 1000 руб. и т.д.
    Вот скидки
      Павел Гвоздь
      23 апреля 2016, 14:00
      +1
      Скидка срабатывает? Скоро обновлю код на gist, там действительно была проблема.
        Алексей
        23 апреля 2016, 14:06
        0
        У меня ведь не изменяется общая сумма??? В смысле «скидка срабатывает». Напишите пожалуйста как обновите. Спасибо.
    Павел Гвоздь
    23 апреля 2016, 15:10
    +2
    В плагин добавлена функция вывода надписи:
    Текущая скидка 10% и 10 699.9 руб.
    Если наберете на 150 000 руб., то получите скидку 15%.
    Обновляется динамически

    Добавил в инструкцию.
      Воеводский Михаил
      24 апреля 2016, 02:05
      0
      Я даже предполагаю, из какого проекта данная вещь позаимствована. Согласен, полезна к этому плагину :)
        Павел Гвоздь
        24 апреля 2016, 09:48
        0
        Неа, там по иному делал я, т.к. реализация магазина требовала иного подхода. :)
      ViES
      26 апреля 2016, 14:52
      0
      Сам недавно реализовывал тоже самое, исходя из того же материала :) Только у меня скидки берутся из доп.поля-матрицы migx. Если надо, могу на гит залить.
        Николай
        26 апреля 2016, 23:16
        0
        Тов. Гвоздь, скажите пожалуйста, как
        «вешать плагин на события:
        msOnAddToCart
        msOnChangeInCart
        msOnRemoveFromCart
        OnHandleRequest
        OnLoadWebDocument
        »
          Павел Гвоздь
          27 апреля 2016, 10:07
          +1
          Создашь плагин и отмечаешь галочками события, по которым он будет срабатывать.
            Николай
            28 апреля 2016, 08:42
            0
            спасибо пробую!
          Дмитрий Иванов
          26 апреля 2016, 23:37
          0
          Все работает, спасибо.
            Сергей
            27 апреля 2016, 11:39
            0
            Воспользовался вашим решением, спасибо!
            После того как стал получать размер скидки из tv типа migx, перестала выводиться информация о размере скидки в чанке.
            $tvs = $modx->getObject('modTemplateVarResource', array(
                  'tmplvarid' => 92,
                  'contentid' => 1
                ));
                $tvs = json_decode($tvs->get('value'));
                foreach ($tvs as $value)
                {
                    $discounts[$value->summ] = $value->sale.'%';
                }
            Если будет время, подскажите, пожалуйста, в чем может быть проблема.
              Богдан
              19 октября 2016, 13:08
              0
              Друзья, подскажите пожалуйста, когда меняю количество товара в корзине или удаляю один товар, общая сумма корзины обновляется, но цена отдельного товара в списке товаров в корзине остается прежней и обновляется только при перезагрузке страницы. В консоли вижу ошибку:
              msdfc.ms2CallbacksClone.Cart.change.response.success is not a function
              Чанк tpl.msCart.row обновил. Что не так с Callbacks функцией?
                Павел Гвоздь
                19 октября 2016, 13:39
                +1
                Обновил код плагина.
                  Богдан
                  19 октября 2016, 14:01
                  0
                  Павел, спасибо! Все работает теперь.
                Дмитрий Стрельников
                09 декабря 2016, 12:16
                0
                Павел, добрый день! Спасибо за плагин!

                В плагин добавлена функция вывода надписи:
                Текущая скидка 10% и 10 699.9 руб.
                Если наберете на 150 000 руб., то получите скидку 15%.
                Обновляется динамически

                Вот у меня динамически обновляется только в корзине, а в tpl.msMiniCart на остальных страницах только после обновления страницы. Подскажите, как решить?

                  Павел Гвоздь
                  09 декабря 2016, 12:38
                  0
                  Насколько я знаю, в мини корзине не получится вызывать колбеки. А обновление этих значений завязано как раз на них. Как вариант использовать везде вместо мини корзины — полную версию оной.
                  Дмитрий Стрельников
                  09 декабря 2016, 13:24
                  0
                  Привет!
                  Решение типа:
                  [[!msCart?
                  	&tpl=`tpl.msMiniCart`
                  ]]
                  не решает. Вообще всё зверски кешируется, непонятно кем…
                  Текущая скидка 5% и 815.3 руб.
                  При покупке на 50 000 руб., вы получите скидку 10%.
                  Ваша корзина пуста
                    Дмитрий Стрельников
                    09 декабря 2016, 13:25
                    0
                    А! ну понятно) span в другом чанке добавляли)
                      nekto
                      02 июля 2018, 01:57
                      0
                      Всем привет,
                      Что-то с текущей версией minishop2 js не хочет запускаться. Может быть кто-то уже сталкивался с этим?
                        Гущин Сергей
                        Гущин Сергей
                        27 сентября 2019, 14:48
                        0
                        А если надо исключить определенный товар из подсчета скидки, это реализуемо?
                          Павел Гвоздь
                          27 сентября 2019, 17:05
                          0
                          Да.
                            Гущин Сергей
                            Гущин Сергей
                            27 сентября 2019, 19:31
                            0
                            Паш, можешь подсказать как? C меня донат. Ну и на будущее предкам останется спасибо для тебя по этой заметке.
                            Тут два состояния:
                            case 'msOnAddToCart':
                                case 'msOnChangeInCart':
                                case 'msOnRemoveFromCart':
                            И второе:
                            case 'OnHandleRequest':
                                case 'OnLoadWebDocument':
                            Если в первом как бы более-менее понятно (хотя не факт)
                            Там мы можем взять id товара и исключить его через if, но надо потом его стоимость надо приплюсовать к сумме со скидками,

                            Ну а во втором пока что темный лес
                              Павел Гвоздь
                              27 сентября 2019, 19:58
                              0
                              Да этот код старый, как незнай что…
                              По идее правок в 3 первых событиях должно хватить.
                          Михаил Гудман
                          13 октября 2019, 21:43
                          0
                          Павел долгих лет жизни вам:)
                          Подскажите пожалуйста, как вместо процентов в данном примере добавить определенный товар?
                          Т.е. если общая сумма заказа больше 1000, то пользователь может выбрать один из 3-4х товаров как подарок к своему заказу. Это вообще сложно сделать?
                            igor
                            12 ноября 2022, 11:04
                            0
                            а как поместить значение этой скидки в письмо что приходит о заказе?
                              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                              29