Shopifyでは、ループ内での処理が多く、主に「1回のみ処理実行」に使われる「フラグ」の概念や活用シーンについて紹介します。
Shopifyの開発言語Liquidで、ECストア運営に必要な様々なカスタマイズができます。
Liqudiが持つ演算や処理を施す考え方は、他言語が持つそれと大きく違いはないと言われております。
今回は、他プログラミング言語の学習にもよく登場する「フラグ」の概念や活用シーンについて紹介します。
「フラグ(flag)」とは
プログラミングにおける「フラグ」は、もともと旗(flag)のように 特定の状態や条件を示す目印の役割を持つことから名前が来ています。
状態を記録し、処理を分岐する役割を持っており、いわば「記録係」として活用されております。
Shopifyでは、ループ内での「記録係」として主に「1回のみ処理実行」の場合によく使用されます。
「1回のみ実行」とは
「1回のみ実行」とは、ループ内で条件にあう要素があれば「1度だ処理を行う」という意味です。
要素が複数あっても、処理は1回のみ。たとえば、あるユーザーが「事務用品」というコレクションに属する、
・鉛筆
・ボールペン
・ハサミ
を1度に購入したとしましょう。
「事務用品」を購入したユーザーには、「事務用品の場合、受け取りまで3日以上かかる場合があります」という注意書きをしたい場合、ループ内で「その都度」処理をすると、条件と一致する要素が現れるたびに表示されるため、複数回にわたり表示されてしまいます。
フラグの使用により「事務用品」が1個でも、2個以上でも注意書きは1回だけ表示されるのです。
フラグの動きを簡単に説明すると、
・まず「OFF」と記されたフラグを立てる
・ループ内で「事務用品」要素が見つかったよ!→「OFF」フラグを「ON」フラグに変えよう!
・(要素がいくつ見つかっても)「ON」フラグだよね? じゃ、〇〇〇を1回実行しよう!
になります、
少しは分かりやすくなったのでしょうか。
要するに、条件にあう要素の数など気にする必要なく、今のフラグが「ONなの?OFFなの?」が重要です。
サンプルコード
では、実際のサンプルコードを見ていきましょう。
特定のタグを持つ商品
商品タグに「sale」が含まれている場合に、特定のメッセージを表示するサンプルコードです。
{% assign target_tag = 'sale' %}
{% assign has_sale_tag = false %} //まず「OFF」に
{% for tag in product.tags %}
{% if tag == target_tag %}
{% assign has_sale_tag = true %} //見つかったよ!「ON」に
{% endif %}
{% endfor %}
{% if has_sale_tag %} //「ON」の状態だったら
<p>この商品はセール中です!</p>
{% else %} //「OFF」の状態のままだったら
<p>この商品は通常価格です。</p>
{% endif %}
商品が特定のコレクションに属している
商品が特定のコレクションに属しているかを確認し、属していればメッセージを表示するサンプルコードです。
{% assign target_collection = '新商品' %}
{% assign is_in_collection = false %}
{% for collection in product.collections %}
{% if collection.title == target_collection %}
{% assign is_in_collection = true %}
{% endif %}
{% endfor %}
{% if is_in_collection %}
この商品は「{{ target_collection }}」コレクションに含まれています!
{% else %}
この商品は「{{ target_collection }}」コレクションには含まれていません。
{% endif %}
在庫の有無チェック
商品のバリアントに在庫があるかを確認し、在庫がある場合とない場合でメッセージを表示します。
{% assign in_stock = false %}
{% for variant in product.variants %}
{% if variant.inventory_quantity > 0 %}
{% assign in_stock = true %}
{% endif %}
{% endfor %}
{% if in_stock %}
<p>この商品は在庫があります!</p>
{% else %}
<p>この商品は在庫切れです。</p>
{% endif %}
タグを複数チェック
商品のタグがいずれかの特定の値に一致しているか確認し、タグが見つかった場合にメッセージを表示します。
{% assign target_tags = '限定,新作,おすすめ' | split: ',' %}
{% assign has_target_tag = false %}
{% for tag in product.tags %}
{% if target_tags contains tag %}
{% assign has_target_tag = true %}
{% endif %}
{% endfor %}
{% if has_target_tag %}
この商品は限定、新作、またはおすすめ商品です!
{% else %}
この商品は限定、新作、またはおすすめ商品ではありません。
{% endif %}
以上、実際のサンプルコードを4つ紹介しました。フラグの概念を理解するポイントは(繰り返しになりますが)「ルーオ内で条件にあう要素が1つでも、複数でも、フラグがONなのか、OFFなのかで1回のみ実行する」という事です。
ぜひ活用してみてください!