Liquid aldagaien erabilera Shopify Flow-n

Liquid aldagaiak Liquid-en definitutako leku-markak dira, eta lan-fluxu bat exekutatzean GraphQL Admin API-ko balioekin ordezten dira. Zure lan-fluxuetan inplikatuta dauden bezero, eskaera eta produktuen atributuak deskriba ditzakete aldagaiek (esaterako, eskaera-zenbakia, eskaeraren prezioa edo bezeroaren izena). Aldagaiak erabil daitezke baldintzetan, zure lan-fluxuaren logika kontrolatzeko, edo ekintza bateko datuak ateratzeko.

Lan-fluxuetan aldagaiak gehitzea Liquid erabiliz

Aldagaiak gehi ditzakezu Liquid erabiliz Gehitu aldagaia esteka duen edozein testu-eremutan. Egin klik dagokion eremuaren azpiko Gehitu aldagaia estekan, eta aukeratu aldagai bat zerrendatik.

Bidali barneko mezu elektronikoa ekintzaren konfigurazio-panelaren irudia; bertan, Gai eremuaren azpian dagoen 'Gehitu aldagaia' aukera nabarmentzen da.

Gehitu aldagaia zerrendako aldagaiak iragazita daude; horrela, uneko urratsaren aurreko urratsek (hala nola abiarazleek) itzulitako aldagaiak soilik erabil ditzakezu. Adibidez, Sortutako eskaera abiarazleak Admin API-ko eskaera- eta denda-baliabideak ematen ditu, aldagai gisa txerta daitezkeenak. Zerrendako aldagai bat aukeratu ondoren, testu-koadroan gehitzen da, behar bezala formateatutako Liquid gisa.

Liquid zuzenean idatz dezakezu testu-eremuan. Adibidez, {{ order.name }} aldagaia erabil dezakezu Shopify-ko administratzailearen eskaera-katea bistaratzeko (esaterako, order-123).

Flow-k Liquid-erako erabilitako datuak berreskuratzeko Admin API erabiltzen duenez, aldagaien sintaxiak kamelu-maiuskula erabiltzen du. Kamelu-maiuskula duten aldagaiek minuskulaz hasten dute lehen hitza, eta hurrengo hitzak maiuskulaz hasten dira, hala nola firstName edo canMarkAsPaid. Adibidez, produktu bat sortu zen datara sartzeko, idatzi {{ product.createdAt }}. Kamelu-maiuskularik erabiltzen ez duen Shopify gai batean Liquid sintaxia erabiltzen baduzu, {{ product.created_at }} idatzi beharko zenuke.

Baldintzazko eta iteraziozko Liquid etiketak

Liquid etiketak aldagaiekin erabil daitezke funtzio hauek egiteko:

  • Baldintzazko adierazpenak idaztea, hala nola eskaera baten guztizkoa 100 $ baino gehiago den zehaztea.
  • Objektu-zerrenda batean iteratzea, hala nola eskaera bateko lerroko elementu bakoitzaren datuak ateratzea.

Liquid etiketak erabil ditzakezu adierazpen horiek idazteko eta objektuetan iteratzeko.

Adibidez, honako Liquid kode honek eskaera-zenbakia bistaratzen du, eskaeraren guztizkoa 100 $ baino gehiago bada:

{% if order.totalPriceSet.shopMoney.amount > 100 %}
  Order number: {{ order.name }}
{% endif %}

for begizta bat ere erabil dezakezu objektu-zerrenda batean iteratzeko (esate baterako, eskaera bateko lerroko elementuetan). Adibidez, honako Liquid kode honek eskaera bateko lerroko elementu bakoitzaren izena bistaratzen du:

{% for li in order.lineItems %}
  {{ li.title }}
{% endfor %}

Flow-k honako baldintzazko (edo kontrol-fluxuaren) Liquid etiketa hauek onartzen ditu:

Flow-k honako iteraziozko Liquid etiketa hauek ere onartzen ditu:

Aldagaiei iragazkiak aplikatzea

Liquid-en aldagaien datuak eraldatzeko, iragazkiak erabil ditzakezu. Flow-k kode irekiko Liquid iragazki guztiak onartzen ditu.

Adibidez, honako Liquid kode honek aurrizki bat kentzen dio eskaera baten izenari eta geratzen dena ateratzen du: {{ order.name | remove: "Order-" }}

