演算子と式評価

Last updated:
HubLでは、テンプレートのロジックと機能を拡張するための主な演算子と式評価をサポートしています。演算子を使用すると、算術関数の実行、比較、テンプレートロジックの複雑化、マークアップのレンダリングの変更を行うことができます。この記事では、HubLで使用できる式評価も含めて紹介します。

演算子

演算子は、HubLコンパイラーに対して各種の演算を行うよう指示する記号です。これらの演算の結果、マークアップが出力されます。以下に、サポートされる全てのHubL演算子を示します。

算術演算

標準の算術演算子を使用して、テンプレートのコンテキストで値を計算できます。

記号 説明
+ 2つのオブジェクト同士を加算します。これは通常、数値の加算に使用します。リストの文字列を連結する場合は、代わりに~を使用します。
- ある数値を別の数値から減算します。
/ 数値を除算します。
% 数値を除算した余りを返します。
// 2つの数値を除算した余りを整数に切り捨てて返します。例:{{ 20 // 7 }}2です。
* 数値を乗算します。
** 左辺のオペランドを右辺のオペランドで累乗します。
{% set my_num = 11 %} {% set my_number = 2 %} {{ my_num + my_number }}<br/> <!-- 11 + 2 = 13 --> {{ my_num - my_number }}<br/> <!-- 11 - 2 = 9 --> {{ my_num / my_number }}<br/> <!-- 11 / 2 = 5.5 --> {{ my_num % my_number }}<br/> <!-- 11 % 2 = 1 --> {{ my_num // my_number }}<br/> <!-- 11 // 2 = 5 --> {{ my_num * my_number }}<br/> <!-- 11 * 2 = 22 --> {{ my_num ** my_number }}<br/> <!-- 11 ** 2 = 121 -->13 9 5.5 1 5 22 121

比較

比較演算子を使用すると、テンプレートロジックに対して値を評価できます。このリンク先のif文で、比較演算子の使用例を確認できます。 

記号 短縮形 説明
== eq 次の値に等しい。2つのオブジェクトが等しい場合、trueと評価されます。
!= ne 次の値に等しくない。2つのオブジェクトが等しくない場合、trueと評価されます。
> gt 次の値より大きい。左辺の値が右辺の値よりも大きい場合、trueと評価されます。
>= gte 次の値以上。左辺の値が右辺の値と同じかそれよりも大きい場合、trueと評価されます。
< lt 次の値より小さい。左辺の値が右辺の値よりも小さい場合、trueと評価されます。
<= lte 次の値以下。左辺の値が右辺の値と同じかそれよりも小さい場合、trueと評価されます。

短縮形の比較演算子は、|selectattr()などの式を評価するフィルターで使用できます。

{% set my_num = 11 %} {% set my_number = 2 %} {{ my_num == my_number }}<br/> <!-- false --> {{ my_num != my_number }}<br/> <!-- true --> {{ my_num > my_number }}<br/> <!-- true --> {{ my_num >= my_number }}<br/> <!-- true --> {{ my_num < my_number }}<br/> <!-- false --> {{ my_num <= my_number }}<br/> <!-- false -->false true true true false false

論理

論理演算子を使用すると、複数の式を1つのステートメント(文)として結合できます。

記号 説明
and 左辺のオペランドと右辺のオペランドの両方がtrueと評価される場合、trueを返します。
or 左辺のオペランドまたは右辺のオペランドのいずれかがtrueと評価される場合、trueを返します。
not ステートメントの否定に、isと併せて使用します。後述の例を参照してください。
(expr) 演算順を示すために、式をグループ化します。例:(10 - 2) * 変数
?: 3項演算子には3つの引数(式、true条件、false条件)があります。式を評価し、該当した条件を返します。

その他のHubL演算子

以下に、さまざまなタスクを実行するために使用できる、その他の重要なHubL演算子を示します。

記号 説明
in 値がシーケンス内に含まれているかどうかをチェックします。
is 式評価を実行します。
| フィルターを適用します。
~ 値を連結します。

式評価

式評価は、論理演算子を使用して評価できる各種のブール条件です。

boolean

boolean式評価は、オブジェクトがブール値かどうかを確認します(厳密なチェックであり、truthy式の評価ではありません)。

{% set isActive = false %} {% if isActive is boolean %} isActive is a boolean {% endif %}isActive is a boolean

containing

containing式評価では、変数のリストに値が含まれているかどうかをチェックします。

{% set numbers = [1, 2, 3] %} {% if numbers is containing 2 %} Set contains 2! {% endif %}Set contains 2!

containingall

containingall式評価では、変数のリストに別のリストの全ての値が含まれているかどうかをチェックします。

{% set numbers = [1, 2, 3] %} {% if numbers is containingall [2, 3] %} Set contains 2 and 3! {% endif %} {% if numbers is containingall [2, 4] %} Set contains 2 and 4! {% endif %}Set contains 2 and 3!

defined

defined式評価では、変数がテンプレートのコンテキスト内で定義済みかどうかをチェックします。演算子を使わずにif文を記述してこの式評価を使用することもできますが、その場合は既定で、変数が定義されているかどうかだけがチェックされます。

以下の例では、カラーモジュールのcolorパラメーターが評価されます。colorパラメーターに値がない場合、既定背景色の黒がテンプレートによってレンダリングされます。値が定義されている場合、ユーザーが設定した背景色がテンプレートによってレンダリングされます。

{% color "my_color" color="#930101", export_to_template_context=True %} <style> {% if widget_data.my_color.color is defined %} body{ background: {{ widget_data.my_color.color }}; } {% else %} body{ background: #000; } {% endif %} </style><style> body{ background: #930101; } </style>

divisibleby

divisibleby式評価を使用すると、オブジェクトを別の数値で割り切れるかどうかを評価できます。

例えば、以下のforループは、動物の種類のリストを反復処理するために作成されています。動物の各種類がdiv内に出力され、5つ目ごとのdivに異なるインラインスタイルが適用されます(幅:100%)。このコンセプトをブログに適用すると、特定のパターンの記事に別のマークアップをレンダリングできます。forループとloop.indexの詳細については、こちらの記事を参照してください。 

{% set animals = ["lions", "tigers", "bears", "dogs", "sharks"] %} {% for animal in animals %} {% if loop.index is divisibleby 5 %} <div style="width:100%">{{animal}}</div> {% else %} <div style="width:25%">{{animal}}</div> {% endif %} {% endfor %}<div style="width:25%">lions</div> <div style="width:25%">tigers</div> <div style="width:25%">bears</div> <div style="width:25%">dogs</div> <div style="width:100%">sharks</div>

equalto

equalto式評価では、変数の値が定数または別の変数の値と等しいかどうかをチェックします。これと同じ評価は、==演算子を使用して行うこともできます。

以下の例では、ループ内の記事の合計数に応じてブログ記事の幅を調整します。この出力例では、ブログに4件の記事があると仮定しています。 

{% for content in contents %} {% if loop.length is equalto 2 %} <div style="width:50%;">Post content</div> {% elif loop.length is equalto 3 %} <div style="width:33.333332%;">Post content</div> {% elif loop.length is equalto 4 %} <div style="width:25%;">Post content</div> {% else %} <div style="width:100%;>Post content</div> {% endif %} {% endfor %}<div style="width:25%;">Post content</div> <div style="width:25%;">Post content</div> <div style="width:25%;">Post content</div> <div style="width:25%;">Post content</div>

even

even式評価では、数値型変数の値が偶数かどうかをチェックします。 

以下の例は、ブログ一覧の単純なループを示しています。この例では、ループの現在の反復数(イテレーション)が偶数の場合、その記事項目のdivにeven-postクラスを割り当てます。それ以外の場合は、odd-postクラスを割り当てます。 

{% for content in contents %} {% if loop.index is even %} <div class="post-item even-post">Post content</div> {% else %} <div class="post-item odd-post">Post content</div> {% endif %} {% endfor %} <div class="post-item odd-post">Post content</div> <div class="post-item even-post">Post content</div> <div class="post-item odd-post">Post content</div> <div class="post-item even-post">Post content</div>

float

float式評価では、数値型変数の値が浮動小数点数かどうかをチェックします。 

{% set quantity = 1.20 %} {% if quantity is float %} quantity is a floating point number {% endif %}quantity is a floating-point number

integer

変数が整数かどうかをチェックします。

{% set quantity = 120 %} {% if quantity is integer %} quantity is an integer {% endif %}quantity is an integer

iterable

変数が反復可能であり、ループ処理を適用できるかどうかをチェックします。

以下の例では、「jobs」という変数が反復可能かどうかをチェックします 。この変数にジョブのリストが格納されている場合、if文がtrueと評価されて、ループが実行されます。変数に1つの値しか格納されていない場合は、if文により、別のマークアップを使用してその値が出力されます。ループの詳細については、こちらを参照してください。 

{% set jobs = ["Accountant", "Developer", "Manager", "Marketing", "Support"] %} {% if jobs is iterable %} <h3>Available positions</h3> <ul> {% for job in jobs %} <li>{{ job }}</li> {% endfor %} </ul> {% else %} <h3>Available position</h3> <div class="single-position">{{ jobs }}</div> {% endif %}<h3>Available positions</h3> <ul> <li>Accountant</li> <li>Developer</li> <li>Manager</li> <li>Marketing</li> <li>Support</li> </ul>

lower

lower式評価は、文字列が小文字の場合にtrueと評価されます。 

以下の例では、unless文と小文字フィルターを使用して、テキストモジュールに入力されるテキストの文字列が常に小文字になるようにしています。

{% module "my_text" path="@hubspot/text" label="Enter text", value="Some TEXT that should be Lowercase", export_to_template_context=True %} {% unless widget_data.my_text.value is lower %} {{ widget_data.my_text.value|lower }} {% endunless %}some text that should be lowercase

mapping

mapping式評価では、オブジェクトがディクショナリー(辞書型)かどうかをチェックします。 

以下の例では、contactオブジェクトが辞書型かどうかをチェックしています。この例の場合、オブジェクトは辞書型に該当します。 

{% if contact is mapping %} This object is a dictionary. {% else %} This object is not a dictionary. {% endif %}This object is a dictionary.

none

none式評価では、変数にnull値が格納されているかどうかをチェックします。

{% module "user_email" path="@hubspot/text" label="Enter user email", value="example@hubspot.com", export_to_template_context=True %} {% unless widget_data.user_email.value is none %} {{ widget_data.user_email.value }} {% endunless %}example@hubspot.com

number

number式評価では、変数の値が数値かどうかをチェックします。

以下の例では、変数をチェックして、数かどうかを調べ、数の場合は百万に変換します。

{% set my_var = 40 %} {% if my_var is number %} {{ my_var * 1000000 }} {% else %} my_var is not a number. {% endif %}40000000

odd

odd式評価では、数値型変数の値が奇数かどうかをチェックします。

以下の例は、前述のeven式評価の例の逆バージョンです。

{% for content in contents %} {% if loop.index is odd %} <div class="post-item odd-post">Post content</div> {% else %} <div class="post-item even-post">Post content</div> {% endif %} {% endfor %} <div class="post-item odd-post">Post content</div> <div class="post-item even-post">Post content</div> <div class="post-item odd-post">Post content</div> <div class="post-item even-post">Post content</div>

sameas

sameas式評価では、2つの変数の値が同じかどうかをチェックします。 

以下の例では、2つの変数を設定してから、これらの変数の値が同じかどうかをチェックします。

{% set var_one = True %} {% set var_two = True %} {% if var_one is sameas var_two %} The variables values are the same. {% else %} The variables values are different. {% endif %}The variables values are the same.

sequence

sequence式評価は、変数がシーケンスかどうかをチェックするという点でiterable式評価と似ています。  

以下の例では、変数がシーケンスかどうかをチェックしてから、音楽ジャンルのシーケンスを反復処理します。

{% set genres = ["Pop", "Rock", "Disco", "Funk", "Folk", "Metal", "Jazz", "Country", "Hip-Hop", "Classical", "Soul", "Electronica" ] %} {% if genres is sequence %} <h3>Favorite genres</h3> <ul> {% for genre in genres %} <li>{{ genre }}</li> {% endfor %} </ul> {% else %} <h3>Favorite genre:</h3> <div class="single-genre">{{ genres }}</div> {% endif %}<ul> <li>Pop</li> <li>Rock</li> <li>Disco</li> <li>Funk</li> <li>Folk</li> <li>Metal</li> <li>Jazz</li> <li>Country</li> <li>Hip-Hop</li> <li>Classical</li> <li>Soul</li> <li>Electronica</li> </ul>

string

string式評価では、変数の値が文字列かどうかをチェックします。 

以下の例では、変数をチェックして、それが文字列かどうかを調べます、文字列の場合はタイトルフィルターを適用して大文字に変更します。 

{% set my_var = "title of section" %} {% if my_var is string %} {{ my_var|title }} {% else %} my_var is not a string {% endif %}Title Of Section

string_containing

この評価では、文字列が別の文字列に含まれているかどうかをチェックします。この式評価は「is」演算子と組み合わせて使用します。
{% if content.domain is string_containing ".es" %} Markup that will only render on content hosted on .es domains {% elif content.domain is string_containing ".jp" %} Markup that will only render on content hosted on .jp domains {% else %} Markup that will render on all other domains {% endif %}Markup that will render on all other domains

string_startingwith

この式評価では、文字列が特定の文字列で始まるかどうかをチェックします。「is」演算子と組み合わせて使用します。

{% if content.slug is string_startingwith "es/" %} Markup that will only render on content hosted in a /es/ subdirectory {% elif content.slug is string_startingwith "jp/" %} Markup that will only render on content hosted in a /jp/ subdirectory {% else %} Markup that will render on all subdirectories {% endif %}Markup that will render on all subdirectories

truthy

truthy式評価では、式がtrueと評価されるかどうかをチェックします。

以下の例では、ブール値チェックボックスモジュールを使用してアラートメッセージを表示します。

{% boolean "check_box" label="Show alert", value=True, export_to_template_context=True %} {% if widget_data.check_box.value is truthy %} <div class="alert">Danger!</div> {% endif %}<div class='alert'>Danger!</div>

undefined

undefined式評価では、テンプレートのコンテキスト内で変数が未定義かどうかをチェックします。この評価はnone式評価とは異なります。undefined式評価でtrueが返されるのは、変数が存在しても値が格納されていない場合です。一方、none式評価では変数にnull値が格納されている場合にtrueが返されます。  

以下の例では、テンプレートで変数「my_var」の有無をチェックします。

{% if my_var is undefined %} A variable named "my_var" does not exist on this template. {% else %} {{ my_var }} {% endif %}A variable named "my_var" does not exist on this template.

upper

upper式評価は、文字列が大文字の場合にtrueと評価されます。以下の例は、前述のlower式評価の例の逆バージョンです。

{% module "my_text" path="@hubspot/text" label="Enter text", value="Some TEXT that should be Uppercase", export_to_template_context=True %} {% unless widget_data.my_text.value is upper %} {{ widget_data.my_text.value|upper }} {% endunless %}SOME TEXT THAT SHOULD BE UPPERCASE

within

within式評価では、変数がリスト内にあるかどうかをチェックします。
{% set numbers = [1, 2, 3] %} {% if 2 is within numbers %} 2 is in the list! {% endif %} {% if 4 is within numbers %} 4 is in the list! {% endif %}2 is in the list!

参考になりましたか?
こちらのフォームではドキュメントに関するご意見をご提供ください。HubSpotがご提供しているヘルプはこちらでご確認ください。