Skip to main content
MoEngage のテンプレート言語は、人気がありシンプルなテンプレート言語である Jinja をベースにしており、カスタマイズやパーソナライゼーションの要件を最大限にコントロールできます。
MoEngage は現在、Jinja バージョン 3.1 をサポートしています。

変数

変数は式にすることもでき、式を評価して新しい変数を生成します。二重波括弧で囲まれたものはすべて評価され、最終的なコンテンツに挿入されます。 多くの場合、変数は属性の集合です。MoEngage のメールテンプレートでは、これらの属性にドット演算子を使用してアクセスできます。 Jinja
または添字表記を使用します。 Jinja
変数を挿入するには、二重波括弧で囲みます。たとえば、FirstName というラベルのユーザー属性を挿入するには、次のようにします。 Jinja
たとえば、UserAttributes は現在のユーザーに属するすべての属性の集合です。属性 FirstName の値を挿入する場合は、次のコードを使用します。 Jinja
  • Jinja を使用する場合は、添字表記を使用することをお勧めします。
  • 使用する定義済み属性にスペースが含まれている場合は、添字表記を使用する必要があります。例: Welcome, {{UserAttribute['First Name']}}

式

MoEngage では、基本的な式をあらゆる場所で使用できます。式を使用すると、数学演算、論理演算、その他の演算を行うことで、他の変数や式から変数を作成できます。 式またはステートメントを使用するには、次のように囲みます。 Jinja

MoEngage のパーソナライゼーションオブジェクト

MoEngage には、動的データでテンプレートをパーソナライズするために使用できる特別なオブジェクトがいくつか用意されています。

Product Set

Product Set は、“Product Viewed” や “Added to Cart” などのユーザーのアクションに関連付けられた商品データの配列を指します。このデータをループ処理して、商品名、画像、価格、その他の属性を表示できます。

Recommendation

Recommendation を使用すると、特定のユーザー向けに生成された商品レコメンデーションにアクセスできます。これにより、ユーザーの行動や協調フィルタリングに基づいて動的に提案されるアイテムでキャンペーンをパーソナライズできます。

Auxiliary Data

Auxiliary Data を使用すると、キャンペーン送信時に、多くの場合 API トリガーを通じて、追加のコンテキストデータを渡すことができます。注文 ID、フライト番号、その他ユーザー属性やイベント属性として保存されていない情報などのトランザクションの詳細を含める場合に便利です。

Content API

Content API を使用すると、テンプレート内で外部 API からライブのリアルタイムデータを直接取得できます。スポーツのライブスコア、株価、天気情報、リアルタイムの在庫レベルなど、頻繁に変化する動的コンテンツを含める場合に強力です。 Product Set、Recommendation、Content API の使用方法を示す詳細なコード例と実践的なユースケースについては、Jinja のユースケースに関する記事を参照してください。

リテラル

リテラル は最もシンプルな形式の式です。リテラルは文字列や数値などの値を表します。次のリテラルがあります。

算術演算

MoEngage では値を使用した計算ができます。次の演算子がサポートされています。

比較

論理演算

if ステートメント、フィルタリング、if 式では、複数の式を組み合わせると便利な場合があります。

式のテスト

テストを使用すると、変数を一般的な式に対してテストできます。変数または式をテストするには、変数の後に is とテスト名を追加します。 たとえば、変数が定義されているかどうかを確認するには、“name is defined” とします。これにより、テンプレートの現在のコンテキストで name が定義されているかどうかに応じて true または false が返されます。 テストは引数を受け取ることもできます。テストが引数を 1 つだけ取る場合は、括弧を省略できます。たとえば、次の 2 つの式は同じ処理を行います。 Jinja
詳細については、Jinja Pallets を参照してください。

コメント

