„Liquid“ kintamųjų naudojimas programėlėje „Shopify Flow“

„Liquid“ kintamieji yra „Liquid“ apibrėžtos rezervuotos vietos, kurios paleidus darbo eigą pakeičiamos vertėmis iš GraphQL Admin API. Kintamieji gali apibūdinti klientų, užsakymų ir produktų, dalyvaujančių Jūsų darbo eigose, atributus, pavyzdžiui, užsakymo numerį, užsakymo kainą arba kliento vardą. Kintamuosius galima naudoti sąlygose, siekiant valdyti darbo eigos logiką, arba išvesti duomenis iš veiksmo.

Kintamųjų pridėjimas darbo eigose naudojant „Liquid“

Galite pridėti kintamųjų naudodami „Liquid“ bet kuriame teksto laukelyje, kuriame yra nuoroda „Pridėti kintamąjį“. Spustelėkite nuorodą „Pridėti kintamąjį“ po atitinkamu laukeliu, tada pasirinkite kintamąjį iš sąrašo.

Vaizdas, kuriame rodomas veiksmo „Siųsti vidinį el. laišką“ konfigūracijos skydelis, pabrėžiant parinktį „Pridėti kintamąjį“ po laukeliu „Tema“. „

Sąrašo „Pridėti kintamąjį“ kintamieji filtruojami, todėl matysite tik tuos kintamuosius, kurie grąžinami ankstesniuose nei dabartinis veiksmuose, pvz., paleidikliuose. Pavyzdžiui, paleidiklis „Sukurtas užsakymas“ pateikia užsakymo ir parduotuvės išteklius iš „Admin API“, kuriuos galima įterpti kaip kintamuosius. Iš sąrašo pasirinkus kintamąjį, jis įtraukiamas į teksto laukelį kaip tinkamai suformatuotas „Liquid“.

Taip pat galite rašyti „Liquid“ tiesiai teksto laukelyje. Pavyzdžiui, galite naudoti kintamąjį {{ order.name }}, kad būtų rodoma „Shopify“ administratoriaus skydelio užsakymo eilutė, pvz., order-123.

Kadangi „Flow“ naudoja „Admin API“ „Liquid“ skirtiems duomenims gauti, kintamųjų sintaksėje naudojamos kupranugario raidės. Naudojant kupranugario raides, kintamųjų pirmas žodis prasideda mažąja raide, o vėlesni žodžiai – didžiąja, pvz., firstName arba canMarkAsPaid. Pavyzdžiui, norėdami pasiekti produkto sukūrimo datą, įveskite {{ product.createdAt }}. Jei naudojate „Liquid“ sintaksę „Shopify“ temoje, kurioje nenaudojamos kupranugario raidės, įvestumėte {{ product.created_at }}.

Sąlyginės ir iteracinės „Liquid“ žymos

„Liquid“ žymas galima naudoti su kintamaisiais atliekant šias funkcijas:

  • Rašyti sąlyginius sakinius, pvz., nustatyti, ar bendra užsakymo suma yra didesnė nei 100 USD.
  • Iteruoti objektų sąraše, pvz., išvesti kiekvienos užsakymo prekių pozicijos duomenis.

Galite naudoti „Liquid“ žymas, kad rašytumėte šiuos teiginius ir itertumėte per objektus.

Pavyzdžiui, toliau nurodytas „Liquid“ rodo užsakymo numerį, jei bendra užsakymo suma yra didesnė nei 100 USD:

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

Taip pat galite naudoti ciklą „for“, kad itertumėte per objektų sąrašą, pvz., užsakymo prekių pozicijas. Pavyzdžiui, toliau nurodytas „Liquid“ rodo kiekvienos užsakymo prekių pozicijos pavadinimą:

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

„Flow“ palaiko šias „Liquid“ sąlygines (arba valdymo eigos) žymas:

„Flow“ taip pat palaiko šias „Liquid“ iteracines žymas:

Filtrų taikymas kintamiesiems

