evoSale - модуль скидок (промокодов) для MODX Evo (ShopKeeper)

Небольшое вступление
Очень часто на сайтах Интернет магазинов требуется добавить функционал скидок, и вечно приходиться писать свои костыли, для очередного проекта написал удобный модуль которым теперь и поделиться за вознаграждение не жалко:)

В целом это первая ласточка из того что хочу реализовать под EVO ибо в свете того что MODX 3 ждать нам еще долго :(
rtfm.modx.com/revolution/2.x/getting-started/an-overview-of-modx/roadmap

А на REVO желания переходить так и нет то решил написать замену Shopkeeper но пока не хватает под это времени да и стимула^ поэтому буду писать частями и думаю в итоге получиться то что надо.

Итак первый модуль evoSale

Возможности:
— Создание промокодов с типом % или Руб.
— Возможность указать дату до которой действует промокод
— Возможность указать количество использований промокода
— Массовое создание промокодов

Установка:
— устанавливаем модуль + плагин (будет доступен пакет автоустановки через extras)

Интеграция c SHK:
— В Шаблоне корзины добавляем плейсхолдер [+evoSale+] — на месте него будет форма для ввода промокода + после ввода промокода информация о том какая скидка.

— Для вывода в почте пока реализовано не совсем правильно но зато очень просто:
вставляем вот такой вызов:

[[if? &is=`$_SESSION['discount']['discount']:>:0` &math=`on` &then=`
 (с учетом скидки: <b>[[if? &is=`$_SESSION['discount']['discount']` &math=`on`]] [[if? &is=`$_SESSION['discount']['discounttype']` &math=`on`]] </b>)
`]]

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

В целом на этом все больше никаких действий для работы модуля делать не нужно.

В модуле пока это все дело пишется в поле комментария, но планирую в целом переписать модуль SHK что б это было по человечески, так же сделать подобный модуль для учета доставки.

Скриншоты:













35 комментариев

avatar
За небольшое вознаграждения был получен данный модуль от Дмитрия. Хорошая вещь. Поставил в 1 клик. и вывел всего 1 плесхолдер в корзине и все. Работает на ура. Спасибо за хорошее решение.
avatar
Дмитрий, а можете сделать небольшой магазин дополнений? чтобы можно было с него напрямую купить?
Покупки будут стимулировать дальнейшее развитие модуля, да и на оплату хостинга может что-то останется.
А в дальнейшем сможете брать под реализацию чужие дополнения, так будем всё в одном месте и документация и модули.
Если это получиться, то можно сделать условие, что если дополнение не обновлялось в течении полу года, то оно переходит в разряд бесплатных или с символичной ценой.

Тут даже дело не в заработке на компонентах, а в том, чтобы у разработчиков был стимул создавать к ним документацию, подгонять для Extras, поддерживать и дорабатывать.
avatar
А где бы это дело поглядеть?
  • 1px
  • 0
avatar
Так куда платить, сколько стоит модуль?
avatar
Присоединяюсь к вопросу
avatar
На днях постараюсь дописать хоть какую то документацию и сделать автоинстал что б был
avatar
ну и оформлю что куда где платить и сколько
avatar
Блин то что искал! Скинь мне плиз реквизиты перекину тоже оч нужно это решение!!!
avatar
Купил у Димки данный модуль. Чем сэкономил кучу времени. Спасибо. Все пашет.
avatar
Добрый день, возможно ли переделать его под modx revo и сколько это будет стоить? Хотел бы купить, но у меня revo. Если не сложно, то напишите цену и срок на почту lex-kosta@yandex.kz
avatar
А зачем переделывать если для рево и так есть модули скидок, и для шопкипера и для минишопа.
avatar
вы имеете ввиду модуль «Подарочные карты и скидки»? там нет некоторых функций, которые нужны, а именно: что бы можно было задать время для промокода и что бы один промокод можно было использовать неограниченное количество раз.
avatar
Тем не менее мне кажется что доработать уже существующий модуль будет проще, чем сделать новый. Попробуйте задать вопрос на форуме шопкипера.

Либо если магазин еще в разработке, посмотрите в сторону минишопа, там гораздо более богатый функционал.
avatar
Хорошо, спасибо вам за ответы!
avatar
Все верно. Нет смысла переписывать под Рево.
avatar
А как заполучить и когда evoShop увидим =)?
avatar
Уже скоро делаю 2 проекта как раз с использованием.
Как закончу соберу демо магаз и выкачу первую версию
avatar
А если мне не нужны промокоды и срок их действия, а просто нужна скидка (% или руб), и чтобы SHK подставлял в корзину не «базовую» цену, а вычисленную цену (со скидкой)?

Этот модуль/плагин пойдет?
avatar
в таком случае можно обойтись простым плагином:
$e=$modx->Event;
if($e->name=='OnSHKcalcTotalPrice'){
    if($_SESSION['delivery']=='pickup'){//скидка если выбран самовывоз
	$totalPrice = round( ($totalPrice - ($totalPrice/10)) ,2);
    }
    $e->output($totalPrice);
}
avatar
Все верно так прощп будет. Модуль актуален только если есть промокода
Срок действия не критичен никто не мешает поставить +й100 лет;)
А вот без введенного кода скидку не получить.
avatar
Спасибо, ребята, я саму-то MODx уже неплохо знаю. а вот SHK — пока очень поверхностно.

