MoEngage は現在、Jinja バージョン 3.1 をサポートしています。
変数
変数は式にすることもでき、式を評価して新しい変数を生成します。二重波括弧で囲まれたものはすべて評価され、最終的なコンテンツに挿入されます。 多くの場合、変数は属性の集合です。MoEngage のメールテンプレートでは、これらの属性にドット演算子を使用してアクセスできます。 Jinja- Jinja を使用する場合は、添字表記を使用することをお勧めします。
- 使用する定義済み属性にスペースが含まれている場合は、添字表記を使用する必要があります。例:
Welcome, {{UserAttribute['First Name']}}
式
MoEngage では、基本的な式をあらゆる場所で使用できます。式を使用すると、数学演算、論理演算、その他の演算を行うことで、他の変数や式から変数を作成できます。 式またはステートメントを使用するには、次のように囲みます。 JinjaMoEngage のパーソナライゼーションオブジェクト
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
代入
コードブロック内では、変数に値を代入することもできます。トップレベル(ブロック、マクロ、ループの外側)での代入は、トップレベルのマクロと同様にテンプレートからエクスポートされ、他のテンプレートからインポートできます。 代入には set タグを使用し、複数のターゲットを指定できます。 Jinja条件ステートメント、ループ
- カスタム変数をループで使用することもできます。タグはテンプレートのロジックを制御し、条件ステートメント、ループ、マクロなどを実行できます。
エスケープ
MoEngage に、通常は変数やブロックとして処理される部分を無視させることが望ましい(あるいは必要な)場合があります。たとえば、デフォルトの構文で{{ を変数の開始としてではなく、テンプレート内の生の文字列として使用したい場合は、工夫が必要です。
リテラルの変数区切り文字を出力する最も簡単な方法は
Jinja
HTML エスケープ
テンプレートから HTML を生成する場合、変数に生成される HTML に影響する文字が含まれるリスクが常にあります。 必要に応じて変数をエスケープするのはお客様の責任です。何をエスケープすべきでしょうか。次のいずれかの文字を含む可能性のある変数がある場合 Jinjaスタイル付きのメールまたはプッシュテンプレートでリッチ(Froala)エディターを使用して Jinja を記述する場合は、生の
> / < 比較演算子を使用しないでください。リッチエディターはこれらを HTML エンコードするため、TemplateSyntaxError でテンプレートが壊れます。代わりに != を使用するか、カスタム HTML/ソースビューで Jinja を記述してください。詳細については、リッチエディターによる比較演算子のエンコードを参照してください。制御構造
制御構造とは、プログラムのフローを制御するすべてのものを指します。- 条件分岐(つまり if/elif/else)
- for ループ
- マクロ と ブロック
For
シーケンス内の各アイテムをループ処理します。たとえば、users という変数で提供されるユーザーのリストを表示するには、次のようにします。 HTMLHTML テーブルの行を生成するためにループする場合、
{% for %} ループは <tbody> 内の完全な <tr>...</tr> 行を囲む必要があります。個々のセルを囲むように <table> や <tbody> の直下に配置しないでください。ループタグを無効な位置に配置すると、テンプレートの保存時にメール HTML エディターによってタグが移動または削除され、テーブルの出力が壊れます。正しいパターンについては、Jinja を使用した動的テーブルを参照してください。If
最もシンプルな形式では、変数が定義されているか、空でないか、false でないかをテストするために使用できます。 Jinjaデフォルト値の使用
MoEngage のメールテンプレートでは、メッセージに null 値が含まれている場合、そのメッセージは送信されません。そのため、このような状況を避けるためにデフォルトのフォールバック値を割り当てる必要があります。次の例では、ユーザーの所在地がない場合、このメッセージは送信されません。 Jinja

カスタム JINJA エラーメッセージ
MOE_NOT_SEND タグを使用して、Jinja テンプレートでカスタムエラーメッセージを定義できます。この機能により、ユーザーに対するコンテンツのパーソナライゼーションまたは配信条件が失敗した場合に、明確な理由を指定できます。
キャンペーンの Analytics ページの Error breakdown セクションでは、MoEngage はコンテンツのパーソナライゼーションが失敗したすべてのユーザーを追跡します。定義したカスタムエラーメッセージと、キャンペーンのセグメンテーションに基づいてその特定のエラーをトリガーしたユーザー数がここに表示されます。
例 1:
この例では、ユーザーの brand 属性が Puma かどうかを確認します。brand 属性が一致しない場合、カスタムエラーメッセージが生成されます。 Jinja
例 2:
この例では、条件ロジックを使用して名と姓が存在するかどうかを確認します。失敗のシナリオごとに異なるエラーメッセージを提供します。 Jinja- 成功: 名と姓の両方が存在する場合、コンテンツが送信されます。
- シナリオ 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 エラーが表示されます。

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 Jinja10 桁を考慮する
携帯電話番号の 10 桁のみを考慮できます。例: 入力: +919991119991 出力: 9991119991 Jinja整数フィルター
データのビット長
符号と先頭のゼロを除き、整数を 2 進数で表すのに必要なビット数を返します。 Jinja複素数の共役
複素数の共役を返します。複素数はサポートされていないため、int.conjugate() は数値そのものを返します。 Jinja浮動小数点数フィルター
浮動小数点数が有限の整数かどうかの判定
浮動小数点数インスタンスが整数値を持つ有限値の場合は True を、それ以外の場合は False を返します。 Jinja16 進数文字列
16 進数文字列で表された浮動小数点数を返します。文字列の先頭と末尾に空白が含まれていても構いません。 Jinja複素数の共役
複素数の共役を返します。複素数はサポートされていないため、float.conjugate() は数値そのものを返します。 Jinjaリストフィルター
アイテムの出現回数
リスト内の指定されたアイテムの出現回数を返します。 Jinjaリスト内の最小インデックス
スライス s[start:end] 内で指定されたアイテムが見つかった、リスト内の最小インデックスを返します。オプションの引数 start と end は、スライス表記と同様に解釈されます。str.index() と同様です。 インデックスがリスト内にない場合、list.index() はエラーをスローします。 Jinjaリスト内のインデックス位置にあるアイテムの削除
リスト内のインデックス位置にあるアイテムを返し、リストからそのアイテムを削除します。インデックスが指定されていない場合は、リストの最後のアイテムを返して削除します。インデックスがリスト内にない場合、list.pop() はエラーをスローします。 JinjaMoEngage は現在、Jinja のその他すべての標準関数をサポートしています。Jinja の標準関数の詳細については、List of Global Functions を参照してください。
カスタム関数
日時関数とフォーマッター
Date Formatter - 指定された日付を toFormat で指定された形式に変換します。- 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コンテンツのブレーク
アイテムのリストをループ処理し、ループの実行を正確に制御できます。continue を使用すると、完全には処理したくない特定のアイテムをスキップでき、break を使用すると、特定の条件が満たされた時点でループ全体を途中で停止できます。 たとえば、ホームページに最近の記事を表示する場合、continue で “draft” の記事をスキップし、break で最初の “featured” 記事の後にリストを停止することで、ページが長くなりすぎるのを防ぐことができます。
Jinja
- “stop_value” が検出されると、
{% break %}ステートメントによってループが停止し、“cherry” と “date” は処理されません。 - “continue_value” が検出されると、
{% continue %}ステートメントによって、その反復におけるループブロック内の残りのコードの実行がスキップされます。