Skip to content
ms3PromoCode
Промо-коды для MiniShop3 с гибкими правилами, генерацией по маске и интеграцией в позиции заказа
  1. Компоненты
  2. ms3PromoCode
  3. Фронтенд
  4. Шаблон формы

Шаблон формы

Документация о шаблоне формы покупателя — какие data-атрибуты использует UI-слой, как переопределить чанк, как заменить отдельные ассеты.

Базовый шаблон

Чанк 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-слой (PromoCodeUI.js) монтируется через CSS-селекторы — структура должна сохраняться.

Атрибут / селекторНазначение
[data-ms3-promocode="form"]Корневой элемент формы. UI-слой автомонтируется на каждый такой блок.
[data-ms3pc-state="empty"]Контейнер «нет применённого кода» — поле ввода + кнопка «Применить»
[data-ms3pc-state="applied"]Контейнер «код применён» — информация + кнопка «Отменить»
.ms3pc-form__code<input> для ввода кода
.ms3pc-form__applyКнопка «Применить»
.ms3pc-form__removeКнопка «Отменить»
.ms3pc-form__code-valueКуда выводится текст кода после применения
.ms3pc-form__discountКуда выводится отформатированная сумма скидки
.ms3pc-form__errorКонтейнер для сообщений об ошибках / уведомлений

Опциональные data-атрибуты на корневом элементе

АтрибутЗначенияОписание
data-confirm-removetrue / falseЗапрашивать подтверждение при снятии кода. По умолчанию true.
data-confirm-messageстрокаТекст подтверждения при снятии
data-confirm-okстрокаТекст кнопки подтверждения
data-confirm-cancelстрокаТекст кнопки отмены
data-auto-removed-labelстрокаПрефикс уведомления при автосбросе
data-error-timeoutмс (число)Через сколько прятать сообщение об ошибке. По умолчанию 8000.
data-ms3pc-auto-reloadtrue / falseПерезагружать страницу после apply/remove. По умолчанию true.

Перезагрузка страницы после действия

По умолчанию после успешного apply или remove форма делает window.location.reload(). Это нужно потому, что:

  • Цены позиций в HTML корзины уже отрендерены сервером — после применения скидки они должны обновиться.
  • Самый надёжный способ для любого шаблона — перезагрузка.

Для AJAX-карт, где DOM обновляется без перезагрузки, отключите автоперезагрузку:

html
<div class="ms3pc-form" data-ms3-promocode="form" data-ms3pc-auto-reload="false">
    ...
</div>

В этом случае ваш JS должен сам отреагировать на событие ms3promocode:applied или ms3promocode:removed и обновить DOM (см. JS API).

Кастомный шаблон

Через свой чанк

  1. Создайте чанк, например my_promo_form.
  2. Используйте его в сниппете:
fenom
{'!ms3PromoCodeForm' | snippet : ['tpl' => 'my_promo_form']}

В шаблоне доступны переменные:

ПеременнаяТипОписание
appliedboolПрименён ли сейчас код
applied_codestringСам применённый код
discount_amountfloatСумма скидки
discount_formattedstringОтформатированная сумма (-500 ₽)
placeholderstringТекст placeholder из параметров сниппета
apply_labelstringНадпись на кнопке «Применить»
remove_labelstringНадпись на кнопке «Отменить»
applied_labelstringПрефикс «Код:» в блоке «применён»
confirm_messagestringТекст подтверждения при снятии
auto_removed_labelstringПрефикс уведомления автосброса

Через собственный HTML без сниппета

Можно добавить блок прямо в шаблон страницы — UI-слой подхватит:

html
<div class="my-promo-form" data-ms3-promocode="form">
    <div data-ms3pc-state="empty">
        <input class="ms3pc-form__code" placeholder="Промо-код" />
        <button class="ms3pc-form__apply">Применить</button>
    </div>
    <div data-ms3pc-state="applied" hidden>
        <span>Применён код: <b class="ms3pc-form__code-value"></b></span>
        <span class="ms3pc-form__discount"></span>
        <button class="ms3pc-form__remove">Отменить</button>
    </div>
    <div class="ms3pc-form__error" hidden></div>
</div>

Внимание

В этом случае нет SSR-hydration — состояние «применён» не будет показано при загрузке. JS-слой увидит активный код и переключится на applied через ~100 мс после DOMContentLoaded. Это даст лёгкое мигание формы.

Чтобы избежать мигания — используйте сниппет ms3PromoCodeForm, он рендерит правильное состояние сразу на сервере.

Override-папка для ассетов

Любой файл из пакета можно переопределить, поместив свою версию по тому же пути в специальной папке:

assets/components/ms3promocode-overrides/

Примеры:

Заменяемый файлКуда положить override
assets/components/ms3promocode/css/web/ms3promocode.cssassets/components/ms3promocode-overrides/css/web/ms3promocode.css
assets/components/ms3promocode/js/web/ui/PromoCodeUI.jsassets/components/ms3promocode-overrides/js/web/ui/PromoCodeUI.js
assets/components/ms3promocode/js/web/ms3promocode.headless.jsassets/components/ms3promocode-overrides/js/web/ms3promocode.headless.js

Плагин при регистрации ассетов на странице (событие OnLoadWebDocument) сначала проверяет наличие файла в overrides-папке и подключает его, иначе — оригинал.

Подсказка

Это удобно для:

  • Кастомных стилей формы под ваш дизайн (своя ms3promocode.css).
  • Наследования UI-логики (своя PromoCodeUI.js с дополнительными методами).
  • Полной замены headless-ядра (редкий случай, нужен только для интеграций со строго custom API).

При обновлении пакета overrides не затрагиваются.

Стили

Базовый CSS файла ms3promocode.css минимален — без зависимостей от bootstrap/tailwind. Использует BEM-нейминг с префиксом .ms3pc-form__*. Для тонкой настройки переопределите стили в своём шаблоне:

css
.ms3pc-form__apply {
    background: var(--my-primary-color);
    color: white;
}

Или подмените файл целиком через override-папку.