Galite transformuoti kintamųjų duomenis „Liquid“ naudodami filtrus. „Flow“ palaiko visus atvirojo kodo „Liquid“ filtrus.

Pavyzdžiui, šis „Liquid“ kodas pašalina priešdėlį iš užsakymo pavadinimo ir pateikia tai, kas lieka: {{ order.name | remove: "Order-" }}

Svarstymai dėl „Liquid“ kintamųjų naudojimo filtruose

Prieš transformuodami kintamuosius filtrais, peržiūrėkite šiuos svarstymus:

  • „Flow“ nepalaiko taškinės notacijos, kurią galima naudoti su kai kuriais filtrais. Pavyzdžiui, „Flow“ palaiko {{ order.lineItems | size }}, bet ne {{ order.lineItems.size }}.
  • „Flow“ nepalaiko metalaukų taškinės notacijos. Pavyzdžiui, negalite naudoti {{ order.metafields.custom.hold_note }}. Vietoj to, turite peržiūrėti visus metalaukus cikle, kaip nurodyta pavyzdžiuose.
  • „Flow“ nepalaiko indeksų naudojimo elementams sąraše pasiekti. Pavyzdžiui, negalite naudoti {{ order.lineItems[0].title }}. Vietoj to, turite peržiūrėti visas prekių pozicijas cikle, kaip nurodyta pavyzdžiuose.

Datos filtrai

Be standartinių „Liquid“ filtrų, „Flow“ teikia datos filtrus, skirtus datai, susijusiai su kita data, gauti, kad būtų palaikomos paleidiklio „Suplanuotas laikas“ ir funkcijos „Gauti duomenis“. Šie filtrai yra: date_minus ir date_plus. Pavyzdžiui:

  • Norint grąžinti datą, viena diena vėlesnę nei dabartinė: {{ "now" | date_plus: "1 day" }}
  • Norint grąžinti datą, viena diena ankstesnę nei dabartinė: {{ "now" | date_minus: "1 day" }}

Šie filtrai priima second, minute, day, week, month ir year kaip trukmės vienetą, tiek vienaskaita (pvz., second), tiek daugiskaita (pvz., seconds). Taip pat galite pateikti šių tipų tinkinamus vienetus:

  • Sveikasis skaičius, nurodantis sekundžių skaičių: {{ "now" | date_minus: 3600 }}, kur 3600 atitinka 1 valandą.
  • ISO 8601 trukmės eilutė: {{ "now" | date_minus: "P1Y2D" }}, kur P1Y2D reiškia 1 metus ir 2 dienas.

Kriptografiniai filtrai

„Flow“ teikia kriptografinius filtrus, skirtus maišos funkcijai ir maišos funkcija pagrįstiems pranešimų autentifikavimo kodams (HMAC) kurti. Šie filtrai yra naudingi kuriant unikalius identifikatorius, kontrolines sumas arba integruojant su trečiųjų šalių sistemomis, kurioms reikalingi konkretūs maišos formatai.

Maišos filtrai

„Shopify Flow“ palaiko šių tipų maišos filtrus:

  • `blake3` – sukuria BLAKE3 maišą (rekomenduojama bendram naudojimui).
  • `sha256` – sukuria SHA-256 maišą.
  • `sha1` – sukuria SHA-1 maišą.
  • `md5` – sukuria MD5 maišą.

Bendriems maišos tikslams ir naujiems diegimams turėtumėte naudoti `blake3`, nes jis pasižymi geresniu veikimu ir saugumu, palyginti su senesniais algoritmais. Tačiau `sha256`, `sha1` ir `md5` yra prieinami suderinamumui su trečiųjų šalių sistemomis užtikrinti.

Naudojimo pavyzdys: `{{ "hello world" | blake3 }}` grąžina „hello world“ BLAKE3 maišą.

HMAC filtrai

Norėdami sukurti HMAC su slaptu raktu, naudokite vieną iš šių palaikomų filtrų:

