
msOrderTotal
Итоги текущей корзины и заказа для мини-корзины в шапке. Виджет перерисовывается при изменениях в корзине, если задан selector.
Кэширование
Сниппет работает с сессией пользователя и должен вызываться некэшированно (!msOrderTotal).
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
| tpl | tpl.msOrderTotal | Чанк оформления |
| return | tpl | Формат: data (массив), tpl (отрисовка чанка) |
| selector | — | CSS-селектор контейнера. Обязателен для автообновления. В свойствах сниппета не объявлен (#805) |
Свойства formatPrices / withCurrency
В админке у сниппета могут отображаться formatPrices и withCurrency. Код их не читает: *_formatted всегда с валютой/единицей веса (#825).
Чанк по умолчанию
Компонент поставляет чанк tpl.msOrderTotal:
<span class="ms3-order-total">
<span class="ms3-order-total__count">{$total_count}</span>
{if $total_count > 0}
<span class="ms3-order-total__cost">{$total_cost_formatted}</span>
{/if}
</span>Автообновление виджетов
Задавайте selector при каждом вызове — без него виджет не обновится:
<div id="header-cart">
{'!msOrderTotal' | snippet : [
'selector' => '#header-cart'
]}
</div>Без selector виджет не обновляется
Автоопределения контейнера для msOrderTotal нет. Когда селектор не задан, скрипт перебирает запасной список — #ms3oc-cart-live, #msb-test-cart, #msCart, [data-ms-cart], .msCart. Это корни корзины, селектора виджета среди них нет.
Два исхода, оба молчаливые: совпадений несколько — не обновляется ничего; совпадение одно (на странице есть корзина) — HTML виджета запишется внутрь корзины и затрёт её.
Кнопки «+» и «−» без selector не обновляют виджет никогда: у обработчика количества запасного списка нет вовсе.
Как это работает
- При вызове сниппет регистрирует себя в
ms3Config.render.cart - При изменении корзины JavaScript отправляет запрос на сервер
- Сервер перевызывает сниппет с теми же параметрами
- Новый HTML заменяет всё содержимое контейнера из
selector
Несколько виджетов на странице
{* Мини-корзина в шапке *}
<div id="header-minicart">
{'!msOrderTotal' | snippet : [
'tpl' => 'tpl.headerMiniCart',
'selector' => '#header-minicart'
]}
</div>
{* Счётчик в мобильном меню *}
<div id="mobile-cart-count">
{'!msOrderTotal' | snippet : [
'tpl' => 'tpl.mobileCartCount',
'selector' => '#mobile-cart-count'
]}
</div>Вызовы должны отличаться параметрами
Токен перерисовки — это хеш от набора параметров вызова. Два вызова с полностью одинаковыми параметрами получают один и тот же токен, а клиент берёт по нему первый найденный контейнер. Обновится только он, второй останется со старыми числами.
Разный selector эту проблему снимает — он входит в набор параметров. Именно поэтому в примере выше у виджетов разные selector и разные tpl.
Когда виджет не обновляется
Перерисовку запускают только операции с корзиной: добавление, удаление, смена количества, смена опции, очистка.
| Действие покупателя | Что с виджетом |
|---|---|
| Выбрал способ доставки или оплаты | Не обновится. Пересчёт идёт мимо виджета — текст пишется в три фиксированных элемента страницы заказа: #ms3_order_cart_cost, #ms3_order_delivery_cost, #ms3_order_cost |
| Очистил форму заказа | Не обновится |
Поэтому поля cost, delivery_cost и payment_cost верны только на момент отрисовки страницы: после выбора доставки они устареют. В мини-корзине показывайте стоимость товаров (cart_cost), а не итог к оплате.
Параметры вызова живут в кеше
Сервер хранит их столько секунд, сколько задано в ms3_snippet_cache_ttl — по умолчанию час. Если страница открыта дольше или кеш сбросили, сервер не находит параметры и просто не отдаёт HTML — виджет перестаёт обновляться без признаков на странице. Диагностика одна: запись Snippet parameters not found for token: … в журнале ошибок MODX.
Нужна настройка ms3_register_global_config
При её выключении объект ms3Config на страницу не выводится, а регистрация виджета выводится всегда. В консоли будет ms3Config is not defined, и перерисовка не заработает ни для виджета, ни для корзины. По умолчанию настройка включена.
Примеры
Базовый вызов
{'!msOrderTotal' | snippet}Получение данных без отрисовки
{set $total = '!msOrderTotal' | snippet : ['return' => 'data']}
{if $total.total_count > 0}
В корзине: {$total.total_count} товаров на {$total.cart_cost_formatted}
{/if}При return=data не задавайте selector
Данные для вывода берутся однократно — перерисовка для этого режима не предусмотрена. Но регистрация на обновление происходит раньше, чем сниппет смотрит на return, поэтому вызов с selector всё равно попадёт в список перерисовки. Сервер вернёт массив вместо HTML, и в контейнер запишется его текстовое представление.
Чанк прямо в вызове
Для короткой разметки отдельный чанк можно не заводить — передайте её в tpl через @INLINE:
<div id="header-cart">
{'!msOrderTotal' | snippet : [
'selector' => '#header-cart',
'tpl' => '@INLINE {$total_count} шт. на {$cart_cost_formatted}'
]}
</div>Структура данных и плейсхолдеры
При return=data сниппет возвращает массив с этими полями, при return=tpl — передаёт их в чанк как плейсхолдеры ({$total_count}, {$cost_formatted}). Суммы и вес на сайте выводите через *_formatted.
| Поле | Описание |
|---|---|
cost | Итого к оплате (товары + доставка + комиссия оплаты) |
cost_formatted | Итого с символом валюты |
cart_cost | Стоимость товаров |
cart_cost_formatted | Стоимость товаров с валютой |
delivery_cost | Стоимость доставки |
delivery_cost_formatted | Стоимость доставки с валютой |
payment_cost | Комиссия за способ оплаты |
payment_cost_formatted | Комиссия с валютой |
total_count | Общее количество товаров |
total_cost | Стоимость товаров по корзине. Совпадает с cart_cost, пока плагины не меняют её через msOnGetCartCost |
total_cost_formatted | Стоимость товаров с валютой |
total_weight | Общий вес |
total_weight_formatted | Общий вес с единицей измерения |
total_discount | Сумма скидки |
total_discount_formatted | Скидка с валютой |
total_positions | Количество позиций (уникальных товаров) |
CSS-классы
Стили стандартного чанка лежат в assets/components/minishop3/css/web/default.css.
| Класс | Описание |
|---|---|
.ms3-order-total | Контейнер виджета |
.ms3-order-total__count | Счётчик количества товаров |
.ms3-order-total__cost | Сумма заказа |
Файл не подключается сам
default.css не входит в системную настройку ms3_frontend_assets — там только стили уведомлений и скрипты. Его подключает лишь демо-шаблон base.tpl. На своей вёрстке добавьте файл в шаблон или в ms3_frontend_assets, иначе виджет останется без оформления.
Счётчик без перерисовки
Сниппет обновляет виджет целиком: сервер заново отрисовывает чанк и возвращает готовый HTML. Ради пары чисел в шапке это тяжело — если нужен только счётчик, обновляйте его сами по событию ms3:cart:updated. Вызов сниппета тогда не нужен: данные приходят с ответом сервера на любое действие с корзиной.
<span class="cart-count">0</span>
<span class="cart-cost">0</span>document.addEventListener('ms3:cart:updated', function (e) {
// detail приходит не всегда — проверяйте перед обращением
const status = e.detail && e.detail.status;
if (!status) {
return;
}
document.querySelector('.cart-count').textContent = status.total_count;
document.querySelector('.cart-cost').textContent = status.total_cost;
});Числа здесь без оформления
В status лежат сырые значения, без символа валюты и разделителей разрядов. Готовые строки вида 1 500 ₽ отдаёт только чанк — в полях *_formatted.
Состав detail и остальные события фронтенда — на странице Корзина.
Отличие от msCart
| msOrderTotal | msCart |
|---|---|
| Только итоги: суммы, количество, вес | Все поля товаров, опции, превью |
| Для мини-корзины в шапке | Для страницы корзины |
| Автообновление виджета | Автообновление корзины |
