Skip to content
  1. Компоненты
  2. MiniShop3
  3. Сниппеты
  4. msOrderTotal

msOrderTotal ​

Итоги текущей корзины и заказа для мини-корзины в шапке. Виджет перерисовывается при изменениях в корзине, если задан selector.

Кэширование

Сниппет работает с сессией пользователя и должен вызываться некэшированно (!msOrderTotal).

Параметры ​

ПараметрПо умолчаниюОписание
tpltpl.msOrderTotalЧанк оформления
returntplФормат: data (массив), tpl (отрисовка чанка)
selector—CSS-селектор контейнера. Обязателен для автообновления. В свойствах сниппета не объявлен (#805)

Свойства formatPrices / withCurrency

В админке у сниппета могут отображаться formatPrices и withCurrency. Код их не читает: *_formatted всегда с валютой/единицей веса (#825).

Чанк по умолчанию ​

Компонент поставляет чанк tpl.msOrderTotal:

fenom
<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 при каждом вызове — без него виджет не обновится:

fenom
<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 не обновляют виджет никогда: у обработчика количества запасного списка нет вовсе.

Как это работает ​

  1. При вызове сниппет регистрирует себя в ms3Config.render.cart
  2. При изменении корзины JavaScript отправляет запрос на сервер
  3. Сервер перевызывает сниппет с теми же параметрами
  4. Новый HTML заменяет всё содержимое контейнера из selector

Несколько виджетов на странице ​

fenom
{* Мини-корзина в шапке *}
<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, и перерисовка не заработает ни для виджета, ни для корзины. По умолчанию настройка включена.

Примеры ​

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

fenom
{'!msOrderTotal' | snippet}

Получение данных без отрисовки ​

fenom
{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:

fenom
<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. Вызов сниппета тогда не нужен: данные приходят с ответом сервера на любое действие с корзиной.

html
<span class="cart-count">0</span>
<span class="cart-cost">0</span>
javascript
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 ​

msOrderTotalmsCart
Только итоги: суммы, количество, весВсе поля товаров, опции, превью
Для мини-корзины в шапкеДля страницы корзины
Автообновление виджетаАвтообновление корзины