Používanie premenných Liquid v Shopify Flow

Premenné Liquid sú zástupné symboly definované v jazyku Liquid, ktoré sa pri spustení pracovného postupu nahradia hodnotami z rozhrania GraphQL Admin API. Premenné môžu opisovať atribúty zákazníkov, objednávok a produktov zapojených do vašich pracovných postupov, ako je číslo objednávky, cena objednávky alebo meno zákazníka. Premenné možno použiť v podmienkach na riadenie logiky v pracovnom postupe alebo na výstup údajov z akcie.

Pridávanie premenných do pracovných postupov pomocou jazyka Liquid

Pomocou jazyka Liquid môžete premenné pridať do akéhokoľvek textového poľa, ktoré obsahuje odkaz Pridať premennú. Kliknite na odkaz Pridať premennú pod príslušným poľom a následne vyberte premennú zo zoznamu.

Obrázok konfiguračného panela akcie Odoslať interný e-mail so zvýraznením možnosti Pridať premennú pod poľom Predmet.

Premenné v zozname Pridať premennú sú filtrované, takže používate len premenné, ktoré vracajú kroky predchádzajúce aktuálnemu kroku, ako sú napríklad spúšťače. Napríklad spúšťač Vytvorená objednávka poskytuje zdroje objednávky a obchodu z rozhrania Admin API, ktoré je možné vložiť ako premenné. Po výbere premennej zo zoznamu sa táto premenná pridá do textového poľa ako správne naformátovaný kód Liquid.

Kód Liquid môžete písať aj priamo do textového poľa. Ak napríklad chcete zobraziť reťazec objednávky z administrátora Shopify (napr. order-123), môžete použiť premennú {{ order.name }}.

Keďže Flow používa na získavanie údajov pre Liquid rozhranie Admin API, syntax premenných využíva formát camel case. V premenných vo formáte camel case sa prvé slovo začína malým písmenom a nasledujúce slová veľkým písmenom, napríklad firstName alebo canMarkAsPaid. Ak napríklad chcete získať prístup k dátumu vytvorenia produktu, zadajte {{ product.createdAt }}. Ak používate syntax Liquid v téme Shopify, ktorá nepoužíva formát camel case, zadali by ste {{ product.created_at }}.

Podmienené a iteračné značky Liquid

Značky Liquid sa môžu používať s premennými na vykonávanie nasledujúcich funkcií:

  • Zápis podmienených príkazov, napríklad na určenie, či je celková suma objednávky vyššia ako 100 USD.
  • Iterácia v zozname objektov, napríklad na výstup údajov pre každú samostatnú položku v objednávke.

Na zápis týchto príkazov a iteráciu objektov môžete použiť značky Liquid.

Nasledujúci kód Liquid napríklad zobrazí číslo objednávky, ak je celková suma objednávky vyššia ako 100 USD:

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

Na iteráciu cez zoznam objektov, napríklad samostatných položiek objednávky, môžete použiť aj slučku for. Nasledujúci kód Liquid napríklad zobrazí názov každej samostatnej položky v objednávke:

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

Flow podporuje nasledujúce podmienené (alebo riadiace) značky Liquid:

Flow podporuje aj nasledujúce iteračné značky Liquid:

Použitie filtrov na premenné

Údaje premenných v jazyku Liquid môžete transformovať pomocou filtrov. Flow podporuje všetky filtre Liquid s otvoreným zdrojovým kódom.

Nasledujúci kód Liquid napríklad odstráni predponu z názvu objednávky a vypíše to, čo zostane: {{ order.name | remove: "Order-" }}

Dôležité informácie o používaní premenných Liquid vo filtroch

Pred transformáciou premenných pomocou filtrov zvážte tieto dôležité informácie:

  • Flow nepodporuje bodkovú notáciu, ktorá je dostupná pre niektoré filtre. Napríklad Flow podporuje {{ order.lineItems | size }}, ale nie {{ order.lineItems.size }}.
  • Flow nepodporuje bodkovú notáciu pre metapolia. Nemôžete napríklad použiť {{ order.metafields.custom.hold_note }}. Namiesto toho musíte prechádzať metapolia v cykle tak, ako je to uvedené v príkladoch.
  • Flow nepodporuje používanie indexov na prístup k položkám v zozname. Nemôžete napríklad použiť {{ order.lineItems[0].title }}. Namiesto toho musíte prechádzať samostatné položky v cykle tak, ako je to uvedené v príkladoch.

Filtre dátumu

