直接在购物车中编辑和保存 Shopify 订单项属性
Edit and save Shopify line item properties directly in cart
我想使用 /cart/change.js
直接在购物车中 edit/save Shopify 订单项属性,而无需返回产品页面重新输入信息。订单项属性由 names/values.
组成
每个购物车商品最多有 3 个订单项 属性 名称('Occasion'、'Additional Comments'、'Enclosed Card'),每个对应的值都是唯一的。
See this screenshot as example
我似乎无法让它与多个购物车项目或多个 属性 name/value 一起使用。由于每个 属性 值 id 都是 属性 值本身,我尝试为每个值创建动态 id,以便我可以唯一地定位每个购物车项目 属性 并覆盖现有值。但是,我似乎不知道该怎么做。
例如,要编辑 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 值以用新值覆盖它。该脚本似乎以 属性-name 的所有实例为目标,并用第一个值覆盖它们。
也许我遗漏了一些明显的东西。有人可以帮忙吗?
我修改了代码,试试这个,我这边有效
起初我修改了属性部分,添加了一些数据和包装器。
{% 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>
我想使用 /cart/change.js
直接在购物车中 edit/save Shopify 订单项属性,而无需返回产品页面重新输入信息。订单项属性由 names/values.
每个购物车商品最多有 3 个订单项 属性 名称('Occasion'、'Additional Comments'、'Enclosed Card'),每个对应的值都是唯一的。
See this screenshot as example
我似乎无法让它与多个购物车项目或多个 属性 name/value 一起使用。由于每个 属性 值 id 都是 属性 值本身,我尝试为每个值创建动态 id,以便我可以唯一地定位每个购物车项目 属性 并覆盖现有值。但是,我似乎不知道该怎么做。
例如,要编辑 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 值以用新值覆盖它。该脚本似乎以 属性-name 的所有实例为目标,并用第一个值覆盖它们。
也许我遗漏了一些明显的东西。有人可以帮忙吗?
我修改了代码,试试这个,我这边有效
起初我修改了属性部分,添加了一些数据和包装器。
{% 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>