Folyékony változók használata a Shopify Flow alkalmazásban

A folyékony változók a Liquidben definiált helyőrzők, amelyeket egy munkafolyamat futtatásakor a GraphQL Admin API-ból származó értékek helyettesítenek. A változók leírhatják a munkafolyamatokban részt vevő vásárlók, rendelések és termékek jellemzőit, például a rendelési számot, a rendelés árát vagy a vásárlónevet. A változók felhasználhatók feltételekben a munkafolyamat logikájának szabályozására, vagy adatok kiadására egy műveletből.

Változók hozzáadása a munkafolyamatokhoz a Liquid használatával

A Liquid használatával bármely olyan szövegmezőhöz hozzáadhat változókat, amely tartalmazza a Változó hozzáadása hivatkozást. Kattintson a megfelelő mező alatti Változó hozzáadása hivatkozásra, majd válasszon egy változót a listából.

A Belső e-mail küldése művelet konfigurációs paneljének képe, kiemelve a Tárgy mező alatti „Változó hozzáadása” opciót.

A Változó hozzáadása listában lévő változók szűrve vannak, így Ön csak azokat a változókat használhatja, amelyeket az aktuális lépést megelőző lépések, például a kiváltók adnak vissza. A Rendelés létrehozva kiváltó például az Admin API-ból származó rendelési és bolti erőforrásokat biztosít, amelyek változóként beilleszthetők. Miután kiválasztott egy változót a listából, az megfelelően formázott Liquid-kódként bekerül a szövegdobozba.

A Liquid-kódot közvetlenül a szövegmezőbe is beírhatja. Például az {{ order.name }} változóval megjelenítheti a rendelés karakterláncát a Shopify adminisztrációs felületéről, például az order-123 értéket.

Mivel a Flow az Admin API-t használja a Liquid által használt adatok lekéréséhez, a változók szintaxisa tevepúpnotációt használ. A tevepúpnotációs változókban az első szó kisbetűvel, a további szavak pedig nagybetűvel kezdődnek, például a firstName vagy a canMarkAsPaid. Egy termék létrehozási dátumának eléréséhez például adja meg a {{ product.createdAt }} kódot. Ha a Liquid szintaxist egy Shopify-témában használja, amely nem használ tevepúpnotációt, akkor a {{ product.created_at }} kódot kell megadnia.

Feltételes és iterációs Liquid-címkék

A Liquid-címkék változókkal együtt használhatók a következő funkciók elvégzésére:

  • Feltételes utasítások írása, például annak meghatározása, hogy egy rendelés végösszege nagyobb-e 100 dollárnál.
  • Objektumok listáján való iterálás, például egy rendelés minden egyes sorelemére vonatkozó adatok kiadása.

Ezen utasítások megírásához és az objektumokon való iteráláshoz használhat Liquid-címkéket.

Például a következő Liquid-kód megjeleníti a rendelési számot, ha a rendelés végösszege meghaladja a 100 dollárt:

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

Használhat for ciklust is egy objektumlista, például egy rendelés sorelemeinek iterálásához. A következő Liquid-kód például megjeleníti a rendelés minden sorelemének a nevét:

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

A Flow a következő Liquid feltételes (vagy vezérlési folyamat) címkéket támogatja:

A Flow a következő Liquid iterációs címkéket is támogatja:

Szűrők alkalmazása a változókra

A Liquidben szűrők segítségével alakíthatja át a változók adatait. A Flow támogatja az összes nyílt forráskódú Liquid-szűrőt.

Például a következő Liquid-kód eltávolít egy előtagot egy rendelés nevéből, és kiadja a megmaradt részt: {{ order.name | remove: "Order-" }}

Megfontolások a Liquid-változók szűrőkben való használatához

Mielőtt szűrőkkel alakítaná át a változókat, tekintse át a következő megfontolásokat:

  • A Flow nem támogatja a pontos jelölést (dot notation), amely egyes szűrőknél elérhető. Például a Flow támogatja a {{ order.lineItems | size }} formátumot, de a {{ order.lineItems.size }} formátumot nem.
  • A Flow nem támogatja a pontos jelölést a metamezők esetében. Például nem használhatja a {{ order.metafields.custom.hold_note }} formátumot. Ehelyett a metamezőkön a példákban vázoltak szerint kell végigiterálnia.
  • A Flow nem támogatja az indexek használatát a listaelemek eléréséhez. Például nem használhatja a {{ order.lineItems[0].title }} formátumot. Ehelyett a sorelemeken a példákban vázoltak szerint kell végigiterálnia.

Dátumszűrők

