[UPDATE] Разные скидки в зависимости от общей суммы корзины
По следам записи Михаила Воеводского и этого объявления о работе был написан плагин для miniShop2, который позволяет выставить скидку в процентах для всей корзины в зависимости от общей суммы корзины.
Скидка выставляется пошагово: по достижении определённых сумм применяется своя скидка. К примеру, корзина стоит 100кр — скидка 10%, 150кр — 15%. При желании можно выставить сколько угодно шагов и какой угодно процент. Данные указываются массивом в самом начале плагина, вот так:
Скидка выставляется пошагово: по достижении определённых сумм применяется своя скидка. К примеру, корзина стоит 100кр — скидка 10%, 150кр — 15%. При желании можно выставить сколько угодно шагов и какой угодно процент. Данные указываются массивом в самом начале плагина, вот так:
$discounts = array(
'100000' => '10%',
'150000' => '15%',
'200000' => '20%',
);
Часть кода была взята из компонента msPromoCode, в частности для того, чтобы цены на товары в корзине обновлялись динамически при смене кол-ва или удалении товара из корзины.Инструкция по установке
- Создаём плагин (код плагина) и вешаем на события:
- msOnAddToCart
- msOnChangeInCart
- msOnRemoveFromCart
- OnHandleRequest
- OnLoadWebDocument
- Создаём чанк 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>
- Для динамического обновления цен на товары в корзине, при вызове сниппета 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 или выше на все события, на которых работает плагин.
Поблагодарить автора
Отправить деньги
Комментарии: 29
Спасибо!
Сейчас попробовал. Не отражаются скидки, все как обычно. Вроде все проверил. Выставил скидки от 1000 руб. и т.д.
Вот скидки
Вот скидки
Скидка срабатывает? Скоро обновлю код на gist, там действительно была проблема.
У меня ведь не изменяется общая сумма??? В смысле «скидка срабатывает». Напишите пожалуйста как обновите. Спасибо.
Обновил.
Спасибо, все работает.
В плагин добавлена функция вывода надписи:
Добавил в инструкцию.
Текущая скидка 10% и 10 699.9 руб.Обновляется динамически
Если наберете на 150 000 руб., то получите скидку 15%.
Добавил в инструкцию.
Я даже предполагаю, из какого проекта данная вещь позаимствована. Согласен, полезна к этому плагину :)
Неа, там по иному делал я, т.к. реализация магазина требовала иного подхода. :)
Сам недавно реализовывал тоже самое, исходя из того же материала :) Только у меня скидки берутся из доп.поля-матрицы migx. Если надо, могу на гит залить.
Тов. Гвоздь, скажите пожалуйста, как
«вешать плагин на события:
msOnAddToCart
msOnChangeInCart
msOnRemoveFromCart
OnHandleRequest
OnLoadWebDocument
»
Создашь плагин и отмечаешь галочками события, по которым он будет срабатывать.
спасибо пробую!
Все работает, спасибо.
Воспользовался вашим решением, спасибо!
После того как стал получать размер скидки из tv типа migx, перестала выводиться информация о размере скидки в чанке.
После того как стал получать размер скидки из 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.'%';
}
Если будет время, подскажите, пожалуйста, в чем может быть проблема.
Друзья, подскажите пожалуйста, когда меняю количество товара в корзине или удаляю один товар, общая сумма корзины обновляется, но цена отдельного товара в списке товаров в корзине остается прежней и обновляется только при перезагрузке страницы. В консоли вижу ошибку:
msdfc.ms2CallbacksClone.Cart.change.response.success is not a function
Чанк tpl.msCart.row обновил. Что не так с Callbacks функцией?
Обновил код плагина.
Павел, спасибо! Все работает теперь.
Павел, добрый день! Спасибо за плагин!
В плагин добавлена функция вывода надписи:
Текущая скидка 10% и 10 699.9 руб.
Если наберете на 150 000 руб., то получите скидку 15%.
Обновляется динамически
Вот у меня динамически обновляется только в корзине, а в tpl.msMiniCart на остальных страницах только после обновления страницы. Подскажите, как решить?
В плагин добавлена функция вывода надписи:
Текущая скидка 10% и 10 699.9 руб.
Если наберете на 150 000 руб., то получите скидку 15%.
Обновляется динамически
Вот у меня динамически обновляется только в корзине, а в tpl.msMiniCart на остальных страницах только после обновления страницы. Подскажите, как решить?
Насколько я знаю, в мини корзине не получится вызывать колбеки. А обновление этих значений завязано как раз на них. Как вариант использовать везде вместо мини корзины — полную версию оной.
Привет!
Решение типа:
Текущая скидка 5% и 815.3 руб.
При покупке на 50 000 руб., вы получите скидку 10%.
Ваша корзина пуста
Решение типа:
[[!msCart?
&tpl=`tpl.msMiniCart`
]]
не решает. Вообще всё зверски кешируется, непонятно кем…Текущая скидка 5% и 815.3 руб.
При покупке на 50 000 руб., вы получите скидку 10%.
Ваша корзина пуста
А! ну понятно) span в другом чанке добавляли)
Всем привет,
Что-то с текущей версией minishop2 js не хочет запускаться. Может быть кто-то уже сталкивался с этим?
Что-то с текущей версией minishop2 js не хочет запускаться. Может быть кто-то уже сталкивался с этим?
А если надо исключить определенный товар из подсчета скидки, это реализуемо?
Да.
Паш, можешь подсказать как? C меня донат. Ну и на будущее предкам останется спасибо для тебя по этой заметке.
Тут два состояния:
Там мы можем взять id товара и исключить его через if, но надо потом его стоимость надо приплюсовать к сумме со скидками,
Ну а во втором пока что темный лес
Тут два состояния:
case 'msOnAddToCart':
case 'msOnChangeInCart':
case 'msOnRemoveFromCart':
И второе:case 'OnHandleRequest':
case 'OnLoadWebDocument':
Если в первом как бы более-менее понятно (хотя не факт)Там мы можем взять id товара и исключить его через if, но надо потом его стоимость надо приплюсовать к сумме со скидками,
Ну а во втором пока что темный лес
Да этот код старый, как незнай что…
По идее правок в 3 первых событиях должно хватить.
По идее правок в 3 первых событиях должно хватить.
Павел долгих лет жизни вам:)
Подскажите пожалуйста, как вместо процентов в данном примере добавить определенный товар?
Т.е. если общая сумма заказа больше 1000, то пользователь может выбрать один из 3-4х товаров как подарок к своему заказу. Это вообще сложно сделать?
Подскажите пожалуйста, как вместо процентов в данном примере добавить определенный товар?
Т.е. если общая сумма заказа больше 1000, то пользователь может выбрать один из 3-4х товаров как подарок к своему заказу. Это вообще сложно сделать?
а как поместить значение этой скидки в письмо что приходит о заказе?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.