Iragazkietan Liquid aldagaiak erabiltzean kontuan hartzekoak

Aldagaiak iragazkiak erabiliz eraldatu aurretik, aztertu kontuan hartzeko puntu hauek:

  • Flow-k ez du onartzen zenbait iragazkitarako erabilgarri dagoen puntu-notazioa. Adibidez, Flow-k onartzen du {{ order.lineItems | size }}, baina ez {{ order.lineItems.size }}.
  • Flow-k ez du onartzen puntu-notazioa metaeremuetarako. Adibidez, ezin duzu {{ order.metafields.custom.hold_note }} erabili. Horren ordez, begizta bat egin behar duzu metaeremuetan zehar, adibideetan azaltzen den moduan.
  • Flow-k ez du onartzen zerrenda bateko elementuetara sartzeko indizeak erabiltzea. Adibidez, ezin duzu erabili {{ order.lineItems[0].title }}. Horren ordez, begizta bat egin behar duzu lerroko elementuetan zehar, adibideetan azaltzen den moduan.

Data-iragazkiak

Liquid iragazki estandarrez gain, Flow-k beste data baten aldean erlatiboa den data bat lortzeko data-iragazkiak ematen ditu, Programatutako ordua abiarazleari eta Lortu datuak eginbideei eusteko. Honako hauek dira iragazki horiek: date_minus eta date_plus. Adibidez:

  • Egun bat geroagoko data itzultzeko: {{ "now" | date_plus: "1 day" }}
  • Egun bat lehenagoko data itzultzeko: {{ "now" | date_minus: "1 day" }}

Iragazki hauek second, minute, day, week, month eta year onartzen dituzte iraupen-unitate gisa, bai singularrean (esaterako, second) bai pluralean (esaterako, seconds). Unitate pertsonalizagarrien mota hauek ere eman ditzakezu:

  • Segundo kopurua adierazten duen osoko bat: {{ "now" | date_minus: 3600 }}, non 3600 segundo ordubeteren baliokidea den.
  • ISO8601 iraupen-kate bat: {{ "now" | date_minus: "P1Y2D" }}, non P1Y2D kodeak urte 1 eta 2 egun esan nahi baitu.

Iragazki kriptografikoak

Flow-k iragazki kriptografikoak ematen ditu hashing-a (hash funtzioak) egiteko eta Hash bidezko mezuen autentifikazio-kodeak (HMAC) sortzeko. Iragazki horiek erabilgarriak dira identifikatzaile bakarrak nahiz egiaztatze-baturak sortzeko edo hash-formatu jakin batzuk behar dituzten hirugarrenen sistemekin integratzeko.

Hashing iragazkiak

Shopify Flow-k honako hashing iragazki mota hauek onartzen ditu:

  • blake3 - BLAKE3 hash bat sortzen du (erabilera orokorrerako gomendatua).
  • sha256 - SHA-256 hash bat sortzen du.
  • sha1 - SHA-1 hash bat sortzen du.
  • md5 - MD5 hash bat sortzen du.

Hashak sortzeko erabilera orokorretarako eta inplementazio berrietarako, blake3 erabiltzea gomendatzen da, algoritmo zaharragoek baino errendimendu eta segurtasun hobeak eskaintzen dituelako. Hala ere, sha256, sha1 eta md5 eskuragarri daude hirugarrenen sistemekiko bateragarritasuna bermatzeko.

Erabilera-adibidea: {{ "hello world" | blake3 }} kodeak "hello world" testuaren BLAKE3 hasha itzultzen du.

HMAC iragazkiak

Gako sekretu batekin HMAC bat sortzeko, erabili onartzen diren iragazki hauetako bat:

Erabilera-adibidea:

  • Oinarrizkoa: {{ "message" | hmac_sha256: "secret_key" }}
  • Sekretuekin (gomendatua): {{ "message" | hmac_sha256: secrets.api_key }}

Aldagaiak Shopify Flow aplikazioko Liquid lengoaian erabiltzeko adibideak

Liquid aldagaiak nola erabili hobeto ulertzeko, kontuan izan adibide hauek:

Erakutsi baliabideen URLak

Lan-fluxu batean inplikatuta dauden bezeroaren, eskaeraren eta produktuaren URLak erakutsi nahi dituzu.

# Output the base Admin URL for your store
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}

