LoginSignup
2
2

More than 5 years have passed since last update.

Handlebars.javaで再利用するテンプレートの変数を基底クラスで解決

Last updated at Posted at 2016-01-08

きっかけ

メール本文のテンプレートで、署名の部分もテンプレートにしていたが、署名と本文のそれぞれを変数解決させるという形にしてしまったので、署名テンプレートの解決を何度も呼び出すことに…

冷静に考えると、テンプレート内で他のテンプレートを呼び出す(テンプレートの再利用)機能が、たいがいにテンプレートエンジンにあるはずなので、それを使う形に修正してみた

使っているのはHandlebars.java です。

やり方

main.hbsとsign.hbsの二つのテンプレートがあって、signの部分を、テンプレートを解決するためのDTOを基底クラスに持たせるという作戦です。

main.hbs

{{user.name}} 様

{{greeting}}

{{item.name}} が {{item.rate}} % 割引中です。

{{> sign}} // これでsign.hbsを呼び出し

sign.hbs

株式会社 XXX

担当: {{contact.name}}

連絡先アドレス:{{contact.email}} 

テンプレート用DTOの基底クラス

まずは署名の部分を解決できるように基底クラスを作ります

BaseTemplateDto.java

public abstract class BaseTemplateDto {

   public final Contact contact

   BaseTemplateDto(Contact contact) {
     this.contact = contact;
   }

}

テンプレート用DTO

次に、mail.hbsの変数を解決するためのDTOを、上記を継承して作成します。

MainTemplateDto.java

public class MainTemplateDto extends BaseTemplateDto {

   public final User user;

   public final String greeting;

   public final Item item;

   MainTemplateDto(User user, String greeting, Item item, Contact contact) {
        // 基底クラスが持つ担当者情報をそのコンストラクタに渡す 
        super(contact);
        /* 中略 */
   }

}

あとはこのインスタンスをテンプレートの変数解決のメソッドに渡してやればOKです。
テンプレートの変数解決の詳細はこちら

結果はこんな感じになります。

ユーザ1 様

こんにちは

商品A が 10 % 割引中です。

株式会社 XXX

担当: 〇田△

連絡先アドレス:sample@example.com

定型文しかないフッターなどであれば、テンプレートにそれをべた書きして、それを呼び出すという形ももちろんできます。(公式サイトの例がもろにそれです。)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2