A szabványos Liquid-szűrőkön kívül a Flow dátumszűrőket is biztosít egy másik dátumhoz viszonyított dátum lekéréséhez, hogy támogassa az Ütemezett időpont kiváltót és az Adatok lekérése funkciót. Ezek a szűrők a következők: date_minus és date_plus. Például:

  • Egy jövőbeli, egy nappal későbbi dátum visszaadása: {{ "now" | date_plus: "1 day" }}
  • Egy múltbeli, egy nappal korábbi dátum visszaadása: {{ "now" | date_minus: "1 day" }}

Ezek a szűrők időtartam-egységként elfogadják a second, minute, day, week, month és year értéket, mind egyes (például second), mind többes számban (például seconds). A következő típusú testreszabható egységeket is megadhatja:

  • A másodpercek számát jelölő egész szám: {{ "now" | date_minus: 3600 }}, ahol a 3600 1 órának felel meg.
  • Egy ISO 8601 időtartam-karakterlánc: {{ "now" | date_minus: "P1Y2D" }}, ahol a P1Y2D jelentése 1 év és 2 nap.

Kriptográfiai szűrők

A Flow kriptográfiai szűrőket biztosít a hasheléshez és a hash-alapú üzenet-hitelesítési kódok (HMAC) létrehozásához. Ezek a szűrők hasznosak egyedi azonosítók, ellenőrző összegek létrehozásához, vagy olyan harmadik féltől származó rendszerekkel való integrációhoz, amelyek meghatározott hash formátumokat igényelnek.

Hashelő szűrők

A Shopify Flow a következő típusú hashelő szűrőket támogatja:

  • blake3BLAKE3-hash-t hoz létre (általános használatra ajánlott).
  • sha256SHA-256-hash-t hoz létre.
  • sha1SHA-1-hash-t hoz létre.
  • md5MD5-hash-t hoz létre.

Általános hashelési célokra és új implementációkhoz a blake3 használata javasolt, mivel a régebbi algoritmusokhoz képest jobb teljesítményt és biztonságot nyújt. A sha256, a sha1 és az md5 azonban a harmadik felek rendszereivel való kompatibilitás érdekében továbbra is elérhető.

Példa a használatra: {{ "hello world" | blake3 }} a „hello world” szöveg BLAKE3-hash-értékét adja vissza.

HMAC-szűrők

HMAC titkos kulccsal való létrehozásához használja az alábbi támogatott szűrők egyikét:

Példa a használatra:

  • Alapszintű: {{ "message" | hmac_sha256: "secret_key" }}
  • Titkok használatával (ajánlott): {{ "message" | hmac_sha256: secrets.api_key }}

Példák változók használatára Liquiddel a Shopify Flow-ban

A Liquid-változók használatának jobb megértéséhez tekintse meg az alábbi példákat:

Erőforrások URL-címeinek kiírása

Ki szeretné íratni a munkafolyamatban érintett vásárló, rendelés és termék URL-címeit.

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

Címkelista átalakítása metamezővé

Egy címkekészletet szeretne metamezővé alakítani, amely egysoros szöveges mezők listája. Létrehoz egy munkafolyamatot a Termék hozzáadva az üzlethez kiváltóval, és használja a Termék metamezőjének frissítése műveletet. A Termék metamezőjének frissítése művelet Érték szakaszában adja hozzá a következő Liquid-kódot. Ez a példa feltételezi, hogy az értékeket csak egyszer kell beállítania a termék létrehozásakor, és hogy a terméknek két releváns címkéje van: color:red és color:orange.

Példa Liquid-kód egysoros szöveges mező listájának beállítására.
BemenetKimenet
{% 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"]

Dinamikus e-mail-üzenet írása rendeléshez

Létre szeretne hozni egy munkafolyamatot, amely e-mailt küld egy alkalmazottnak, ha egy vásárló több mint 500 USD-t költ egy rendelésre. Létrehoz egy munkafolyamatot a Rendelés létrehozva kiváltóval, beállít egy feltételt, amely akkor igaz, ha a rendelés végösszege meghaladja az 500 USD-t, és használja a Belső e-mail küldése műveletet. A Belső e-mail küldése művelet Üzenet szakaszában a következő változókat használja.

Példa a változók használatára a vásárlói adatok megadásához.
BemenetKimenet
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 }}.
Kérjük, küldjön személyes köszönőlevelet Jeanne Dupontnak (jeanne@example.com) a 763,42 USD értékű rendeléséért.

Dinamikus e-mail-üzenet írása egy alacsony készletű termékhez

