Jinjaテンプレート言語

MoEngageテンプレート言語は、カスタマイズとパーソナライズの要件を最高度にコントロールできる、人気でシンプルなテンプレート言語であるJinjaに基づいています。 ents.

info

注意

MoEngageは現在、Jinjaバージョン3.1をサポートしています。

変数

変数は式であることもあり、新しい変数を評価します。二重括弧内のすべてのものは評価され、最終コンテンツに挿入されます。

変数はしばしば属性の集まりです。MoEngageのメールテンプレートでは、これらの属性にドット演算子を使用してアクセスできます。

Jinja
.

または下付き文字表記で:

Jinja
[]

変数を挿入するには、 それらを二重中括弧で囲みます。 それらを二重中括弧で囲みます。 たとえば、 F irstName というラベルのユーザー属性を挿入するには:

Jinja
{{UserAttribute['First Name']}}

例えば、 U serAttributes は現在のユーザーに属するすべての属性のコレクションです。属性 F の値を挿入したい場合は irstName 、次のコードを使用します:

Jinja
ようこそ、{{UserAttribute['First Name']}}

情報

注記

  • Jinjaを使用する際は、添え字表記を使用することをお勧めします。
  • 使用している定義済みの属性にスペースが含まれている場合は、下付き文字表記を使用する必要があります。例えば:
    ようこそ、{{UserAttribute['First Name']}}

表現

MoEngageは、基本的な式をどこでもサポートしています。式は、数学的、論理的、その他の操作を行うことによって、他の変数や式から変数を作成するために使用できます。

式またはステートメントを使用するには、次のように囲みます:

Jinja
{% %}

リテラル

リテラルは最も単純な形式の式です。リテラルは文字列や数値などの変数を表します。以下のリテラルが存在します。

文字通り 説明
「こんにちは世界」 二重引用符または単一引用符で囲まれたすべてのものは文字列です。テンプレートで文字列が必要なときに役立ちます(例:関数呼び出しやフィルターへの引数として、またはテンプレートを拡張または含めるために使用します)。
42 / 42.23 整数と浮動小数点数は、単に数字を書くだけで作成されます。ドットがある場合、数値は浮動小数点数であり、そうでない場合は整数です。42と42.0は異なることに注意してください(それぞれintとfloatです)。
オブジェクトのリスト

二つの角括弧の間にあるものはすべてリストです。リストは、順序付けられたデータを格納して反復処理するのに便利です。例えば、forループを使用してリストやタプルを使ってリンクのリストを簡単に作成できます:

    {% for href, caption in [ ('index.html', 'Index'), ('about.html', 'About'), ('downloads.html', 'Downloads') ] %}
  • {{ caption }}
  • {% endfor %}
{'dictionary': 'of', 'key':
'and', 'value': 'pairs'}

辞書はキーと値を組み合わせます。キーは一意であり、常に正確に1つの値を持たなければなりません。辞書はめったに作成されませんが、他のソースからデータを読み取るときに使用されます。

真/偽

真実は常に真実であり、偽りは常に偽りです。

数学

MoEngageは、値を使用して計算することができます。以下の演算子がサポートされています。

オペレーター

説明

2つのオブジェクトを加算します。通常、オブジェクトは数値ですが、両方が文字列またはリストの場合、この方法で連結することができます。

最初の数から2番目の数を引きます。{{ 3 - 2 }} は1です。

/

2つの数字を割ります。戻り値は浮動小数点数になります。{{ 1 / 2 }}は{{ 0.5 }}です。

%

整数除算の余りを計算します。{{ 11 % 7 }}は4です。

*

左オペランドに右オペランドを掛けます。{{ 2 * 2 }} は 4 を返します。

比較

オペレーター

説明

==

2つのオブジェクトを比較して等しいかどうかを確認します。

!=

2つのオブジェクトを比較して不等であるかを確認します。

>

左辺が右辺より大きい場合は真。

>=

左辺が右辺以上であれば真。

<

左辺が右辺より小さい場合は真です。

<=

左辺が右辺以下の場合は真です。

ロジック

if文、フィルタリング、 if 式の場合、複数の式を組み合わせることが有用です: 式を組み合わせることは、有用な場合があります:

