Uporaba spremenljivk Liquid v Shopify Flow

Spremenljivke Liquid so nadomestna besedila, definirana v jeziku Liquid, ki se pri zagonu poteka dela zamenjajo z vrednostmi iz API-ja GraphQL Admin API. Spremenljivke lahko opisujejo lastnosti strank, naročil in izdelkov, ki so vključeni v vaše poteke dela, kot so številka naročila, cena naročila ali ime stranke. Spremenljivke se lahko uporabijo v pogojih za nadzor logike v vašem poteku dela ali za izpis podatkov iz dejanja.

Dodajanje spremenljivk v poteke dela s pomočjo jezika Liquid

Spremenljivke lahko z jezikom Liquid dodate v poljubno polje z besedilom, ki vsebuje povezavo Dodaj spremenljivko. Kliknite povezavo Dodaj spremenljivko pod ustreznim poljem in nato s seznama izberite spremenljivko.

Slika konfiguracijske plošče za dejanje pošiljanja interne e-pošte, ki označuje možnost »Dodaj spremenljivko« pod poljem za zadevo.

Spremenljivke na seznamu Dodaj spremenljivko so filtrirane tako, da uporabite samo spremenljivke, ki jih vrnejo koraki pred trenutnim korakom, kot so sprožilci. Sprožilec Ustvarjeno naročilo na primer zagotovi vire naročila in trgovine iz API-ja Admin API, ki jih lahko vstavite kot spremenljivke. Ko izberete spremenljivko s seznama, se v polje z besedilom doda kot ustrezno oblikovana koda Liquid.

Kodo Liquid lahko pišete tudi neposredno v polje z besedilom. Uporabite lahko na primer spremenljivko {{ order.name }} za prikaz niza naročila iz skrbnika Shopify, na primer order-123.

Ker aplikacija Flow za pridobivanje podatkov, ki se uporabljajo za Liquid, uporablja Admin API, sintaksa spremenljivk uporablja grbasti zapis (camel case). Pri spremenljivkah v grbastem zapisu se prva beseda začne z malo začetnico, vsaka naslednja beseda pa z veliko začetnico, na primer firstName ali canMarkAsPaid. Če želite na primer dostopati do datuma stvaritve izdelka, vnesite {{ product.createdAt }}. Če sintakso Liquid uporabljate v temi Shopify, ki ne uporablja grbastega zapisa, morate vnesti {{ product.created_at }}.

Pogojne in iteracijske oznake Liquid

Oznake Liquid lahko uporabite s spremenljivkami za izvajanje naslednjih funkcij:

  • Pisanje pogojnih stavkov, kot je določanje, ali je znesek naročila večji od 100 $.
  • Iteriranje skozi seznam objektov, kot je izpis podatkov za vsako postavko v naročilu.

Za pisanje teh stavkov in iteriranje skozi objekte lahko uporabite oznake Liquid.

Naslednja koda Liquid na primer prikaže številko naročila, če je znesek naročila večji od 100 $:

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

Za iteriranje skozi seznam objektov, kot so postavke naročila, lahko uporabite tudi zanko for. Naslednja koda Liquid na primer prikaže ime vsake postavke v naročilu:

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

Aplikacija Flow podpira naslednje pogojne oznake Liquid (ali oznake nadzora poteka):

Aplikacija Flow podpira tudi naslednje iteracijske oznake Liquid:

Uporaba filtrov na spremenljivkah

Podatke spremenljivk lahko v jeziku Liquid pretvorite s filtri. Aplikacija Flow podpira vse odprtokodne filtre Liquid.

Naslednja koda Liquid na primer odstrani predpono iz imena naročila in prikaže preostanek: {{ order.name | remove: "Order-" }}

Premisleki glede uporabe spremenljivk Liquid v filtrih

Pred pretvorbo spremenljivk s filtri preglejte naslednje premisleke:

  • Aplikacija Flow ne podpira zapisa s piko, ki je na voljo za nekatere filtre. Flow na primer podpira {{ order.lineItems | size }}, ne pa tudi {{ order.lineItems.size }}.
  • Aplikacija Flow ne podpira zapisa s piko za metapolja. Ne morete na primer uporabiti {{ order.metafields.custom.hold_note }}. Namesto tega se morate pomikati v zanki skozi metapolja, kot je opisano v primerih.
  • Aplikacija Flow ne podpira uporabe indeksov za dostop do elementov na seznamu. Ne morete na primer uporabiti {{ order.lineItems[0].title }}. Namesto tega se morate pomikati v zanki skozi postavke, kot je opisano v primerih.