# Assign the base Admin url to a variable named base_url:
{%- capture base_url -%}https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}{%- endcapture -%}

# Customer from a Customer trigger:
{{ base_url }}/customers/{{ customer.legacyResourceId }}

# Customer without the base_url:
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}/customers/{{ customer.legacyResourceId }}

# Customer from an Order trigger:
{{ base_url }}/customers/{{ order.customer.legacyResourceId }}

# Order:
{{ base_url }}/orders/{{ order.legacyResourceId }}

# Product:
{{ base_url }}/products/{{ product.legacyResourceId }}

# Product Variant:
{{ base_url }}/products/{{ product.legacyResourceId }}/variants/{{ productVariant.legacyResourceId }}

# Example showing a clickable link in HTML, making use of the URL:
<a href="{{ base_url }}/products/{{ product.legacyResourceId }}">{{ product.title }}</a>

Bihurtu etiketen zerrenda bat metaeremu

Etiketa-multzo bat lerro bakarreko testu-eremuen zerrenda den metaeremu bihurtu nahi duzu. Produktua dendan gehitu da abiarazlea erabiliz lan-fluxu bat sortuko duzu, eta Eguneratu produktuaren metaeremua ekintza erabiliko duzu. Eguneratu produktuaren metaeremua ekintzaren Balioa atalean, honako Liquid kodea gehituko duzu. Adibide honek suposatzen du balioak behin bakarrik ezarri behar direla produktua sortzen denean, eta produktuak bi etiketa garrantzitsu dituela: color:red eta color:orange.

Lerro bakarreko testu-eremuaren zerrenda ezartzeko Liquid kodearen adibidea.
SarreraIrteera
{% capture mf_value %}
{%- for tags_item in product.tags -%}
  {%- if tags_item contains "color:" -%}
    "{{- tags_item | remove_first: "color:" | strip -}}",
  {%- endif -%}
{%- endfor -%}
{% endcapture -%}
[{{mf_value | remove_last: ","}}]
      
["red","orange"]

Idatzi eskaera baterako mezu elektroniko dinamikoa

Lan-fluxu bat sortu nahi duzu bezero batek eskaera batean 500 $ baino gehiago gastatzen dituenean langile bati mezu elektronikoa bidaltzeko. Eskaera sortu da abiarazlea erabiliz lan-fluxu bat sortuko duzu, eskaeraren guztizkoa 500 $ baino handiagoa bada egiazkoa den baldintza bat ezarriko duzu, eta Bidali barneko mezu elektronikoa ekintza erabiliko duzu. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu.

Aldagaiak erabiltzearen adibidea bezeroaren xehetasunak emateko.
SarreraIrteera
Please send a personal thank you note to {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) for placing an order for $ {{ order.totalPriceSet.shopMoney.amount }}.
Bidali eskerrak emateko mezu pertsonal bat Jeanne Duponti (jeanne@example.com) 763,42 $-eko eskaera bat egiteagatik.

Idatzi mezu elektroniko dinamiko bat izakin gutxi dituen produktu baterako

Erabaki duzu langile bati jakinarazi behar zaiola produktuaren inbentarioa murrizten ari denean eta izakin gehiago eskatzeko erosketa-eskaera bat egin behar denean. Inbentarioko elementu kopurua aldatu da abiarazlearekin hasten den lan-fluxu bat sortuko duzu, eta aldez aurreko inbentarioko elementu kopurua 10 baino txikiagoa edo berdina bada egiazkoa den baldintza bat ezarriko duzu. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu.

Aldagaiak erabiltzearen adibidea elementuaren xehetasunak emateko.
SarreraIrteera
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Eskatu berriro Galtza estu gerridunak - Beltza. Bidali mezu elektroniko bat owner@example.com helbidera erosketa-eskaera jaso dutela egiaztatzeko.

Idatzi mezu elektroniko dinamiko bat iruzurrezko eskaera baten berri langileei emateko

Arrisku-maila handia duten eskaerak bertan behera utzi nahi dituzu, baina nahiago duzu zure langileek eskaera eskuz bertan behera uztea. Eskaera sortu da abiarazlearekin hasten den lan-fluxu bat sortuko duzu, eta eskaeraren arrisku-maila handia bada egiazkoa den baldintza bat ezarriko duzu. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu.

