Skip to main content
Действия читают и изменяют корзину. Они находятся в window.aftersell.cart.actions.
Действия выполняются после готовности корзины, внутри ready() или обработчика события.
До загрузки корзины действия являются заглушками. Каждое из них выводит в консоль предупреждение с именем действия, например cart.actions.addItem() called before the cart loaded, и ничего не делает. Асинхронные действия всё равно разрешают Promise, поэтому цепочка .then() выполняется нормально, а не выбрасывает исключение; getCart() возвращает null, а formatMoney() возвращает пустую строку.Ничего не ломается, если вызвать действие слишком рано, но и ничего не происходит. Следите за этим предупреждением в консоли, когда действие как будто ничего не делает.

Все действия

Вызов действия из обработчика cart_updated может зациклиться. Сначала прочитайте два правила.

Drawer

open и close

Открывают или закрывают drawer-корзину. Оба синхронны и не принимают аргументов.

Чтение

getCart()

Возвращает текущий объект корзины или null до его загрузки. Результат является копией, поэтому его изменение не повлияет на настоящую корзину.
Поскольку это снимок состояния, не храните результат; читайте его заново каждый раз, когда вам нужны актуальные данные. В обработчике события у вас уже есть свежая корзина в качестве payload, поэтому getCart() там избыточен.

formatMoney(cents)

Форматирует сумму в минимальных денежных единицах, используя денежный формат вашего магазина. Каждая цена в SDK указана в центах, поэтому именно так вы превращаете её в то, что можно отобразить.
Переопределите формат с помощью configure({ money_format }).

Изменение корзины

Действия с позициями идентифицируют позицию по её Shopify key, а не по ID варианта, потому что корзина может содержать один и тот же вариант в нескольких позициях с разными свойствами. Читайте его из getCart().items[n].key.

addItem(variantId, quantity?)

Добавляет вариант в корзину. quantity по умолчанию равен 1. Разрешается, когда корзина стабилизируется.
Добавление варианта, уже находящегося в корзине, увеличивает количество этой позиции, а не создаёт вторую, при условии что существующая позиция не имеет свойств line item. Позиция со свойствами является отдельной позицией, поэтому вы получите новую.

removeItem(key)

Полностью удаляет позицию.

updateItemQuantity(key, quantity)

Устанавливает количество позиции. Передача 0 удаляет позицию.
Второй пример безопасно запускать из cart_updated, потому что проверка > 1 даёт false при втором проходе. См. два правила.

replaceLineVariant(key, variantId)

Меняет вариант позиции, сохраняя её количество и свойства. Полезно для переключателя размера или вкуса внутри корзины.
При замене план продаж позиции сбрасывается. Позиция подписки становится разовой покупкой, если вы не примените план заново.
Замена — это добавление с последующим удалением, а не редактирование на месте, поэтому результатом является новая позиция: она получает новый key и оказывается в конце корзины. После этого заново прочитайте getCart() вместо повторного использования переданного вами ключа.

Обновление

refresh()

Повторно запрашивает корзину у Shopify. Используйте его после того, как что-то вне SDK изменило корзину, а drawer этого не заметил.
В большинстве случаев это не нужно, поскольку Aftersell уже слушает стандартные события корзины Shopify и повторно запрашивает данные самостоятельно. Прибегайте к этому, когда пользовательская интеграция обходит их.

visualRefresh()

Повторно выполняет трансформации отрисовки без повторного запроса корзины у Shopify. Он редко нужен: регистрация (или отмена регистрации) трансформации позиций, компаратора, обогатителя или любого из хуков подписки запускает его за вас. Только два хука добавления в корзину этого не делают, поскольку они не меняют ничего из уже отображённого на экране. Прибегайте к нему, когда меняется то, от чего зависит трансформация, но сама корзина не изменилась:

Замечания и особые случаи

  • Асинхронные действия разрешаются, когда изменение стабилизируется. Ожидание одного из них позволяет выстроить последовательность работы после фактического обновления корзины.
  • getCart() возвращает копию. Её изменение никак не влияет на настоящую корзину.
  • Нет действия для промокодов. Применённые коды доступны для чтения в корзине (discountCodes, totalDiscount) и по позициям (discountAllocations); покупатели применяют их через блок Discount code.
  • Нет действия для атрибутов корзины или примечаний. Атрибуты доступны для чтения в объекте корзины; покупатели пишут примечания через блок Notes.
  • Чтобы скрыть позицию, а не удалить её, используйте registerLineTransform. Удаление меняет итоговую сумму покупателя; скрытие — нет.

Что дальше