Skip to content
ms3PromoCode
ms3PromoCode
Промо-коды для MiniShop3 с гибкими правилами, генерацией по маске и интеграцией в позиции заказа
  • MODX 3
  • PHP 8.2
  • miniShop3
  1. Компоненты
  2. ms3PromoCode
  3. Сниппеты
  4. ms3PromoCodeForm

ms3PromoCodeForm ​

Отрисовывает форму ввода промо-кода. Работает без параметров.

Параметры ​

ПараметрПо умолчаниюОписание
tplms3promocode_formИмя чанка-шаблона. Поддерживает pdoTools-префиксы @FILE / @INLINE / @TEMPLATE.
placeholderлексикон ms3promocode_frontend_placeholderТекст placeholder в поле ввода
apply_labelлексикон ms3promocode_frontend_applyНадпись на кнопке «Применить»
remove_labelлексикон ms3promocode_frontend_removeНадпись на кнопке «Отменить»
applied_labelлексикон ms3promocode_frontend_applied_labelПрефикс в блоке «применён код» (например, Код:)
confirm_messageлексикон ms3promocode_frontend_confirm_removeСообщение в подтверждении при снятии кода
auto_removed_labelлексикон ms3promocode_frontend_auto_removedУведомление при автосбросе кода после изменения корзины

SSR-переменные (передаются в чанк автоматически) ​

ПеременнаяТипОписание
appliedboolПрименён ли сейчас код к текущей корзине
applied_codestringКод, применённый к корзине (если есть)
discount_amountfloatСумма скидки, число
discount_formattedstringСумма с ведущим минусом (-500 ₽). Целые — без копеек, дробные — 2 знака после точки, разделитель тысяч — пробел. Символ и позиция валюты — из настроек ms3_currency_symbol (по умолчанию ₽) и ms3_currency_position (before / after, по умолчанию after).

В шаблоне доступны и параметры сниппета ({$placeholder}, {$apply_label}...), и SSR-переменные ({if $applied}...{/if}).

Примеры ​

Базовый вызов ​

fenom
{'!ms3PromoCodeForm' | snippet}

Свой чанк ​

fenom
{'!ms3PromoCodeForm' | snippet : ['tpl' => 'my_promocode_form']}

Шаблон из файла ​

fenom
{'!ms3PromoCodeForm' | snippet : ['tpl' => '@FILE /path/to/my-form.tpl']}

Свои подписи ​

fenom
{'!ms3PromoCodeForm' | snippet : [
    'placeholder' => 'Введите ваш код',
    'apply_label' => 'Применить скидку',
    'remove_label' => 'Убрать скидку',
    'confirm_message' => 'Точно убрать скидку?',
]}

Шаблон по умолчанию ​

Чанк ms3promocode_form:

fenom
<div class="ms3pc-form"
     data-ms3-promocode="form"
     data-confirm-message="{$confirm_message}"
     data-auto-removed-label="{$auto_removed_label}">

    <div class="ms3pc-form__state" data-ms3pc-state="empty"{if $applied} hidden{/if}>
        <input type="text" class="ms3pc-form__code"
               placeholder="{$placeholder}" autocomplete="off" />
        <button type="button" class="ms3pc-form__apply">{$apply_label}</button>
    </div>

    <div class="ms3pc-form__applied" data-ms3pc-state="applied"{if !$applied} hidden{/if}>
        <div class="ms3pc-form__info">
            <span class="ms3pc-form__code-label">{$applied_label}</span>
            <span class="ms3pc-form__code-value">{$applied_code}</span>
            <span class="ms3pc-form__discount">{if $applied}{$discount_formatted}{/if}</span>
        </div>
        <button type="button" class="ms3pc-form__remove">{$remove_label}</button>
    </div>

    <div class="ms3pc-form__error" hidden></div>
</div>

Сохраняйте data-атрибуты

UI-слой монтируется по [data-ms3-promocode="form"], состояния переключает через data-ms3pc-state. В своём шаблоне эти атрибуты обязательны — без них UI не заработает.

Подробнее о data-атрибутах и переопределении шаблона: Шаблон формы.

Где разместить ​

Вызывайте в шаблоне страницы корзины (обычно cart, URL вроде /korzina/). URL и имя шаблона — выбор магазина: серверная отрисовка работает везде, где доступен токен корзины и draft MS3.

Привычное место — рядом с итоговой суммой или над кнопкой «Оформить заказ»:

fenom
<div class="cart-summary">
    {* итоги корзины *}
    <div class="cart-summary__total">{$total_cost}</div>

    {* поле промо-кода *}
    {'!ms3PromoCodeForm' | snippet}

    {* кнопка оформления *}
    <a href="/order/" class="btn-checkout">Оформить заказ</a>
</div>

Подсказка

Если код уже применён к корзине на момент загрузки, блок «применён код» отрисовывается сразу на сервере — без мигания формы.

Поведение в особых ситуациях ​

  • Корзина пустая, кода нет. Сниппет отрисовывает пустую форму (applied=false, discount_amount=0.0). Это штатный сценарий — ничего в журнал не пишется.
  • Исключение при получении токена или draft. Сниппет не падает: ловит \Throwable, пишет в MODX error log запись [ms3PromoCode] SSR hydration skipped: <сообщение> уровня WARN и отрисовывает пустую форму.
  • Автозагрузка лексикона. Тема ms3promocode:default подгружается самим сниппетом — вручную $modx->lexicon->load(...) вызывать не нужно.