Буду благодарен за ссылку на список событий SHK.
avatar
Все, события нашел.
avatar
Александр, если не трудно, просьба ответить еще на вопрос.

В вашем плагине использована totalPrice, а у меня задача — индивидуальные скидки для некоторых товаров. Они оформлены, например, в виде ТВ.

У одних товаров скидка 10%, у других 200 руб., и так далее.

Задана также базовая цена товара, и нужно проверять, задана ли скидка для этого товара, и вычислять с её помощью скидочную цену, которая и идет в корзину.

Скидки не имеют срока давности, ставятся-убираются вручную.

Вот здесь как лучше?
avatar
А вариант сразу отправлять товар со скидкой в корзину не катит? Или нужно чтобы в корзине для каждого товара отображалась цена без скидки, а итоговая сумма со всеми скидками?
avatar
Для этого всю жизнь был один путь — плагин на событие OnSHKgetProductPrice — который принимает цену $price и массив $purchaseArray со всеми данными о покупке (чтобы можно было различные условия учесть) и возвращает рассчитанную по новым условиям цену.
avatar
а мне нравится другой путь: плагином на событие OnDocFormSave рассчитывать новую цену [*discount_price*] и ее вместо [*price*] передавать Шопкиперу.
Чтобы избавить Шопкипер от лишних операций, он и так при каждом добавлении товара всю корзину гоняет.
Комментарий отредактирован 2017-03-19 16:04:02 пользователем o_oleksandr
avatar
А вариант сразу отправлять товар со скидкой в корзину не катит? Или нужно чтобы в корзине для каждого товара отображалась цена без скидки, а итоговая сумма со всеми скидками?

Катит. Как раз такая задача в общем и стоит.

Для этого всю жизнь был один путь — плагин на событие OnSHKgetProductPrice.

Понял. Моя жизнь в ШК только начинается, отсюда такие глупые вопросы.

а мне нравится другой путь: плагином на событие OnDocFormSave рассчитывать новую цену [*discount_price*] и ее вместо [*price*] передавать Шопкиперу.

Да, это вариант. Но вот как раз в чем загвоздка — как передать Шопкиперу [*discount_price*] вместо [*price*]?
avatar
Эта проблема не имеет отношения к ШК, как таковому.

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

1) Скидка задается один раз, для каждого товара отдельно — пишем плагин на сохранение товара или учитываем при импорте рассчитанную цену, уже со скидкой; эту цену пишем в TV price и пусть движок магазина с ней работает. Цену же без скидок пишем в TV full_price и используем для спецэффектов при выводе.

2) Скидка рассчитывается для каждого заказа, например накопительная скидка или скидка, индивидуальная для каждого посетителя. В этом случае пишем в TV price нормальную цену, а скидку рассчитываем уже плагином на OnSHKgetProductPrice
avatar
В шаблоне товара прописать цену:

<input type="hidden" name="shk-price" class="shk-price" value="[+discount_price+]" />

И у вызове Шопкипера указать тв с ценой:
[!Shopkeeper? &priceTV=`discount_price`!]

Вот тут подробнее все рассписано — i--gu.ru/shopkeeper2 (если вдруг не находили этот источник).
avatar
А вы в курсе, что передача цены прямо в форме — это как минимум прямой путь ее подмены прямо в консоли браузера? :) Чем потом докажете, что на момент заказа у вас была цена 10 рублей, а не 1? :))
avatar
Новый TV — это хождение по граблям. Завтра вам понадобится скидка вида «за три данных товара в одном чеке -5%, за четыре -10%» и будете вы опять возвращаться к исходной цене и расчету через плагин :)
avatar
А вы в курсе, что передача цены прямо в форме — это как минимум прямой путь ее подмены прямо в консоли браузера?

эммммм, а зачем тогда вообще есть возможность цену передавать в форме?
Завтра вам понадобится скидка вида «за три данных товара в одном чеке -5%, за четыре -10%»

Никогда не знаешь, что будет завтра, и поэтому всех вариантов не предвидишь =)
avatar
Цена напрямую и не передается, она берется из базы по id товара на момент сохранения товара в корзину. Для этого в вызове Shopkeeper и указывается имя параметра, хранящего цену ( по умолчанию price). Иначе каждый умник ставил бы себе через консоль браузера ту цену, которую он хочет заплатить за товар и все это летело бы прямо в корзину.

Никогда не знаешь, что будет завтра, и поэтому всех вариантов не предвидишь

Тут согласен. Но именно для того, чтобы предусмотреть возможность без бубна считать нужные цены на лету и придуман плагин на событие OnSHKgetProductPrice (расчет итоговой цены конкретного товара) и на событие OnSHKcalcTotalPrice (расчет итоговой стоимости корзины с возможной скидкой за сумму заказа и т.п.)
avatar
Всем большое спасибо. Как раз то, что нужно — в голове теперь не пустое место, а пища к размышлению :)
avatar
привет. модуль еще не готов? где посмотреть?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.