Aldagaiak erabiltzearen adibidea iruzurrezko eskaera bati buruzko informazioa emateko.
SarreraIrteera
Our Shopify store has received an order with a high risk of fraud. We would like to cancel this order right away, before it is sent to production:
{{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }}
Please confirm the new order status. Thanks!
Gure Shopify-ko dendak iruzur-arrisku handiko eskaera bat jaso du. Eskaera hau berehala utzi nahi dugu bertan behera, ekoizpenera bidali baino lehen:

#1001
Dupont, Jeanne
jeanne@example.com

Berretsi eskaeraren egoera berria. Eskerrik asko!

Erakutsi eskaera bateko lerroko elementuak for begizta baten bidez

Eskaera bat jasotzean, erabilgarria izan daiteke eskatutako produktuak dituen mezu bat bidaltzea. Hori egiteko, for loop bat erabil dezakezu; begizta horrek kode-bloke bat behin eta berriz exekutatzen du. Aldagaiak onartzen dituzten testu-eremuek for begiztak eta forloop objektua ere onartzen dituzte.

Adibidez, eskaera bateko SKU eta kantitate guztien zerrenda itzultzen duen lan-fluxu bat sortu nahi duzu. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu.

For begizta erabiltzearen adibidea eskaeraren informazioa emateko.
SarreraIrteera
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Eskaeraren laburpena:
8987097979 (50)
8877778887 (3)
888998898B (1)

Erakutsi eskaera bateko lerroko elementuak for begizta baten bidez eta informazio gehigarriarekin

Mezu elektronikoari informazio gehiago gehitzea erabaki duzu, besteak beste, produktuaren izena, SKUak, elementu bakoitzeko prezioa eta bezeroaren bidalketa-informazioa. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu.

Eskaeraren informazio xeheagoa emateko for begizta erabiltzearen adibidea.
SarreraIrteera
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Eskaeraren laburpena:
Produktua: High Waist Leggings - Black
SKU: 8987097979
Prezioa (unitateko): 8,49 $
Kopurua: 5
Produktua: Athletic Socks - Blue
SKU: 888998898B
Prezioa (unitateko): 5,61 $
Kopurua: 2

Erakutsi lerroko elementu batzuk for begizta bat eta if adierazpen bat konbinatuta

Saltzaile jakin batek hornitu eta saldutako produktuen jarraipena egin behar duzu. Bidali barneko mezu elektronikoa ekintzaren Mezua atalean, aldagai hauek erabiliko dituzu eta if adierazpen bat sartuko duzu for begiztan.

Saltzaile jakin batzuen eskaeraren informazioa emateko for begizta bat eta if adierazpen bat erabiltzearen adibidea.
SarreraIrteera
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Saldutako Acme produktua:
Produktuaren izena: High Waist Leggings - Black
SKU: 8987097979

Datu-objektu konplexuak Shopify Flow aplikazioan

Flow aplikazioak GraphQL Admin API barruan dagoen ia edozein datu atzitzeko aukera ematen dizu. Horrek datu-objektu konplexuak barne hartzen ditu, hala nola zerrendak eta objektuak. Hala ere, muga batzuk daude objektu horiekin egin dezakezunari dagokionez. Atal honek muga horiek deskribatzen ditu eta horiekin lan egiteko adibideak ematen ditu.

Zerrendei eta objektuei zuzenean deitu beharrean, zerrendak begiztatu eta nahi dituzun eremuak soilik sartu beharko zenituzke.

Adibidez, {{ order.lineItems }} zuzenean deitu beharrean, erabili formatu hau eremu jakin batzuei deitzeko. Adibide hauek zerrendari edo objektuari zuzenean deituz sartuko liratekeen eremu guztiak dituzte. Kopiatu eta itsatsi behar dituzun eremuak.

Testua
{% for li in order.lineItems %}
    {% comment %}li.contract - omitted{% endcomment %}

{% for ca in li.customAttributes %}
    {{ ca.key }}
    {{ ca.value }}
{% endfor %}

{% for da in li.discountAllocations %}
    {{ da.allocatedAmountSet.presentmentMoney.amount }}
    {{ da.allocatedAmountSet.presentmentMoney.currencyCode }}
    {{ da.allocatedAmountSet.shopMoney.amount }}
    {{ da.allocatedAmountSet.shopMoney.currencyCode }}
{% endfor %}

