2016-06-30 15 views
0

私はPlayを使用していますが、Playテンプレートのオブジェクトをレンダリングする簡単なEmailServiceクラスがあります。ここに私のコードは次のとおりです。Playで渡すことは可能ですか?変数としてのテンプレート?

Content html = views.html.acceptedEmail.render(incomingBlob,relatedBlob,rule); 
     email = new Email().setFrom("[email protected]") 
      .setTo(rule.getSuccessEmailValues()) 
      .setSubject(rule.getFailureNotificationSubject()) 
      .setBodyHtml(html.toString()); 

それは私が適用していますテンプレートは、私が何であったか値に基づいて動的に変更することができるように、変数の値としてacceptedEmailテンプレートを渡すことが可能です場合、私は思ったんだけどこのコードは、EmailService(Java)クラスに渡されます。

質問が多少ある場合や追加情報が必要な場合は、私はScalaテンプレート作成のためにかなり新しいです。

更新

これは私がこのコードの動作持っているしたいのですがどのように最終的にです:引用符なしで明らかに

String template = object.getTemplateName(); 

Content html = views.html."template".render(incomingBlob,relatedBlob,rule); 

を、うまくいけば、あなたが私のドリフトをキャッチ。

答えて

1

私が知っている限り、これはPlayとして(完全に)可能ではありません!パッケージ/名前空間views.html.*の静的(Scala)オブジェクトとして使用できるようにすべてのテンプレートをコンパイルします。あなたはJavaのRefection APIを使用してあなたが望むものを達成することができるかもしれませんが、正に私はそれが時間の価値があるとは思わないし、Scalaがコンパイルされたときに最終的に生成するクラスオブジェクトには未知の問題があるかもしれません。

レンダリングする必要があるテンプレートの数は、(コンパイルして実行時に追加することができないため)有限であると思われるので、最も安全なのは、あなたの状態を冗長にチェックすることですその後、適切なテンプレートつまり選択:

Content content; 
if(template == "acceptedEmail") 
    content = views.html.acceptedEmail.render(incomingBlob,relatedBlob,rule) 
else if (template == "somethingElse") 
    content = views.html.somethingElse.render(incomingBlob,relatedBlob,rule) 
..... 

をしたり、ビューレベルでそれを行うことができます:

//controller 
Content content = views.html.mainView.render(template,incomingBlob,relatedBlob,rule); 

//view - mainView.scala.html 
@(template: String, incomingBlob: ?,relatedBlob: ?,rule: ?)) 

@if(template == "acceptedEmail") { 
    @acceptedEmail(incomingBlob, relatedBlob, rule) 
} 

いずれにせよ、これはあなたがかもしれないので、遊びのテンプレートを達成するために、些細なことではありませんこれは別のテンプレートライブラリを使用してより良い運を持っている(電子メールの場合はHandlebars Java?)。

+0

ありがとうございます。これは質問を投稿してから私が何を学ぶことができたかを確認するようです。 – daniel9x

0

はい、できます。 Playのテンプレートは、テンプレートのソースファイルを使用して、同等のスカラクラスを生成します。テンプレートに対して宣言したパラメータを使用して、そのクラスのオブジェクトをレンダリングエンジンに渡すと、テキストがレンダリングされます。

+0

お返事ありがとうございます。あなたは私のように見えるかもしれない例を私に提供することができますか?私は実行時にオブジェクトをレンダリングエンジンに渡す方法について特に不明です。 – daniel9x

+0

あなたの例では、 'views.html.acceptedEmal'はPlayテンプレートオブジェクトのように見えるので、すでにこの機能を使用しています。 –

+0

私が直面している課題を明確にするために私の質問を更新しました。 – daniel9x

関連する問題