Shopify Ajax API, Alpine JS, добавление выбранных пользователем опций в корзину с помощью Ajax

Я создаю этот раздел Build A Box, где пользователь может выбирать различные элементы, составляющие 1 продукт. У меня проблемы с добавлением товаров в корзину.

ОБНОВЛЯТЬ: Текущее состояние: можно добавить жестко закодированный основной продукт в formData. Сначала я сделал это, чтобы запустить addToCart. Он добавляет основной продукт, но не перенаправляет на страницу корзины. Если вы измените URL-адрес в браузере на /cart, он там.

Мне нужно выяснить 2 вещи.

1 как перенаправить на страницу корзины после запуска addToCart()

2 Как добавить выбранные пользователем элементы в корзину как 1 продукт, а не варианты.

См. журналы

Я могу выбирать элементы и помещать их в массив в моем компоненте x-data. Данные выглядят так:

 [
   {img_string: 'https://cdn.shopify.com/s/files/1/0695/7495/1222/files/Barky.webp? 
   v=1672528086&width=150', title: 'Barky', id: 'selected_item-1'},
   {img_string: 'https://cdn.shopify.com/s/files/1/0695/7495/1222/files/Barky.webp? 
   v=1672528086&width=150', title: 'Barky', id: 'selected_item-1'}
 ]

Для моей последней итерации я просто жестко закодировал идентификатор варианта и количество. Еще нужно придумать, как поместить все выбранные товары в корзину.

ОБНОВЛЕНИЕ: я добавил фильтр preventDefault в вызов Alpine addToCart(), теперь он не перенаправляется, но если вы измените URL-адрес в браузере на /cart, там будет жестко запрограммированный основной продукт.

<div x-data = "items: []"> 
  <div
        x-data = "
          {
            qty: 1,
            addToCart(){
              let formData = {
              'items': [{
                'id': 44202123100470,
                'quantity': 1
                }]
              };
              fetch(window.Shopify.routes.root + 'cart/add.js', {
                method: 'POST',
                headers: {
                  'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
              })
              .then(response => {
                console.info(response)
                return response.json();
              })
              .catch((error) => {
                console.error('Error:', error);
              });
            }
          }
        "
        class = "tw-mt-12 tw-flex tw-flex-col tw-p-auto tw-bg-brandText tw-opacity-80"
      >
        <div class = "tw-p-8">
          <h2 class = "tw-mb-4 tw-text-white">Your Selections</h2>
          {% assign product_form_id = 'product-form-' | append: section.id %}
          {%- form 'product',
            product,
            id: product_form_id,
            class: 'form',
            novalidate: 'novalidate',
            data-type: 'add-to-cart-form'
          -%}
            <input
              type = "hidden"
              name = "id"
              value = "{{ product.selected_or_first_available_variant.id }}"
              disabled
            >
            <input type = "hidden" name = "quantity" x-model = "qty" value = "1">
            <div class = "product-form__buttons">
              <button
                type = "add"
                @click = "addToCart()"
                :class = "full_box ? 'tw-bg-ctaColor' : ''"
                class = "tw-bg-white tw-text-brandText tw-flex tw-justify-center tw-py-4 tw-px-6 tw-rounded-full tw-font-bold"
              >
                <p class = "" x-show = "!full_box">
                  <span x-text = "items_selected" class = "tw-mr-2"></span><span class = "tw-mr-2">of</span
                  ><span class = "tw-font-bold" x-text = "box_size"></span><span class = "tw-ml-2">Selected</span>
                </p>
                <p x-show = "full_box" class = "">Add to cart</p>
              </button>
            </div>
          {%- endform -%}
        </div>
</div>
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
1
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему с перенаправлением, используя Location API добавив location.href="/cart" в обещание успеха вызова Ajax.

             fetch(window.Shopify.routes.root + 'cart/add.js', {
                method: 'POST',
                headers: {
                  'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
              })
              .then(response => {
                console.info(response)
                return response.json();
              })
              .then((data) => {
               location.href = '/cart';
                console.info('Success:', data);
              })
              .catch((error) => {
                console.error('Error:', error);
              });

Решить вопрос, как поместить все выбранные товары в корзину. Я сопоставил массив объектов items и вернул массив строк. Затем я присвоил переменной selectedItems и вызвал toString()

В ключе свойств formData я добавил значение selectItems в ключ Box Items. Немного некрасиво на данный момент нет пробелов в строке. Определенно нужно реорганизовать это. Любой отзыв будет суперкрутым 😀‍♂️

    <div
        x-data = "
          {
            addToCart(items, id){

             let itemsToAdd = items.map((item) => {
               return item['title'];
             })

             let selectedItems = itemsToAdd.toString()

              let formData = {
              'items': [{
                'id': id,
                'quantity': 1,
                'properties': {
                  'Box Items': selectedItems,
                  }
                }]
              };

              fetch(window.Shopify.routes.root + 'cart/add.js', {
                method: 'POST',
                headers: {
                  'Content-Type': 'application/json'
                },
                body: JSON.stringify(formData)
              })
              .then(response => {
                console.info(response)
                return response.json();
              })
              .then((data) => {
                location.href = '/cart';
                console.info('Success:', data);
              })
              .catch((error) => {
                console.error('Error:', error);
              });
              reset()
            }
          }
        "
        class = "tw-mt-12 tw-flex tw-flex-col tw-p-auto tw-bg-brandText tw-opacity-80"
      >...</div>

Другие вопросы по теме