{{ li.discountedTotalSet.presentmentMoney.amount }}
{{ li.discountedTotalSet.presentmentMoney.currencyCode }}
{{ li.discountedTotalSet.shopMoney.amount }}
{{ li.discountedTotalSet.shopMoney.currencyCode }}

{{ li.discountedUnitPriceSet.presentmentMoney.amount }}
{{ li.discountedUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.discountedUnitPriceSet.shopMoney.amount }}
{{ li.discountedUnitPriceSet.shopMoney.currencyCode }}

{% comment %}li.duties - omitted {% endcomment %}

{{ li.fulfillableQuantity }}

{{ li.fulfillmentService.callbackUrl }}
{{ li.fulfillmentService.fulfillmentOrdersOptIn }}
{{ li.fulfillmentService.handle }}
{{ li.fulfillmentService.id }}
{{ li.fulfillmentService.inventoryManagement }}
{% comment %}rest of location omitted{% endcomment %}
{{ li.fulfillmentService.location.name }}
{{ li.fulfillmentService.productBased }}
{{ li.fulfillmentService.serviceName }}
{% for sm in li.fulfillmentService.shippingMethods %}
    {{ sm.code }}
    {{ sm.label }}
{% endfor %}
{{ li.fulfillmentService.type }}

{{ li.fulfillmentStatus }}
{{ li.id }}

{{ li.image.altText }}
{{ li.image.height }}
{{ li.image.id }}
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
{{ li.image.width }}

{{ li.merchantEditable }}
{{ li.name }}
{{ li.nonFulfillableQuantity }}

{{ li.originalTotalSet.presentmentMoney.amount }}
{{ li.originalTotalSet.presentmentMoney.currencyCode }}
{{ li.originalTotalSet.shopMoney.amount }}
{{ li.originalTotalSet.shopMoney.currencyCode }}

{{ li.originalUnitPriceSet.presentmentMoney.amount }}
{{ li.originalUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.originalUnitPriceSet.shopMoney.amount }}
{{ li.originalUnitPriceSet.shopMoney.currencyCode }}

{% comment %}rest of product omitted{% endcomment %}
{{ li.product.title }}

{{ li.quantity }}
{{ li.refundableQuantity }}
{{ li.requiresShipping }}
{{ li.restockable }}

{{ li.sellingPlan.name }}

{{ li.sku }}

{% for tl in li.taxLines %}
    {{ tl.priceSet.presentmentMoney.amount | json }}
    {{ tl.priceSet.presentmentMoney.currencyCode | json }}
    {{ tl.priceSet.shopMoney.amount | json }}
    {{ tl.priceSet.shopMoney.currencyCode | json }}
    {{ tl.rate | json }}
    {{ tl.ratePercentage | json }}
    {{ tl.title | json }}
{% endfor %}

{{ li.taxable }}
{{ li.title }}

{{ li.totalDiscountSet.presentmentMoney.amount }}
{{ li.totalDiscountSet.presentmentMoney.currencyCode }}
{{ li.totalDiscountSet.shopMoney.amount }}
{{ li.totalDiscountSet.shopMoney.currencyCode }}

{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode }}

{{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode }}

{{ li.unfulfilledQuantity }}

{% comment %}rest of variant omitted{% endcomment %}
{{ li.variant.title }}

{{ li.variantTitle }}
{{ li.vendor }}

{% endfor %}

