<script>. У On cart update есть действие Reset to default, восстанавливающее его стартовый шаблон; у Initialization его нет, поэтому сохраните собственную копию, прежде чем очищать его.
Многое из того, что мерчанты раньше делали скриптами, теперь является встроенной настройкой. Сначала посмотрите Прежде чем писать скрипт: настройка продолжает работать при редизайнах корзины, а ваш скрипт может и нет.
Какой слот использовать
Initialization
window.aftersell.cart.
Вызовы настройки, которые вы делаете здесь (configure(...), events.on(...), hooks.*), безопасно вызывать в начале скрипта даже до полной загрузки корзины; они буферизуются и применяются после её готовности. Действия, читающие или изменяющие корзину (такие как addItem или getCart), должны выполняться внутри ready() или обработчика события.
Слот изначально содержит три закомментированных примера — открытие выдвижной корзины при каждом добавлении, реакция на cart_loaded и скрытие строк бесплатных подарков, — поэтому нетронутый скрипт Initialization ничего не делает. Раскомментируйте один, чтобы попробовать, или замените их.
Естественная форма для этого слота — однократная регистрация без участия событий: зарегистрируйте поведение один раз, и корзина будет применять его дальше сама. Скрытие строк бесплатных подарков из выдвижной корзины без изменения итога — поставляемый пример этого:
registerLineTransform выполняется для каждой строки при её отображении, а setHidden действует только на отображение, поэтому строка остаётся в корзине и по-прежнему учитывается в итоге — она просто не показывается в выдвижной корзине. Подробнее о возможностях трансформации см. Скрытие и переименование строк корзины.
Действия, читающие корзину, помещайте внутрь ready():
shadowRoot: корзина отображается внутри shadow root, поэтому document.querySelector не видит ничего в выдвижной корзине.
On cart update
cart_updated, поэтому вы редактируете только тело, а ваш код получает обновлённую cart.
Этот слот — для правил, которые нужно переоценивать при каждом изменении корзины. Порог бесплатного подарка — классический случай (потратьте $75, получите бесплатную сумку), потому что ответ зависит от текущего содержимого, и ничто другое не сообщит вам, когда оно изменится:
Поддержание корзины в нужном состоянии
if (shouldHaveGift === hasGift) return; — это то, что делает скрипт безопасным, и она обобщается на каждый скрипт, поддерживающий корзину в нужном состоянии. Этот слот одновременно реагирует на изменения корзины и вызывает их, поэтому каждый addItem или removeItem заново запускает его. Опишите желаемое состояние, сравните с текущим и завершайте выполнение раньше, когда они уже совпадают, чтобы обработчик сходился за один проход, а не зацикливался. См. два правила — о незащищённом варианте, которого следует избегать, и о том, почему полезная нагрузка доступна только для чтения.
В медленном магазине также стоит держать флаг выполнения на уровне модуля, чтобы два быстрых изменения не могли начать добавление одновременно, пока первое не завершилось.
cart_updated срабатывает только при изменениях после первой загрузки (тайминг событий), поэтому скрипт в этом слоте не согласует корзину, которая уже соответствует условию при загрузке страницы. Для версии, обрабатывающей оба случая, подпишитесь на cart_loaded и cart_updated одной и той же функцией из слота Initialization. См. Автодобавление бесплатного подарка при пороге.Когда скрипт ломается
configure, events.on или hooks.register* дальше по коду никогда не регистрируются. Это обычное объяснение ситуации «мой обработчик никогда не срабатывает», когда код выглядит правильно.
Корзина указывает сбойную строку в консоли браузера, и каждый слот выполняется под собственным именем файла (aftersell-cart-init.js и aftersell-cart-cart-update.js), поэтому вы можете открыть любой из них в панели Sources DevTools и поставить точки останова. См. Отладка для точных сообщений и канала отладки, который перехватывает сбои хуков, не попадающие в консоль.
Поскольку cart_loaded воспроизводится для поздних подписчиков, порядок регистрации не имеет значения. Самая безопасная структура — сначала зарегистрировать всё, а рискованную работу выполнять внутри обработчиков, где выброшенное исключение изолируется в пределах этого обработчика.
Что дальше
- Cart SDK: пользовательские скрипты — это способ запуска SDK-кода. См. справочники по configure, событиям, действиям и хукам для полного описания, объект корзины для структуры того, что получают обработчики, и сценарии использования для готовых сниппетов.
- Блоки пользовательского кода: для добавления разметки в корзину. Обратите внимание, что HTML-режим блока Custom code не выполняет JavaScript; используйте пользовательские скрипты (или React-режим блока) для логики.