Okrem štandardných filtrov Liquid poskytuje Flow filtre dátumu na získanie dátumu relatívneho k inému dátumu na podporu spúšťača Scheduled time (Naplánovaný čas) a funkcií Get data (Získať údaje). Tieto filtre sú: date_minus a date_plus. Napríklad:

  • Vrátenie dátumu o jeden deň v budúcnosti: {{ "now" | date_plus: "1 day" }}
  • Vrátenie dátumu o jeden deň v minulosti: {{ "now" | date_minus: "1 day" }}

Tieto filtre akceptujú second, minute, day, week, month a year ako jednotku trvania, a to v jednotnom (napríklad second) aj v množnom čísle (napríklad seconds). Môžete tiež zadať nasledujúce typy prispôsobiteľných jednotiek:

  • Celé číslo predstavujúce počet sekúnd: {{ "now" | date_minus: 3600 }}, kde 3600 zodpovedá 1 hodine.
  • Reťazec trvania podľa normy ISO8601: {{ "now" | date_minus: "P1Y2D" }}, kde P1Y2D znamená 1 rok a 2 dni.

Kryptografické filtre

Flow poskytuje kryptografické filtre na hešovanie a vytváranie overovacích kódov správ založených na hešovaní (HMAC). Tieto filtre sú užitočné na vytváranie jedinečných identifikátorov, kontrolných súčtov alebo na integráciu so systémami tretej strany, ktoré vyžadujú špecifické formáty hešov.

Hešovacie filtre

Shopify Flow podporuje nasledujúce typy hešovacích filtrov:

  • blake3 – Vytvára heš BLAKE3 (odporúča sa na všeobecné použitie).
  • sha256 – Vytvára heš SHA-256.
  • sha1 – Vytvára heš SHA-1.
  • md5 – Vytvára heš MD5.

Na všeobecné účely hešovania a nové implementácie by ste mali používať blake3, pretože ponúka lepšiu výkonnosť a bezpečnosť v porovnaní so staršími algoritmami. Avšak filtre sha256, sha1 a md5 sú k dispozícii z dôvodu kompatibility so systémami tretej strany.

Príklad použitia: {{ "hello world" | blake3 }} vráti heš BLAKE3 pre reťazec „hello world“.

Filtre HMAC

Ak chcete vytvoriť HMAC s tajným kľúčom, použite jeden z nasledujúcich podporovaných filtrov:

Príklad použitia:

  • Základné: {{ "message" | hmac_sha256: "secret_key" }}
  • S tajnými kľúčmi (odporúča sa): {{ "message" | hmac_sha256: secrets.api_key }}

Príklady použitia premenných s jazykom Liquid v Shopify Flow

Ak chcete získať lepšiu predstavu o tom, ako používať premenné Liquid, pozrite si nasledujúce príklady:

Výstup adries URL pre zdroje

Chcete získať na výstupe adresy URL zákazníka, objednávky a produktu, ktoré sú súčasťou pracovného postupu.

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

Konvertovanie zoznamu štítkov na metapole

Chcete konvertovať skupinu štítkov na metapole, ktoré predstavuje zoznam jednoriadkových textových polí. Vytvoríte pracovný postup pomocou spúšťača Produkt pridaný do obchodu a použijete akciu Aktualizovať metapole produktu. V časti Hodnota akcie Aktualizovať metapole produktu pridáte nasledujúci kód jazyka Liquid. Tento príklad predpokladá, že hodnoty stačí nastaviť iba raz pri vytvorení produktu a že produkt má dva relevantné štítky: color:red a color:orange.

