[msPromoCode2] Применение скидки при входе на сайт

Мало кто знает, что компонент msPromoCode2 можно использовать не только как классическую систему промокодов, но и как полноценную глобальную скидку для всего сайта – применяемую автоматически, без необходимости ввода кода на странице оформления заказа.
При этом стандартная логика работы промокодов полностью сохраняется: если пользователь в корзине введёт промокод с более выгодными условиями, система корректно применит именно его.
Вся реализация настраивается всего в три простых шага.
—
1️⃣ Шаг 1
Создайте промокод с кодом null.
Важно: в дальнейшем этот промокод нельзя удалять, так как он используется системой как базовый.
—
2️⃣ Шаг 2
В начале чанка tpl.msPromoCode2.form (или как там у вас он называется) добавьте следующий код:
{if $coupon['code'] === 'null'}
{var $coupon = []}
{var $is_active = false}
{/if}Это необходимо для того, чтобы базовый промокод стал скрытым: не отображался в интерфейсе и не выглядел как «активный» для пользователя.
—
3️⃣ Шаг 3
Создайте плагин на события: OnWebPageInit и mspc2OnUnsetCoupon.
<?php
// Подключаем сервис msPromoCode2
$mspc2 = $modx->getService(
'mspromocode2',
'msPromoCode2',
MODX_CORE_PATH . 'components/mspromocode2/model/mspromocode2/'
);
if (!($mspc2 instanceof msPromoCode2)) {
return;
}
$mspc2->initialize($modx->context->key);
// Берём менеджер промокодов – через него читаем/ставим текущий купон
$manager = $mspc2->getManager();
// Код базового скрытого промокода
$code = 'null';
switch ($modx->event->name) {
/**
* OnWebPageInit
*
* Срабатывает на каждом заходе на сайт.
*
* Логика: если у пользователя ещё нет промокода, то ставим базовый `null`.
*/
case 'OnWebPageInit':
// Текущий промокод пользователя (если уже установлен)
$coupon_current = $manager->getCurrentCoupon();
// Достаём промокод `null` из базы (он должен быть создан заранее)
$coupon_null = $manager->getCoupon($code);
// Если текущего промокода нет, но `null` существует – применяем его
if (!is_array($coupon_current) && is_array($coupon_null)) {
$manager->setCoupon((int)$coupon_null['id']);
}
break;
/**
* mspc2OnUnsetCoupon
*
* Срабатывает при попытке снять промокод (отменить активный купон).
*
* Логика:
* - если снимают `null` – запрещаем
* - если снимают любой другой – после снятия возвращаем `null`
*/
case 'mspc2OnUnsetCoupon':
// Купон, который пытаются снять, приходит в $scriptProperties
$coupon = $scriptProperties['coupon'];
// Не даём снять базовый промокод, чтобы скидка по умолчанию не исчезала
if (is_array($coupon) && $coupon['code'] === $code) {
return;
}
// Возвращаем базовый промокод обратно
$coupon_null = $manager->getCoupon($code);
if (is_array($coupon_null)) {
$manager->setCoupon((int)$coupon_null['id']);
}
break;
}Этих трёх простых шагов достаточно, чтобы использовать msPromoCode2 как глобальную скидочную систему в вашем интернет магазине, без надобности применения промокода клиентом в корзине.
🔥 Бонус: доп скидка к купону null в зависимости от количества товаров
Если хочется оживить базовую скидку, можно создать отдельный плагин на событие mspc2OnGetCoupon и динамически увеличивать процент базовой скидки в зависимости от количества товаров в корзине.
Например, в коде плагина сейчас так (поправьте массив $discount_additionals под свои требования):
– 2 товара → +10% к базовой скидке
– 3+ товара → +15% к базовой скидке
<?php
/**
* Бонус-логика:
* Добавляем к процентной скидке базового купона `null` дополнительный процент в зависимости от total_count в корзине.
*/
// Подключаем сервис msPromoCode2
$mspc2 = $modx->getService(
'mspromocode2',
'msPromoCode2',
MODX_CORE_PATH . 'components/mspromocode2/model/mspromocode2/'
);
if (!($mspc2 instanceof msPromoCode2)) {
return;
}
$mspc2->initialize($modx->context->key);
// Берём менеджер промокодов – через него читаем/ставим текущий купон
$manager = $mspc2->getManager();
// Код базового скрытого промокода
$code = 'null';
switch ($modx->event->name) {
/**
* mspc2OnGetCoupon
*
* Срабатывает в момент получения промокода (например, при применении в корзине).
*
* Здесь можно "на лету" модифицировать параметры купона, например:
* - усилить процент скидки в зависимости от количества товаров в корзине
*
* Важно: мы меняем $coupon и возвращаем его через returnedValues['coupon'].
*/
case 'mspc2OnGetCoupon':
// Забираем сервис miniShop2, чтобы получить статус корзины (кол-во товаров и т.д.)
$ms2 = $mspc2->getMiniShop2();
// Иногда сервис cart может быть не загружен – подстрахуемся
if (empty($ms2->cart)) {
$ms2->loadServices($this->ctx);
}
$ms2->cart->initialize($this->ctx);
// Текущий купон, который msPromoCode2 собирается применить
$coupon = $scriptProperties['coupon'];
// Доп. проценты в зависимости от количества товаров в корзине:
// - если >=2 и <3 товаров: +10%
// - если >=3 и <99999 товаров: +15%
$discount_additionals = [
['value' => 10, '>=' => 2, '<' => 3],
['value' => 15, '>=' => 3, '<' => 99999],
];
/**
* Применяем надбавку только если это купон `null` и он со скидкой в %-процентах
*/
if (is_array($coupon) && strstr($coupon['discount'], '%') && $coupon['code'] === $code) {
// Получаем статус корзины (в т.ч. total_count – число товаров)
$cart_status = $ms2->cart->status();
// Подбираем надбавку по диапазону total_count
$discount_plus = 0;
foreach ($discount_additionals as $v) {
if ($cart_status['total_count'] >= $v['>='] && $cart_status['total_count'] < $v['<']) {
$discount_plus = (int)$v['value'];
}
}
// Увеличиваем базовую скидку купона на найденную надбавку
$coupon['discount'] = (intval($coupon['discount']) + $discount_plus) . '%';
}
// Возвращаем модифицированный купон обратно в msPromoCode2
$modx->event->returnedValues['coupon'] = $coupon;
break;
}👨💻 При желании вы можете объединить оба плагина в один – логика полностью совместима, это вопрос удобства поддержки.
Поблагодарить автора
Отправить деньги
0