テンプレート内の行の一部をコメントアウトするには、コメント構文を使用します。デフォルトでは {# ... #} に設定されています。デバッグのためにテンプレートの一部をコメントアウトしたり、他のテンプレート作成者や自分自身のために情報を追加したりする場合に便利です。 Jinja

代入

コードブロック内では、変数に値を代入することもできます。トップレベル(ブロック、マクロ、ループの外側)での代入は、トップレベルのマクロと同様にテンプレートからエクスポートされ、他のテンプレートからインポートできます。 代入には set タグを使用し、複数のターゲットを指定できます。 Jinja

条件ステートメント、ループ

  • カスタム変数をループで使用することもできます。タグはテンプレートのロジックを制御し、条件ステートメント、ループ、マクロなどを実行できます。
ループのサンプル
条件のサンプル

エスケープ

MoEngage のパーソナライゼーショントークンは、メール HTML にエンコードせずに挿入してください。トークン、またはトークンを含む href を URL エンコードしないでください。URL エンコードを行うと、{{ 区切り文字が %7B%7B に、$ が %24 に置き換えられ、デコード時に Jinja が解析できない {{$ シーケンスになります。キャンペーンを保存または送信すると、次のようなエラーが発生する場合があります。Error in parsing jinja template format. Error unexpected char u'$' at ...リンクにパーソナライゼーショントークンが含まれる場合は、手動で URL エンコードした値を href に貼り付けるのではなく、エディターで提供されるトークンまたはマージタグを使用して挿入してください。
MoEngage に、通常は変数やブロックとして処理される部分を無視させることが望ましい(あるいは必要な)場合があります。たとえば、デフォルトの構文で {{ を変数の開始としてではなく、テンプレート内の生の文字列として使用したい場合は、工夫が必要です。 リテラルの変数区切り文字を出力する最も簡単な方法は Jinja
変数式を使用することです。 Jinja

HTML エスケープ

テンプレートから HTML を生成する場合、変数に生成される HTML に影響する文字が含まれるリスクが常にあります。 必要に応じて変数をエスケープするのはお客様の責任です。何をエスケープすべきでしょうか。次のいずれかの文字を含む可能性のある変数がある場合 Jinja
変数に整形式で信頼できる HTML が含まれている場合を除き、エスケープする必要があります。エスケープは、変数を次の Jinja
フィルターに_パイプ_することで行います。 Jinja
スタイル付きのメールまたはプッシュテンプレートでリッチ(Froala)エディターを使用して Jinja を記述する場合は、生の > / < 比較演算子を使用しないでください。リッチエディターはこれらを HTML エンコードするため、TemplateSyntaxError でテンプレートが壊れます。代わりに != を使用するか、カスタム HTML/ソースビューで Jinja を記述してください。詳細については、リッチエディターによる比較演算子のエンコードを参照してください。

制御構造

制御構造とは、プログラムのフローを制御するすべてのものを指します。
  • 条件分岐(つまり if/elif/else)
  • for ループ
  • マクロ と ブロック
デフォルトの構文では、制御構造は次の Jinja
ブロック内に記述します。

For

シーケンス内の各アイテムをループ処理します。たとえば、users という変数で提供されるユーザーのリストを表示するには、次のようにします。 HTML
for ループ内では、特別な cycle ヘルパーを使用して、ループのたびに文字列や変数のリストを順番に切り替えることができます。 Jinja
ループの外側で定義された変数はループ内から呼び出せますが、その逆はできません。
HTML テーブルの行を生成するためにループする場合、{% for %} ループは <tbody> 内の完全な <tr>...</tr> 行を囲む必要があります。個々のセルを囲むように <table> や <tbody> の直下に配置しないでください。ループタグを無効な位置に配置すると、テンプレートの保存時にメール HTML エディターによってタグが移動または削除され、テーブルの出力が壊れます。正しいパターンについては、Jinja を使用した動的テーブルを参照してください。

If

最もシンプルな形式では、変数が定義されているか、空でないか、false でないかをテストするために使用できます。 Jinja
複数の分岐には、elif と else も使用できます。 Jinja

デフォルト値の使用

MoEngage のメールテンプレートでは、メッセージに null 値が含まれている場合、そのメッセージは送信されません。そのため、このような状況を避けるためにデフォルトのフォールバック値を割り当てる必要があります。次の例では、ユーザーの所在地がない場合、このメッセージは送信されません。 Jinja
このような状況でもメッセージが送信されるようにするには、値が null の場合に変数が返すデフォルトの_フォールバック_値を指定する必要があります。MoEngage のメールテンプレートでは、属性が null を返す状況に対処するためのオプションを提供するオーバーレイポップアップウィンドウが表示されます。 5d92aaf1-31be-4708-ba15-6695728879c7.png 属性値がない場合にメッセージが送信されないようにするには、変数が null の場合のフォールバック値を Do not send に設定します。MoEngage のメールテンプレートでは、未送信メッセージを処理するためのオプションを含むオーバーレイポップアップウィンドウが表示されます。 Screenshot 2024-11-07 at 6.38.09 PM.png 選択したオプションは、返される値に基づいてメッセージを送信する際に自動的に使用されます。デフォルト値が指定されている場合、パーソナライズされたメッセージは次のようになります。 Jinja
または、次のように記述することもできます。 Jinja
属性の値が見つからない場合にメッセージを送信したくない場合は、次のように記述できます。 Jinja

カスタム JINJA エラーメッセージ

MOE_NOT_SEND タグを使用して、Jinja テンプレートでカスタムエラーメッセージを定義できます。この機能により、ユーザーに対するコンテンツのパーソナライゼーションまたは配信条件が失敗した場合に、明確な理由を指定できます。 キャンペーンの Analytics ページの Error breakdown セクションでは、MoEngage はコンテンツのパーソナライゼーションが失敗したすべてのユーザーを追跡します。定義したカスタムエラーメッセージと、キャンペーンのセグメンテーションに基づいてその特定のエラーをトリガーしたユーザー数がここに表示されます。

例 1:

この例では、ユーザーの brand 属性が Puma かどうかを確認します。brand 属性が一致しない場合、カスタムエラーメッセージが生成されます。 Jinja
定義された条件に基づき、brand 属性が Puma でない場合、カスタムエラー Brand name doesn’t exist for user が Analytics ページの Error breakdown セクションに表示されます。 image (4).png

例 2:

この例では、条件ロジックを使用して名と姓が存在するかどうかを確認します。失敗のシナリオごとに異なるエラーメッセージを提供します。 Jinja
例 2 には次のシナリオがあります。
  • 成功: 名と姓の両方が存在する場合、コンテンツが送信されます。
  • シナリオ 1: 姓がない場合、Last Name doesn’t exist for user エラーが表示されます。
  • シナリオ 2: 名がない場合、First Name doesn’t exist for user エラーが表示されます。
  • シナリオ 3: 名と姓の両方がない場合、Both First Name and Last Name doesn’t exist for user エラーが表示されます。
image (5).png このコードでは、ユーザーの名、姓、またはその両方がない場合、対応するカスタムエラー(たとえば “Last Name doesn’t exist for user”)が Analytics ページのエラー内訳セクションに表示されます。

Jinja フィルター(関数)

Jinja でサポートされているグローバル関数の一部を次に示します。

文字列フィルター

プロパーケース/タイトルケースへの変換 文字列をタイトルケースに変換できます。例: 入力: joHn doE 出力: John Doe Jinja

先頭文字を大文字にする

文字列内の各文の先頭文字を大文字にできます。例: 入力: joHn doE. his age is 20. 出力: John doe. His age is 20. Jinja

大文字

文字列を大文字に変換できます。例: 入力: joHn doE 出力: JOHN DOE Jinja

小文字

文字列を小文字に変換できます。例: 入力: JoHn doE 出力: john doe Jinja

文字列の置換

文字列の一部を別の文字列に置き換えることができます。たとえば、joHn の “jo” を “ma” に置き換えてみましょう。 入力: joHn doE 出力: mahn doe Jinja

文字列に部分文字列が含まれているかどうかの確認

文字列に部分文字列が含まれているかどうかを確認できます。例: 入力文字列: Click on me now! 入力部分文字列: now 出力: true block Jinja

数値フィルター

+91 の追加

携帯電話番号に “+91” を追加できます。例: 入力: 9991119991 出力: +919991119991 Jinja

10 桁を考慮する

携帯電話番号の 10 桁のみを考慮できます。例: 入力: +919991119991 出力: 9991119991 Jinja

整数フィルター

データのビット長

符号と先頭のゼロを除き、整数を 2 進数で表すのに必要なビット数を返します。 Jinja

複素数の共役

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

浮動小数点数フィルター

浮動小数点数が有限の整数かどうかの判定

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

16 進数文字列

16 進数文字列で表された浮動小数点数を返します。文字列の先頭と末尾に空白が含まれていても構いません。 Jinja

複素数の共役

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

リストフィルター

アイテムの出現回数

リスト内の指定されたアイテムの出現回数を返します。 Jinja

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

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

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

リスト内のインデックス位置にあるアイテムを返し、リストからそのアイテムを削除します。インデックスが指定されていない場合は、リストの最後のアイテムを返して削除します。インデックスがリスト内にない場合、list.pop() はエラーをスローします。 Jinja
MoEngage は現在、Jinja のその他すべての標準関数をサポートしています。Jinja の標準関数の詳細については、List of Global Functions を参照してください。

カスタム関数

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

Date Formatter - 指定された日付を toFormat で指定された形式に変換します。
出力: 10/14/2020 Date Difference - 2 つの日付の差を返します。戻り値は正、ゼロ、または負になります。
出力: 2 Today Function - 指定された形式とタイムゾーンで現在の日付を返します。
出力: 05/23/2024 Date and Time Formatter Function - 日時のフォーマット - 指定された日付を指定の形式に変換します。
出力: 2012-01-19 05:21:00 PM タイムゾーンの変換 - 日時をそれぞれのタイムゾーンで表示し、定義された分数を時刻に加算します。
出力: 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)'])}}
  • timeZone メソッドと tzOffset メソッドの両方を使用した場合、順序に関係なく tzOffset が優先されます。tzOffset の値が利用できない場合、または -1000 の場合は、timeZone メソッドが使用されます。
一般的な日時フォーマットコード 上記の toFormat および関連パラメーターでは、標準の strftime 形式のフォーマットコードを使用します。最もよく使用されるコードを以下に示します。完全なリストについては、Python’s strftime and strptime format codes を参照してください。

取り消し線テキスト

テキストに取り消し線を付けることができます。たとえば、商品の旧価格を取り消し線付きで表示したい場合に使用します。 入力: Price USD 100 出力: Price USD 100 Jinja

コンテンツのブレーク

アイテムのリストをループ処理し、ループの実行を正確に制御できます。continue を使用すると、完全には処理したくない特定のアイテムをスキップでき、break を使用すると、特定の条件が満たされた時点でループ全体を途中で停止できます。 たとえば、ホームページに最近の記事を表示する場合、continue で “draft” の記事をスキップし、break で最初の “featured” 記事の後にリストを停止することで、ページが長くなりすぎるのを防ぐことができます。 Jinja
入力
出力
  • “stop_value” が検出されると、{% break %} ステートメントによってループが停止し、“cherry” と “date” は処理されません。
  • “continue_value” が検出されると、{% continue %} ステートメントによって、その反復におけるループブロック内の残りのコードの実行がスキップされます。

暗号化と復号

SHA 256 暗号化

Jinja は、次の 2 つの方法で SHA 256 暗号化をサポートするようになりました。 シークレットキーを使用した SHA256 - シークレットキーを使用して SHA256 で文字列を暗号化します
シークレットキーを使用しない SHA256 - SHA256 で文字列を暗号化します

Base64 エンコード

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

Base64 デコード

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

URL エンコード

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

URL デコード

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

その他の演算子

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