オペレーター 説明
and 左オペランドと右オペランドの両方が真の場合に真を返します。
or

左オペランドまたは右オペランドが true の場合に true を返します。また、デフォルト値を処理するためにも使用できます。例えば、次のコードはユーザーの名前が存在すればそれを返し、存在しなければユーザーのメールアドレスを返します。

{{ UserAttribute.name or UserAttribute.email }
ない ステートメントを否定する
(expr) 式をグループ化する。

表現テスト

テストは、変数を一般的な式に対してテストするために使用できます。変数や式をテストするには、追加してください。 です そして変数の後にテストの名前を付けます。

たとえば、変数が定義されているかどうかを確認するには、「 name is defined 、テンプレートの現在のコンテキストで名前が定義されているかどうかに応じて、trueまたはfalseを返します。

テストは引数を受け取ることもできます。テストが1つの引数しか取らない場合、括弧を省略することができます。例えば、次の2つの式は同じことを行います:

Jinja
{% if loop.index is divisibleby 3 %}
{% if loop.index is divisibleby(3) %}

詳細については、 Jinja Pallets を参照してください。

コメント

テンプレート内の行の一部をコメントアウトするには、デフォルトで設定されているコメント構文を使用します。 {# ... #} これは、デバッグのためにテンプレートの一部をコメントアウトしたり、他のテンプレートデザイナーや自分自身のために情報を追加したりするのに役立ちます。

Jinja
{% # note: commented-out template because we no longer use this
   {% for user in users %}
       ...
   {% endfor %}
# %}

課題

コードブロック内では、変数に値を割り当てることもできます。トップレベル(ブロック、マクロ、ループの外側)での割り当ては、トップレベルのマクロのようにテンプレートからエクスポートされ、他のテンプレートによってインポートされることができます。

課題はセットタグを使用し、複数のターゲットを持つことができます。

Jinja
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
{% set key, value = call_something() %}

条件文、ループ

  • ループと一緒にカスタム変数を使うこともできます。タグはテンプレートのロジックを制御し、条件文、ループ、マクロなどを実行することができます。
    サンプルループ
    {% set products = [{‘name’: ‘Nike’, ‘href’: 'https://www.example.com/nike'}, {‘name’: ‘Adidas’, ‘href’: 'https://www.example.com/adidas'}] %}
    {% for product in products %}
    <li><a href="{{ product.href }}">{{ product.name }}</a></li> {% endfor %}

サンプル条件

{% if products %}

製品は空ではありません。


{% else %}

製品は空です。


{% endif %}

エスケープ

MoEngage が変数やブロックとして処理する部分を無視することが、時には望ましい(さらには必要な)場合があります。例えば、デフォルトの構文で使用したい場合、 {{ テンプレート内で生の文字列として使用し、変数を開始しないためには、トリックを使用する必要があります。

リテラル変数デリミタを出力する最も簡単な方法

Jinja
{{

は変数式を使用することによってです:

Jinja
{{ '{{' }}

HTMLエスケープ

テンプレートからHTMLを生成する際、変数により結果のHTMLに影響を与える文字が含まれるリスクがあります。

必要に応じて変数をエスケープするのは あなたの 責任です。何をエスケープするべきですか?次の文字のいずれかを含む可能性のある変数がある場合 必要に応じて変数をエスケープする責任があります。何をエスケープしますか?次の文字が含まれる可能性のある変数がある場合

Jinja
>, <, &, or "

あなた 必須 変数が適切に形成された信頼できるHTMLを含んでいない限り、それをエスケープします。エスケープは、変数を パイプ処理 することによって機能します。

Jinja
|e

フィルター:

Jinja
{{UserAttribute['First Name']|e}}

制御構造

制御構造とは、プログラムの流れを制御するすべての要素を指します。

  • 条件文(つまり、 if/elif/else
  • for -ループ
  • マクロ ブロック

デフォルトの構文では、制御構造が内部に表示されます

Jinja
{% ... %}

ブロック。

ために

シーケンス内の各項目をループします。例えば、usersという変数に提供されたユーザーのリストを表示するには:

HTML
<h1>Members</h1>
<ul>
{% for user in users %}
 <li>{{ user.username|e }}</li>
{% endfor %}
</ul>

for ループ内では、特別なものを使用することにより、ループを通過するたびに文字列や変数のリストを循環させることが可能です。 サイクル ヘルパー

Jinja
{% for row in rows %}
   <li class="{% cycle('odd', 'even') %}">{{ row }}</li>
{% endfor %}

ループの外で定義された変数はループ内で呼び出すことができますが、その逆はできません。

もし

最も簡単な形では、変数が定義されているか、空でないか、または偽でないかをテストするために使用できます。

Jinja
{% if UserAttribute.interests %}
Your interests:
<ul>
{% for interest in UserAttribute.interests %}
   <li>{{ interest|e }}</li>
{% endfor %}
</ul>
{% endif %}

複数の支店の場合、 elif そして 他の も使用できます:

Jinja
{% if UserAttribute.membership == 'Gold' %}
You are a Gold member!
{% elif UserAttribute.membership == 'Silver' %}
You are a Silver member!
{% else %}
Please become a member today!
{% endif %}

デフォルト値を使用する

MoEngage のメールテンプレートでは、メッセージに null 値が含まれている場合、送信されません。そのため、このような状況を避けるためにデフォルトのフォールバック値を割り当てる必要があります。 この例では、ユーザーの位置情報がない場合、このメッセージは送信されません:

Jinja
{{UserAttribute['Location']}}へようこそ

そのような状況でメッセージが送信されるようにするために、値がnullの場合に変数によって返されるデフォルトの フォールバック 値を提供する必要があります。MoEngageのメールテンプレートは、属性がnullを返す状況を処理するためのオプションを提供するオーバーレイポップアップウィンドウを表示します。

5d92aaf1-31be-4708-ba15-6695728879c7.png

属性値が欠落している場合にメッセージが送信されないようにするには、変数がnullの場合、フォールバック値を 送信しない に設定します。MoEngageのメールテンプレートは、未送信メッセージを処理するオプションを備えたオーバーレイポップアップウィンドウを表示します。

Screenshot 2024-11-07 at 6.38.09 PM.png

選択されたオプションは、返された値に基づいてメッセージを送信する際に自動的に使用されます。デフォルト値が提供されている場合、パーソナライズされたメッセージは次のようになります。

Jinja
ようこそ、{{UserAttribute['First name']|default('Guest')}}

あるいは、私たちはまた使用することができます

神社
{% set firstName = UserAttribute['First name'] %}
 {% if firstName %}
   Welcome, {{ firstName }}
 {% else %}
   Welcome!
{% endif %}

メッセージを送信したくない場合、または属性の値が見つからない場合は、

Jinja
ようこそ、{{UserAttribute['First name']|default('MOE_NOT_SEND')}}

Jinja Filters (Functions)

以下は、Jinjaがサポートするいくつかのグローバル関数です:

文字列フィルター

適切なケース/タイトルケースに変換

これにより、文字列をタイトルケースに変換できます。例えば:

ジョン・ドウ

John Doe

Jinja
{{UserAttribute['FirstName']|title}}

最初の文字を大文字にする

これにより、文字列内の各文の最初の文字を大文字にすることができます。例えば:

ジョン・ドウ彼の年齢は20歳です。

ジョン・ドウ。彼の年齢は20歳です。

Jinja
{{UserAttribute['FirstName']|capitalize}}

UPPER CASE

これにより、文字列を大文字に変換できます。例えば:

joHn doE

JOHN DOE

Jinja
{{UserAttribute['FirstName']|upper}}

小文字

これにより、文字列を小文字に変換できます。例えば:

JoHn doE

john doe

Jinja
{{UserAttribute['FirstName']|lower}}

文字列を置き換える

これにより、文字列の一部を別の文字列に置き換えることができます。例えば、joHnの「jo」を「ma」に置き換えてみましょう:

joHn doE

mahn doe

神社
{{UserAttribute['Mobile Number']|replace(“jo”,”ma”)}}

文字列にサブ文字列が含まれているかどうかを確認する

これにより、文字列がサブ文字列を含んでいるかどうかを確認できます。例えば:

今すぐクリックしてください!

出力: true block

Jinja
{% if "true" in UserAttribute['eligible'] %}
true block
{% elif "false" in UserAttribute['eligible'] %}
false block
{% endif %}

数値フィルター

Add +91

これにより、携帯番号に「+91」を追加する部分を置き換えることができます。例えば:

9991119991

+919991119991

Jinja
{{“+91” + UserAttribute['Mobile Number']|default('NA')}}

10桁を考慮する

これにより、携帯電話番号の10桁のみを考慮することができます。例えば:

+919991119991

9991119991

Jinja
{{UserAttribute['Mobile Number'][-10:]|default('NA')}}

整数フィルター

データのビット長

符号と先行ゼロを除いて、整数を2進数で表現するのに必要なビット数を返します。

Jinja
int.bit_length()

複素数の共役

複素数の共役を返します。複素数はサポートされていないため、int.conjugate() は数自体を返します。

Jinja
int.conjugate()

フロートフィルター

浮動小数点が有限整数かどうかを識別する

浮動小数点インスタンスが有限で整数値の場合はTrueを返し、それ以外の場合はFalseを返します。

Jinja
<span">float.is_integer()</span">

16進文字列

16進数文字列で表された浮動小数点数を返します。文字列には前後に空白が含まれている場合があります。

Jinja
float.fromhex(string)

複素数の共役

複素数の共役を返します。複素数はサポートされていないため、float.conjugate() はその数自体を返します。

Jinja
float.conjugate()

フィルターをリスト

アイテムの出現回数

リスト内の指定された項目の出現回数を返します。

Jinja
list.count(item)

リスト内の最小インデックス

指定された項目がスライス s[start:end] 内で見つかるリストの最小インデックスを返します。オプションの引数 start と end はスライス表記として解釈されます。str.index() に似ています。
list.index() は、インデックスがリスト内にない場合にエラーをスローします。

Jinja
list.index(item[, start[, end]])

リスト内のインデックス位置のアイテムを削除

リスト内のインデックス位置にあるアイテムを返し、リストから削除します。インデックスが指定されていない場合、リストの最後の項目を返して削除します。list.pop() は、インデックスがリスト内にない場合にエラーをスローします。

Jinja
list.pop([index])

情報

情報

MoEngageは現在、Jinjaの他のすべての標準機能をサポートしています。Jinjaの標準関数について詳しく知りたい場合は、 グローバル関数のリスト を参照してください。

カスタム関数

日付時間関数とフォーマッタ

Date Formatter - 任意の日付をtoFormatで指定された形式に変換します。

使用法
{{'14/10/2020'|dateFormatter('%m/%d/%Y')}}

出力: 2020年10月14日

日付の差 - 2つの日付の差を返します。戻り値は正、ゼロ、または負になることがあります。

使用
{{'12/10/2020'|days('14/10/2020')}}

出力:2

今日の関数 - 指定された形式とタイムゾーンで現在の日付を返します。

使用法(ESTタイムゾーンのMM/DD/YYYYの場合)
{{'%m/%d/%Y'|today('EST')}}

出力: 2024年5月23日

日付と時刻のフォーマッタ関数 -

  • 日付と時刻のフォーマット - 指定された形式に任意の日付を変換します。
方法:
dateTimeFormatter(toFormat='%Y-%m-%d %H:%M:%S %p')

使用
{{ "2012-01-19 17:21:00 CST" |dateTimeFormatter(toFormat='%Y-%m-%d %H:%M:%S %p')}}

2012-01-19 05:21:00 PM

  • タイムゾーン変換 - 指定されたタイムゾーンで日付と時刻を表示し、指定された分数を時刻に追加します。
方法:
dateTimeFormatter(tzOffset=-330)
dateTimeFormatter(timeZone='Asia/Kolkata')

使用
{{ "2012-01-19 17:21:00 CST" |dateTimeFormatter(tzOffset=-330)}}
{{ "2012-01-19 17:21:00 CST" |dateTimeFormatter(timeZone='Asia/Kolkata')}}

出力:

2012-01-19 11:51:00 AM
2012-01-19 22:51:00 PM

情報

注記

  • dateTimeFormatterフィルター内では、複数のメソッドを使用できます。たとえば、特定の形式とユーザーのタイムゾーンでユーザー属性を表示するには、次のコードを使用できます。 {{UserAttribute['First Seen']|dateTimeFormatter(toFormat='%Y-%m-%d %H:%M', timeZone='Asia/Kolkata',tzOffset=UserAttribute['User Time Zone Offset (Mins)'])}}
  • タイムゾーンメソッドとtzOffsetメソッドの両方が使用されている場合、順序に関係なくtzOffsetが優先されます。tzOffsetの値が利用できないか-1000の場合、timeZoneメソッドが使用されます。

詳細については、次を参照してください: https://strftime.org/

取り消し線のテキスト

これにより、テキストに取り消し線を引くことができます。例えば、商品の古い価格を取り消し線で表示したい場合。

入力 : 価格 USD 100

出力 : 価格 USD 100

Jinja
価格 USD <s>{{100}}</s>

コンテンツの中断

これにより、アイテムのリストをループし、ループの実行を正確に制御できます。特定のアイテムを完全に処理したくない場合は continue を使用してスキップすることができ、特定の条件が満たされた場合には 壊すを使用してループ全体を途中で停止することができます。

例えば、ホームページに最近の記事を表示するために、`continue`は「ドラフト」記事をスキップし、`break`は最初の「特集」記事の後でリストを停止することで、ページが長くなりすぎるのを防ぐことができます。

Jinja

 {% for item in my_list %}
    BEFORE: {{ item }}

    {% if item == continue_condition %}
        SKIPPING (simulating continue)
        {% continue %}
    {% endif %}
    
    {% if item == stop_condition %}
        BREAKING
        {% break %}
    {% endif %}
    
    AFTER: {{ item }}
{% endfor %}
  
入力
 {
  "my_list": [
    "apple",
    "continue_value",
    "banana",
    "stop_value",
    "cherry",
    "date"
  ],
  "continue_condition": "continue_value",
  "stop_condition": "stop_value"
}
出力
    BEFORE: apple
    AFTER: apple
    BEFORE: continue_value
    SKIPPING (simulating continue)
    BEFORE: banana
    AFTER: banana
    BEFORE: stop_value
    BREAKING
  • "stop_value"に遭遇したとき、{% break %}ステートメントはループを停止し、「cherry」と「date」は処理されません。
  • 「continue_value」が見つかった場合、{% continue %} ステートメントは、その特定の反復のループブロック内でコード実行の残りをスキップします。

暗号化と復号化

SHA 256暗号化

Jinjaは現在、2つの方法でSHA 256暗号化をサポートしています。

秘密鍵を用いたSHA256 - 秘密鍵を用いて文字列をSHA256で暗号化します

使用 ( ここで6ABC89W3XY9Wは秘密鍵です )
{{UserEmail|convertToSHA256('6ABC89P3FXYW')}}


MoEngageでユーザーのメールIDをSHA256で暗号化したいとします。
{%set UserEmail=UserAttribute['Email']%}{{UserEmail|convertToSHA256('6ABC89P3FXYW')}}

シークレットキーなしのSHA256 - 文字列をSHA256で暗号化します

使用
{{UserEmail|convertToSHA256NoSalt()}}



{%set UserEmail=UserAttribute['Email']%}{{UserEmail|convertToSHA256NoSalt()}}

Base64エンコーディング

文字列をBase64エンコーディングを使用して暗号化します。

使用
{{UserEmail|base64encode}}

Base64デコード

文字列をBase64デコードを使用して暗号化します。

使用
{{UserEmail|base64decode}}

URLエンコーディング

文字列をURLエンコーディングで暗号化します。

使用
{{UserEmail|urlencode}}

URLデコード

文字列をURLデコードを使用して暗号化します。

使用
{{UserEmail|urldecode}}

その他のオペレーター

次の演算子は非常に便利ですが、他の2つのカテゴリには当てはまりません。

オペレーター 説明
シーケンス/マッピング包含テストを実行します。左オペランドが右に含まれている場合は true を返します。{{ 1 in [1, 2, 3] }}は、例えば、trueを返します。
式のテストを実行します。

この記事は役に立ちましたか?
24人中12人がこの記事が役に立ったと言っています

How can we improve this article?