Úgy dönt, hogy értesítenie kell a személyzet egyik tagját, ha egy termék készlete alacsony, és utánrendelést kell leadni. Létrehoz egy munkafolyamatot, amely az Készletmennyiség megváltozott kiváltóval indul, és beállít egy feltételt, amely akkor igaz, ha a korábbi készletmennyiség legfeljebb 10. A Belső e-mail küldése művelet Üzenet szakaszában a következő változókat használja.

Példa a változók használatára a tételadatok megadásához.
BemenetKimenet
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Kérjük, rendelje újra a High Waist Leggings – Black terméket. Írjon e-mailt a owner@example.com címre, hogy ellenőrizze, megkapták-e a beszerzési megrendelést.

Dinamikus e-mail-üzenet írása a személyzet értesítésére egy csalásgyanús rendelésről

Szeretné lemondani a magas kockázati szintű rendeléseket, de inkább azt szeretné, ha a személyzet manuálisan mondaná le a rendelést. Létrehoz egy munkafolyamatot, amely a Rendelés létrehozva kiváltóval indul, és beállít egy feltételt, amely akkor igaz, ha a rendelés kockázati szintje magas. A Belső e-mail küldése művelet Üzenet szakaszában a következő változókat használja.

Példa a változók használatára egy csalásgyanús rendelésről szóló információk megadásához.
BemenetKimenet
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!
Shopify-üzletünk magas csalási kockázatú rendelést kapott. Szeretnénk azonnal törölni ezt a rendelést, még mielőtt a gyártásba kerülne:

#1001
Dupont, Jeanne
jeanne@example.com

Kérjük, erősítse meg az új rendelési állapotot. Köszönjük!

Rendelés sorelemeinek kiírása for ciklussal

Rendelés beérkezésekor hasznos lehet egy olyan üzenetet küldeni, amely tartalmazza a megrendelt termékeket. Ezt egy for ciklus használatával teheti meg, amely ismételten végrehajt egy kódblokkot. A változókat támogató szövegmezők a for ciklusokat és a forloop objektumot is támogatják.

Tegyük fel például, hogy létre szeretne hozni egy munkafolyamatot, amely egy rendelés összes cikkszámának és mennyiségének listáját adja vissza. A Belső e-mail küldése művelet Üzenet szakaszában használja a következő változókat.

Példa a „for” ciklus használatára a rendelési adatok szolgáltatásához.
BemenetKimenet
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Rendelés összesítője:
8987097979 (50)
8877778887 (3)
888998898B (1)

A rendelés sorelemeinek megjelenítése egy „for” ciklus és további információk használatával

Úgy dönt, hogy további információkat ad hozzá az e-mailhez, beleértve a termék nevét, a cikkszámokat, a tételenkénti árat és a vásárló szállítási adatait. A Belső e-mail küldése művelet Üzenet szakaszában használja a következő változókat.

Példa a „for” ciklus használatára részletesebb rendelési adatok szolgáltatásához.
BemenetKimenet
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Rendelés összesítője:
Termék: Magas derekú leggings – fekete
SKU: 8987097979
Ár (egységenként): 8,49 USD
Mennyiség: 5
Termék: Sportzokni – kék
SKU: 888998898B
Ár (egységenként): 5,61 USD
Mennyiség: 2

Néhány sorelem megjelenítése egy „for” ciklus és egy „if” utasítás kombinálásával

Ha egy adott szállító által biztosított, eladott tételeket szeretne nyomon követni, akkor a Belső e-mail küldése művelet Üzenet szakaszában használja a következő változókat, és foglaljon bele egy if utasítást a for ciklusba.

Példa a „for” ciklus és az „if” utasítás használatára meghatározott szállítók rendelési adatainak szolgáltatásához.
BemenetKimenet
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme termék eladva:
Terméknév: Magas derekú leggings – fekete
SKU: 8987097979

Összetett adatobjektumok a Shopify Flow rendszerben

A Flow szinte minden, a GraphQL Admin API-ban elérhető adathoz hozzáférést biztosít. Ide tartoznak az összetett adatobjektumok is, például a listák és az objektumok. Ezen objektumok használatának azonban vannak korlátai. Ez a szakasz ezeket a korlátozásokat ismerteti, és példákat mutat be a használatukra.

A listák és objektumok közvetlen meghívása helyett fusson végig a listán egy ciklusban, és csak a kívánt mezőket vegye bele.

Például a {{ order.lineItems }} közvetlen meghívása helyett használja a következő formátumot az egyes mezők meghívásához. Ezek a példák tartalmazzák az összes olyan mezőt, amely a lista vagy az objektum közvetlen meghívása esetén szerepelne. Másolja ki és illessze be a szükséges mezőket.

Szöveg
{% 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 %}
]

}