Naudojimo pavyzdys:

  • Pagrindinis: `{{ "message" | hmac_sha256: "secret_key" }}`
  • Naudojant slaptukus (rekomenduojama): `{{ "message" | hmac_sha256: secrets.api_key }}`

Kintamųjų naudojimo su „Liquid“ „Shopify Flow“ programoje pavyzdžiai

Kad geriau suprastumėte, kaip naudoti „Liquid“ kintamuosius, peržiūrėkite šiuos pavyzdžius:

Išteklių URL adresų išvestis

Norite išvesti kliento, užsakymo ir produkto, kurie yra susiję su darbo eiga, URL adresus.

# 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>

Žymų sąrašo konvertavimas į metalauką

Norite konvertuoti žymų rinkinį į metalauką, kuris yra vienos eilutės teksto laukų sąrašas. Sukuriate darbo eigą naudodami paleidiklį Produktas įtrauktas į parduotuvę ir naudojate veiksmą Atnaujinti produkto metalauką. Veiksmo Atnaujinti produkto metalauką sekcijoje Reikšmė pridedate šį „Liquid“ kodą. Šiame pavyzdyje daroma prielaida, kad reikšmes reikia nustatyti tik vieną kartą, kai produktas sukuriamas, ir kad produktas turi dvi atitinkamas žymas: `color:red` ir `color:orange`.

„Liquid“ kodo, skirto vienos eilutės teksto lauko sąrašui nustatyti, pavyzdys.
ĮvestisIšvestis
{% 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"]

Dinamiško el. laiško apie užsakymą rašymas

Norite sukurti darbo eigą, kad išsiųstumėte el. laišką darbuotojui, kai klientas užsakymui išleidžia daugiau nei 500 USD. Sukuriate darbo eigą naudodami paleidiklį Užsakymas sukurtas, nustatote sąlygą, kuri įvykdoma, jei bendra užsakymo suma viršija 500 USD, ir naudojate veiksmą Siųsti vidinį el. laišką. Veiksmo Siųsti vidinį el. laišką sekcijoje Pranešimas naudojate šiuos kintamuosius.

Kintamųjų naudojimo kliento informacijai pateikti pavyzdys.
ĮvestisIšvestis
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 }}.
Prašome išsiųsti asmeninę padėką Jeanne Dupont (jeanne@example.com) už tai, kad pateikė užsakymą už 763,42 USD.

Dinamiško el. laiško apie produktą, kurio likutis mažas, rašymas

Nusprendžiate, kad reikia informuoti personalo narį, kai produkto atsargos senka ir reikia pateikti pirkimo užsakymą, kad papildytumėte atsargas. Sukuriate darbo eigą, kuri prasideda nuo paleidiklio Atsargų kiekis pakeistas, ir nustatote sąlygą, kuri įvykdoma, jei ankstesnis atsargų kiekis yra mažesnis arba lygus 10. Veiksmo Siųsti vidinį el. laišką sekcijoje Pranešimas naudojate šiuos kintamuosius.

Kintamųjų naudojimo daikto informacijai pateikti pavyzdys.
ĮvestisIšvestis
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Prašome iš naujo užsakyti produktą „Aukšto liemens tamprės – juodos“. Rašykite el. paštu adresu owner@example.com, kad patikrintumėte, ar jie gavo pirkimo užsakymą.

Dinamiško el. laiško, skirto pranešti personalui apie apgaulingą užsakymą, rašymas

Norite atšaukti užsakymus, kurių rizikos lygis yra aukštas, bet pageidaujate, kad Jūsų personalas atšauktų užsakymą rankiniu būdu. Sukuriate darbo eigą, kuri prasideda nuo paleidiklio Užsakymas sukurtas, ir nustatote sąlygą, kuri įvykdoma, jei užsakymo rizikos lygis yra „aukštas“. Veiksmo Siųsti vidinį el. laišką sekcijoje Pranešimas naudojate šiuos kintamuosius.