Príklad kódu v jazyku Liquid na nastavenie zoznamu jednoriadkového textového poľa.
VstupVýstup
{% 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"]

Vytvorenie dynamickej e-mailovej správy pre objednávku

Chcete vytvoriť pracovný postup na odoslanie e-mailu zamestnancovi, keď zákazník minie na objednávku viac ako 500 $. Vytvoríte pracovný postup pomocou spúšťača Objednávka vytvorená, nastavíte podmienku, ktorá je splnená, ak je celková suma objednávky vyššia ako 500 $, a použijete akciu Odoslať interný e-mail. V časti Správa akcie Odoslať interný e-mail použijete nasledujúce premenné.

Príklad použitia premennej na poskytnutie detailov o zákazníkovi.
VstupVýstup
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šlite osobné poďakovanie Jeanne Dupont (jeanne@example.com) za objednávku v hodnote 763,42 $.

Napísanie dynamickej e‑mailovej správy pre produkt s nízkymi zásobami

Rozhodnete sa, že potrebujete informovať personál, keď sa množstvo zásob produktu zníži a je potrebné zadať objednávku na ďalšie zásoby. Vytvoríte pracovný postup, ktorý sa začína spúšťačom Zmena množstva zásob, a nastavíte podmienku, ktorá je splnená, ak bolo predchádzajúce množstvo zásob menšie alebo rovné 10. V sekcii Správa akcie Odoslať interný e‑mail použijete nasledujúce premenné.

Príklad použitia premennej na poskytnutie detailov o položke.
VstupVýstup
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Objednajte znova produkt High Waist Leggings - Black. Odošlite e‑mail na adresu owner@example.com a overte, či prijali nákupnú objednávku.

Napísanie dynamickej e‑mailovej správy, ktorá upozorní personál na podvodnú objednávku

Chcete zrušiť objednávky, ktoré majú vysokú úroveň rizika, ale uprednostňujete, aby personál zrušil objednávku manuálne. Vytvoríte pracovný postup, ktorý sa začína spúšťačom Vytvorenie objednávky, a nastavíte podmienku, ktorá je splnená, ak je úroveň rizika objednávky vysoká. V sekcii Správa akcie Odoslať interný e‑mail použijete nasledujúce premenné.

Príklad použitia premennej na poskytnutie informácií o podvodnej objednávke.
VstupVýstup
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!
Náš obchod Shopify prijal objednávku s vysokým rizikom podvodu. Túto objednávku by sme chceli okamžite zrušiť, skôr než sa odošle do výroby:

#1001
Dupont, Jeanne
jeanne@example.com

Potvrďte nový stav objednávky. Ďakujeme!

Výpis samostatných položiek objednávky pomocou cyklu for

Keď prijmete objednávku, môže byť užitočné odoslať správu s objednanými produktmi. Môžete to urobiť pomocou cyklu for loop (cyklus for), ktorý opakovane vykonáva blok kódu. Textové polia, ktoré podporujú premenné, podporujú aj cykly for a objekt forloop.

Chcete napríklad vytvoriť pracovný postup, ktorý vráti zoznam všetkých SKU a množstiev v objednávke. V sekcii Správa akcie Odoslať interný e‑mail použijete nasledujúce premenné.

Príklad použitia cyklu for na poskytnutie informácií o objednávke.
VstupVýstup
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Súhrn objednávky:
8987097979 (50)
8877778887 (3)
888998898B (1)

Výpis samostatných položiek objednávky pomocou cyklu for s ďalšími informáciami

Rozhodnete sa pridať do e‑mailu ďalšie informácie vrátane názvu produktu, kódov SKU, ceny za položku a informácií o doprave pre zákazníka. V sekcii Správa akcie Odoslať interný e‑mail použijete nasledujúce premenné.

Príklad použitia cyklu for na poskytnutie rozsiahlejších informácií o objednávke.
VstupVýstup
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Súhrn objednávky:
Produkt: High Waist Leggings - Black
SKU: 8987097979
Cena (za jednotku): 8,49 $
Množstvo: 5
Produkt: Athletic Socks - Blue
SKU: 888998898B
Cena (za jednotku): 5,61 $
Množstvo: 2

Výpis niektorých samostatných položiek kombináciou cyklu for s podmienkou if

Potrebujete sledovať predané položky, ktoré dodáva konkrétny dodávateľ. V sekcii Správa akcie Odoslať interný e‑mail použijete nasledujúce premenné a do cyklu for loop zahrniete podmienku if.

Príklad použitia cyklu for a podmienky if na poskytnutie informácií o objednávke pre konkrétnych dodávateľov.
VstupVýstup
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Predaný produkt Acme:
Názov produktu: High Waist Leggings - Black
SKU: 8987097979

Komplexné dátové objekty v aplikácii Shopify Flow

Aplikácia Flow umožňuje prístup takmer ku všetkým dátam v GraphQL Admin API. To zahŕňa komplexné dátové objekty, ako sú zoznamy a objekty. Existujú však určité obmedzenia týkajúce sa toho, čo môžete s týmito objektmi robiť. Táto sekcia opisuje tieto obmedzenia a poskytuje príklady, ako s nimi pracovať.

Namiesto priameho volania zoznamov a objektov by ste mali zoznam prejsť cyklom a zahrnúť len tie polia, ktoré chcete.

Namiesto priameho volania {{ order.lineItems }} použite na volanie konkrétnych polí napríklad nasledujúci formát. Tieto príklady obsahujú všetky polia, ktoré by boli zahrnuté priamym volaním zoznamu alebo objektu. Skopírujte a prilepte polia, ktoré potrebujete.

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

}