2016-06-30 9 views
0

Ich verwende Play und ich habe eine einfache EmailService-Klasse, die einige Objekte in einer Play-Vorlage rendert. Hier ist mein Code:Ist es möglich, ein Play! Vorlage als Variable?

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

Ich frage mich, ob es möglich ist, in dem acceptedEmail passiert Vorlage als Variablenwert, so dass die Vorlage ich anwenden könnte dynamisch auf Basis ändern, was Wert war ich Übergabe an die EmailService (Java) -Klasse, von der dieser Code stammt.

Ich bin ziemlich neu zu Scala Templating so Entschuldigungen, wenn die Frage ein wenig da draußen ist oder wenn mehr Informationen benötigt werden.

aktualisieren

Dies ist letztlich, wie ich diesen Code Arbeit haben möchten:

String template = object.getTemplateName(); 

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

Offensichtlich ohne Anführungszeichen, aber hoffentlich fangen Sie meine Drift.

Antwort

1

Soweit mir bekannt ist, ist dies nicht (ganz) möglich wie Play! kompiliert alle Vorlagen, die als statische (Scala) Objekte unter dem views.html.* Paket/Namespace verfügbar sein sollen. Sie können möglicherweise erreichen, was Sie wollen, indem Sie die Refection-API von Java verwenden, aber um ehrlich zu sein, glaube ich nicht, dass es die Zeit wert wäre und es möglicherweise unbekannte Probleme mit dem Klassenobjekt gibt, das Scala schließlich erzeugt, wenn es kompiliert wird.

Ich vermute, dass die Anzahl der Vorlagen, die Sie Rendern müssen, definitiv begrenzt sein wird (da sie kompiliert werden müssen und zur Laufzeit nicht hinzugefügt werden können), ist Ihre sicherste Wette, nur Ihren Zustand ausführlich zu überprüfen und dann die entsprechende Vorlage also wählen:

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) 
..... 

oder man könnte es auf Ansichtsebene tun:

//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) 
} 

auf jeden Fall ist dies keine triviale Sache mit Spiel Vorlagen zu erreichen, so können Sie habe mehr Glück mit einer anderen Template-Bibliothek seit diesem i s nur für E-Mails (Vielleicht Handlebars Java?).

+0

Danke. Dies scheint zu bestätigen, was ich seit dem Posten der Frage gelernt habe. – daniel9x

0

Ja, Sie können. Das Templating in Play verwendet die Vorlagenquelldatei, um eine äquivalente Scala-Klasse zu generieren. Wenn Sie ein Objekt dieser Klasse mit den Parametern, die Sie für die Vorlage deklariert haben, an die Render-Engine übergeben, wird der Text gerendert.

+0

Danke für die Antwort. Könnten Sie mir vielleicht ein Beispiel dafür geben, das aussehen könnte? Mir ist besonders unklar, wie ein Objekt zur Laufzeit an die Render-Engine übergeben wird. – daniel9x

+0

In Ihrem Beispiel sieht 'views.html.acceptedEmal' so aus, als ob es ein Play-Vorlagenobjekt wäre, daher verwenden Sie diese Funktion bereits. –

+0

Meine Frage wurde aktualisiert, um die Herausforderung, vor der ich stehe, zu klären. – daniel9x

Verwandte Themen