Редактировать и сохранять свойства позиции Shopify прямо в корзине - PullRequest
0 голосов
/ 11 мая 2019

Я хочу отредактировать / сохранить свойства позиции Shopify непосредственно в корзине, используя /cart/change.js, не возвращаясь на страницу продукта, чтобы повторно ввести информацию снова. Свойства позиции состоят из имен / значений.

Каждый элемент корзины будет иметь максимум 3 имени свойства элемента строки («Случай», «Дополнительные комментарии», «Закрытая карта»), причем каждое из соответствующих значений будет уникальным.

См. Этот снимок экрана как пример

Я не могу заставить его работать с несколькими элементами корзины или с более чем одним именем / значением свойства. Поскольку каждый идентификатор значения свойства является самим значением свойства, я попытался создать динамические идентификаторы для каждого значения, чтобы я мог нацеливаться на каждое свойство элемента корзины и перезаписывать существующие значения. Тем не менее, я не могу понять, как это сделать.

Например, для редактирования property-name я хотел бы сделать что-то вроде этого:

$('.cart-line-item-update').on('click', function() {
  const $this = $(this);
  const dataIndex = $this.data('index');
  const item = cart_items[dataIndex - 1];
  item.properties['property-name'] = $('#dynamic-property-value').val();
  jQuery.ajax({
    url: '/cart/change.js',
    dataType: 'json',
    data: {
      line: dataIndex,
      properties: item.properties
    }
  }).done(function() {
    window.location.reload()
  })
});

<script>
    var cart_items = {{cart.items | json}} 
</script>

{% if property_size > 0 %}
  {% assign loop_index = forloop.index %}
  {% for p in item.properties %}
    {% assign first_character_in_key = p.first | truncate: 1, '' %}
    {% unless p.last == blank or first_character_in_key == '_' %}
      <div class="accordion-container collapse-all cart-line-item-accordion">
        <input type="checkbox" title="Expand for more information" checked>
        <h2 class="accordion-title">
          <span id="{{ item.product_id }}-{{ p.first | handleize }}">{{ p.first }}:</span>
          <i class="accordion-icon"></i>
        </h2>
        <div class="accordion-content">

          <div class="saved-textarea visible">
            {{ p.last }}
          </div>
          <textarea id="{{ item.product_id }}-{{ p.first | handleize }}-textarea" class="update-textarea autosize new-property">{{ p.last }}</textarea>

          <div class="cart-line-item-btns">
            <a class="cart-item-remove cart-line-item-edit" title="Edit content">Edit</a>
            <a class="cart-item-remove cart-line-item-update" title="Save changes" data-index="{{loop_index}}">Update</a>
          </div>
        </div>
      </div>
    {% endunless %}
  {% endfor %}
{% endif %}

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ: Каждое значение свойства элемента корзины будет сохранено (перезаписать существующее значение json).

АКТУАЛЬНЫЙ РЕЗУЛЬТАТ: Обновит только значение свойства первого элемента корзины и сохранит его. Если в корзине есть несколько элементов, каждый со своим значением, он не сохранит последующие экземпляры этого свойства и переопределит их с первым экземпляром.

Значения уже существуют в json, поскольку они создаются на странице продукта и переносятся в корзину. Я просто не знаю, как нацелить каждое старое значение json, чтобы переопределить его новым. Этот сценарий, кажется, нацелен на все экземпляры имени свойства и переопределяет их все первым значением.

Может быть, я упускаю что-то очевидное. Может кто-нибудь, пожалуйста, помогите?

1 Ответ

0 голосов
/ 12 мая 2019

Я изменил коды, попробуйте это, это работает на моем конце

Сначала я изменил часть свойств, добавил некоторые данные и обертку.

      {% if property_size > 0 %}
   <div class="propContainer">
  {% assign loop_index = forloop.index %}
  {% for p in item.properties %}
    {% assign first_character_in_key = p.first | truncate: 1, '' %}
    {% unless p.last == blank or first_character_in_key == '_' %}
      <div class="accordion-container collapse-all cart-line-item-accordion">
        <input type="checkbox" title="Expand for more information" checked>
        <h2 class="accordion-title">
          <span id="{{ item.product_id }}-{{ p.first | handleize }}">{{ p.first }}:</span>
          <i class="accordion-icon"></i>
        </h2>
        <div class="accordion-content">

          <div class="saved-textarea visible">
            {{ p.last }}
          </div>
          <textarea data-name="{{ p.first }}" id="{{ item.product_id }}-{{ p.first | handleize }}-textarea" class="propLine update-textarea autosize new-property">{{ p.last }}</textarea>

          <div class="cart-line-item-btns">
            <a class="cart-item-remove cart-line-item-edit" title="Edit content">Edit</a>
            <a class="cart-item-remove cart-line-item-update" title="Save changes" data-index="{{loop_index}}">Update</a>
          </div>
        </div>
      </div>
    {% endunless %}
  {% endfor %}
            </div>
{% endif %}

И поместите это в конец шаблона корзины.

<script>

$('.cart-line-item-update').on('click', function() {
  const $this = $(this);
  const dataIndex = $this.data('index');
  var inputData = $this.closest('.propContainer').find('.propLine')

  var data = {
     line: dataIndex,
     properties: ''
   }
  var tempProperties = {}
  inputData.each(function(index, el) {
    tempProperties[$(el).data('name')] = $(el).val();
  });
  data.properties = tempProperties;

  jQuery.ajax({
    url: '/cart/change.js',
    dataType: 'json',
    data: data
  }).done(function() {
    window.location.reload()
  })
});
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...