Filtri za datume

Poleg standardnih filtrov Liquid ponuja Flow filtre za datume, s katerimi lahko pridobite datum glede na drug datum, kar podpira sprožilec Načrtovani čas (Scheduled time) in funkcije Pridobi podatke (Get data). Ti filtri so: date_minus in date_plus. Na primer:

  • Če želite vrniti datum en dan v prihodnosti: {{ "now" | date_plus: "1 day" }}
  • Če želite vrniti datum en dan v preteklosti: {{ "now" | date_minus: "1 day" }}

Ti filtri kot enoto za trajanje sprejemajo second, minute, day, week, month in year, in sicer v ednini (npr. second) ter množini (npr. seconds). Navedete lahko tudi naslednje vrste enot po meri:

  • Celo število, ki predstavlja število sekund: {{ "now" | date_minus: 3600 }}, pri čemer je 3600 enakovredno 1 uri.
  • Niz trajanja ISO8601: {{ "now" | date_minus: "P1Y2D" }}, pri čemer P1Y2D pomeni 1 leto in 2 dneva.

Kriptografski filtri

Aplikacija Flow zagotavlja kriptografske filtre za zgoščevanje in ustvarjanje kod za preverjanje pristnosti sporočil na osnovi zgoščevalnih algoritmov (HMAC). Ti filtri so uporabni za ustvarjanje edinstvenih oznak, kontrolnih vsot ali za integracijo s sistemi zunanjih izvajalcev, ki zahtevajo specifične formate zgoščevanja.

Filtri za zgoščevanje

Shopify Flow podpira naslednje vrste filtrov za zgoščevanje:

  • blake3 – ustvari zgostitev BLAKE3 (priporočeno za splošno uporabo).
  • sha256 – ustvari zgostitev SHA-256.
  • sha1 – ustvari zgostitev SHA-1.
  • md5 – ustvari zgostitev MD5.

Za splošne namene zgoščevanja in nove implementacije uporabite blake3, saj ponuja boljšo uspešnost in varnost v primerjavi s starejšimi algoritmi. Kljub temu so algoritmi sha256, sha1 in md5 na voljo zaradi združljivosti s sistemi zunanjih izvajalcev.

Primer uporabe: {{ "hello world" | blake3 }} vrne zgostitev BLAKE3 za »hello world«.

Filtri HMAC

Če želite ustvariti HMAC s skrivnim ključem, uporabite enega od naslednjih podprtih filtrov:

Primer uporabe:

  • Osnovno: {{ "message" | hmac_sha256: "secret_key" }}
  • S skrivnostmi (priporočeno): {{ "message" | hmac_sha256: secrets.api_key }}

Primeri uporabe spremenljivk z jezikom Liquid v aplikaciji Shopify Flow

Za boljšo predstavo o uporabi spremenljivk Liquid si oglejte naslednje primere:

Izpis URL-naslovov za vire

Želite izpisati URL-naslove za stranko, naročilo in izdelek, ki so vključeni v potek dela.

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

Pretvorba seznama oznak v metapolje

Nabor oznak želite pretvoriti v metapolje, ki je seznam enovrstičnih besedilnih polj. Ustvarite potek dela s sprožilcem Izdelek dodan v trgovino in uporabite dejanje Posodobi metapolje izdelka. V odsek Vrednost dejanja Posodobi metapolje izdelka dodate naslednjo kodo Liquid. Ta primer predpostavlja, da morate vrednosti nastaviti samo enkrat ob ustvarjanju izdelka in da ima izdelek dve ustrezni oznaki: color:red ter color:orange.

Primer kode Liquid za nastavitev seznama enovrstičnega besedilnega polja.
VnosIzhod
{% 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"]

Pisanje dinamičnega e-poštnega sporočila za naročilo

Želite ustvariti potek dela za pošiljanje e-pošte zaposlenemu, ko stranka za naročilo porabi več kot 500 $. Ustvarite potek dela s sprožilcem Naročilo ustvarjeno, nastavite pogoj, ki je izpolnjen, če je skupni znesek naročila višji od 500 $, in uporabite dejanje Pošlji interno e-pošto. V odseku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke.

Primer uporabe spremenljivke za zagotavljanje podrobnosti o stranki.
VnosIzhod
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 }}.
Pošljite osebno zahvalo Jeanne Dupont (jeanne@example.com) za oddano naročilo v vrednosti 763,42 $.

