[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;
}

👨‍💻 При желании вы можете объединить оба плагина в один – логика полностью совместима, это вопрос удобства поддержки.
Павел Гвоздь
Вчера в 13:40
modx.pro
1
85
+2
Поблагодарить автора Отправить деньги

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0