json
{
    "lineItems": [
        {% for li in order.lineItems %}
            {% if forloop.first != true %},{% endif %}
        {
            "contract": {
                {% comment %}rest of contract omitted{% endcomment %}
                "id": {{ li.contract.id | json }}
            },
            "customAttributes": [
                {% for ca in li.customAttributes %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        "key":{{ ca.key | json }},
                        "value":{{ ca.value | json }}
                    }
                {% endfor %}
            ],
&#x22;discountAllocations&#x22;: [
            {% for da in li.discountAllocations %}
                {% if forloop.first != true %},{% endif %}
                &#x22;allocatedAmountSet&#x22;: {
                    &#x22;presentmentMoney&#x22; : {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
                    },
                    &#x22;shopMoney&#x22;: {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.shopMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
                    }
                }
            {% endfor %}
        ],

        &#x22;discountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;discountedUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },
        &#x22;duties&#x22;: [
            {% for duty li.duties %}
            {% if forloop.first != true %},{% endif %}
            {
                {% comment %}rest of duties omitted{% endcomment %}
                &#x22;id&#x22;: {{ duty.id | json }}
            }
            {% endfor %}
        ],
        &#x22;fulfillableQuantity&#x22;: {{ li.fulfillableQuantity | json }},

        &#x22;fulfillmentService&#x22;: {
            &#x22;callbackUrl&#x22;:{{ li.fulfillmentService.callbackUrl | json }},
            &#x22;fulfillmentOrdersOptIn&#x22;: {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
            &#x22;handle&#x22;: {{ li.fulfillmentService.handle | json }},
            &#x22;id&#x22;: {{ li.fulfillmentService.id | json }},
            &#x22;inventoryManagement&#x22;: {{ li.fulfillmentService.inventoryManagement | json }},
            {% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
            &#x22;productBased&#x22;: {{ li.fulfillmentService.productBased | json }},
            &#x22;serviceName&#x22;: {{ li.fulfillmentService.serviceName | json }},
            &#x22;shippingMethods&#x22;: [
                {% for sm in li.fulfillmentService.shippingMethods %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        &#x22;code&#x22;: {{ sm.code | json }},
                        &#x22;label&#x22;: {{ sm.label | json }}
                    }
                {% endfor %}
            ],
            &#x22;type&#x22;: {{ li.fulfillmentService.type | json }}

        },
        &#x22;fulfillmentStatus&#x22;: {{ li.fulfillmentStatus | json }},
        &#x22;id&#x22;: {{ li.id | json }},
        &#x22;image&#x22;: {
            &#x22;altText&#x22;: {{ li.image.altText | json }},
            &#x22;height&#x22;: {{ li.image.height | json }},
            &#x22;id&#x22;: {{ li.image.id | json }},
            {% comment %}li.image.metafield omitted{% endcomment %}
            {% comment %}li.image.privateMetafield omitted{% endcomment %}
            &#x22;width&#x22;:{{ li.image.width | json }}
        },
        &#x22;merchantEditable&#x22;: {{ li.merchantEditable | json }},
        &#x22;name&#x22;: {{ li.name | json }},
        &#x22;nonFulfillableQuantity&#x22;: {{ li.nonFulfillableQuantity | json }},

        &#x22;originalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;originalUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;product&#x22;: {
            {% comment %}rest of Product omitted{% endcomment %}
            &#x22;title&#x22;: {{ li.product.title | json }}
        },

        &#x22;quantity&#x22;: {{ li.quantity | json }},
        &#x22;refundableQuantity&#x22;: {{ li.refundableQuantity | json }},
        &#x22;requiresShipping&#x22;: {{ li.requiresShipping | json }},
        &#x22;restockable&#x22;: {{ li.restockable | json }},

        &#x22;sellingPlan&#x22;: {
            &#x22;name&#x22;: {{ li.sellingPlan.name | json }}
        },

        &#x22;sku&#x22;: {{ li.sku | json }},

        &#x22;taxLines&#x22;: [
            {% for tl in li.taxLines %}
                {% if forloop.first != true %},{% endif %}
                {
                    &#x22;priceSet&#x22;: {
                        &#x22;presentmentMoney&#x22; : {
                            &#x22;amount&#x22;: {{ tl.priceSet.presentmentMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.presentmentMoney.currencyCode | json }}
                        },
                        &#x22;shopMoney&#x22;: {
                            &#x22;amount&#x22;: {{ tl.priceSet.shopMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.shopMoney.currencyCode | json }}
                        }
                    },
                    &#x22;rate&#x22;: {{ tl.rate | json }},
                    &#x22;ratePercentage&#x22;: {{ tl.ratePercentage | json }},
                    &#x22;title&#x22;: {{ tl.title | json }}
                }
            {% endfor %}
        ],
        &#x22;taxable&#x22;:{{ li.taxable | json }},
        &#x22;title&#x22;:{{ li.title | json }},

        &#x22;totalDiscountSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledDiscountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledOriginalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledQuantity&#x22;: {{ li.unfulfilledQuantity | json }},

        &#x22;variant&#x22;: {
            {% comment %}rest of variant omitted {% endcomment %}
            &#x22;title&#x22;: {{ li.variant.title | json }}
        },

        &#x22;variantTitle&#x22;: {{ li.variantTitle | json }},
        &#x22;vendor&#x22;: {{ li.vendor | json }}
    }
{% endfor %}
]

}