Kintamųjų naudojimo informacijai apie apgaulingą užsakymą pateikti pavyzdys.
ĮvestisIšvestis
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!
Mūsų „Shopify“ parduotuvė gavo užsakymą, kuriam būdinga didelė sukčiavimo rizika. Norėtume šį užsakymą iškart atšaukti, kol jis dar neišsiųstas gamybai:

#1001
Dupont, Jeanne
jeanne@example.com

Prašome patvirtinti naują užsakymo būseną. Ačiū!

Užsakymo prekių pozicijų išvestis naudojant ciklą „for“

Gavus užsakymą, gali būti naudinga išsiųsti pranešimą, kuriame nurodyti užsakyti produktai. Tai galite padaryti naudodami `for loop`, kuris pakartotinai vykdo kodo bloką. Teksto laukai, kurie palaiko kintamuosius, taip pat palaiko ciklus „for“ ir objektą „forloop“.

Pavyzdžiui, norite sukurti darbo eigą, kuri pateiktų visų užsakyme esančių SKU ir kiekių sąrašą. Veiksmo Siųsti vidinį el. laišką dalyje Pranešimas naudokite šiuos kintamuosius.

„For“ ciklo naudojimo pavyzdys užsakymo informacijai pateikti.
ĮvestisIšvestis
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Užsakymo santrauka:
8987097979 (50)
8877778887 (3)
888998898B (1)

Užsakymo prekių pozicijų išvedimas naudojant „for“ ciklą su papildoma informacija

Nusprendžiate į el. laišką įtraukti daugiau informacijos, įskaitant produkto pavadinimą, SKU, vieneto kainą ir kliento pristatymo informaciją. Veiksmo Send internal email skiltyje Message naudojate šiuos kintamuosius.

„For“ ciklo naudojimo pavyzdys išsamesnei užsakymo informacijai pateikti.
ĮvestisIšvestis
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Užsakymo santrauka:
Produktas: Tamprės aukštu juosmeniu – juodos
SKU: 8987097979
Kaina (už vienetą): 8,49 $
Kiekis: 5
Produktas: Sportinės kojinės – mėlynos
SKU: 888998898B
Kaina (už vienetą): 5,61 $
Kiekis: 2

Kai kurių prekių pozicijų išvedimas derinant „for“ ciklą su „if“ sąlyga

Jums reikia sekti parduotus daiktus, kuriuos tiekia konkretus pardavėjas. Veiksmo Siųsti vidinį el. laišką dalyje Pranešimas naudojate šiuos kintamuosius ir į savo for ciklą įtraukiate if sąlygą.

„For“ ciklo ir „if“ sąlygos naudojimo pavyzdys, skirtas užsakymo informacijai apie konkrečius pardavėjus pateikti.
ĮvestisIšvestis
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Parduotas „Acme“ produktas:
Produkto pavadinimas: Tamprės aukštu juosmeniu – juodos
SKU: 8987097979

Sudėtiniai duomenų objektai „Shopify Flow“ sistemoje

„Flow“ suteikia prieigą prie beveik visų duomenų, esančių GraphQL Admin API. Tai apima sudėtinius duomenų objektus, pvz., sąrašus ir objektus. Tačiau yra tam tikrų apribojimų, ką galite daryti su šiais objektais. Šiame skyriuje apžvelgiami šie apribojimai ir pateikiami pavyzdžiai, kaip su jais dirbti.

Užuot tiesiogiai iškvietę sąrašus ir objektus, turėtumėte naudoti ciklą ir įtraukti tik tuos laukus, kurių Jums reikia.

Pavyzdžiui, užuot tiesiogiai iškvietę {{ order.lineItems }}, naudokite šį formatą konkretiems laukams iškviesti. Šiuose pavyzdžiuose yra visi laukai, kurie būtų įtraukti tiesiogiai iškviečiant sąrašą arba objektą. Nukopijuokite ir įklijuokite reikiamus laukus.

Tekstas
{% 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 %}
]

}