Napišite dinamično e-poštno sporočilo za izdelek, katerega zaloga je nizka

Odločite se, da morate obvestiti člana osebja, ko se zaloga izdelka zmanjša in je treba naročiti novo zalogo. Ustvarite potek dela, ki se začne s sprožilcem Spremenjena količina zalog, in nastavite pogoj, ki velja, če je bila predhodna količina zalog manjša ali enaka 10. V razdelku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke.

Primer uporabe spremenljivke za prikaz podrobnosti o kosu.
VnosIzhod
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Prosimo, ponovno naročite pajkice High Waist Leggings - Black. Pošljite e-pošto na owner@example.com in preverite, ali so prejeli naročilnico.

Napišite dinamično e-poštno sporočilo, da obvestite osebje o goljufivem naročilu

Želite preklicati naročila z visoko stopnjo tveganja, vendar raje vidite, da vaše osebje naročilo prekliče ročno. Ustvarite potek dela, ki se začne s sprožilcem Ustvarjeno naročilo, in nastavite pogoj, ki velja, če je stopnja tveganja naročila visoka. V razdelku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke.

Primer uporabe spremenljivke za zagotavljanje informacij o goljufivem naročilu.
VnosIzhod
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!
Naša trgovina Shopify je prejela naročilo z visokim tveganjem za goljufijo. To naročilo želimo preklicati takoj, še preden gre v proizvodnjo:

#1001
Dupont, Jeanne
jeanne@example.com

Prosimo, potrdite nov status naročila. Hvala!

Izpišite postavke za naročilo z uporabo zanke for

Ob prejemu naročila je lahko koristno poslati sporočilo z naročenimi izdelki. To lahko storite z uporabo zanke for (for loop), ki ponavljajoče izvaja blok kode. Besedilna polja, ki podpirajo spremenljivke, podpirajo tudi zanke for in objekt forloop.

Na primer, ustvariti želite potek dela, ki vrne seznam vseh SKU-jev in količin v naročilu. V razdelku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke.

Primer uporabe zanke for za zagotavljanje informacij o naročilu.
VnosIzhod
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Povzetek naročila:
8987097979 (50)
8877778887 (3)
888998898B (1)

Izpišite postavke za naročilo z uporabo zanke for z dodatnimi informacijami

V e-pošto se odločite dodati več informacij, vključno z imenom izdelka, SKU-ji, ceno na kos in informacijami o dostavi za stranko. V razdelku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke.

Primer uporabe zanke for za zagotavljanje obsežnejših informacij o naročilu.
VnosIzhod
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Povzetek naročila:
Izdelek: High Waist Leggings - Black
SKU: 8987097979
Cena (na enoto): 8,49 $
Količina: 5
Izdelek: Athletic Socks - Blue
SKU: 888998898B
Cena (na enoto): 5,61 $
Količina: 2

Izpišite nekatere postavke s kombinacijo zanke for in stavka if

Slediti morate prodanim kosom, ki jih dobavlja določen prodajalec. V razdelku Sporočilo dejanja Pošlji interno e-pošto uporabite naslednje spremenljivke in v svojo zanko for vključite stavek if.

Primer uporabe zanke for in stavka if za zagotavljanje informacij o naročilu za določene prodajalce.
VnosIzhod
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Prodan izdelek Acme:
Ime izdelka: High Waist Leggings - Black
SKU: 8987097979

Kompleksni podatkovni objekti v aplikaciji Shopify Flow

Aplikacija Flow vam omogoča dostop do skoraj vseh podatkov v GraphQL Admin API. To vključuje kompleksne podatkovne objekte, kot so seznami in objekti. Vendar pa obstajajo nekatere omejitve glede tega, kaj lahko storite s temi objekti. V tem razdelku so opisane te omejitve in podani primeri, kako delati z njimi.

Namesto da neposredno kličete sezname in objekte, se pomikajte po seznamu in vključite samo želena polja.

Na primer, namesto neposrednega klica {{ order.lineItems }} uporabite naslednjo obliko za klicanje določenih polj. Ti primeri vključujejo vsa polja, ki bi bila vključena ob neposrednem klicu seznama ali objekta. Kopirajte in prilepite polja, ki jih potrebujete.

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

}