2016-06-30 7 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) 클래스로 전달됩니다.

질문이 조금 밖에 있거나 추가 정보가 필요한 경우 사과를 템플릿으로 작성하는 데 상당히 익숙합니다.

업데이트

이 내가 코드가 작동하도록 할 방법을 궁극적 : 따옴표없이 분명히

String template = object.getTemplateName(); 

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

을, 그러나 희망 당신은 내 드리프트를 잡을 수있어.

답변

1

내가 아는 한, 이것이 Play로서 (완전히) 가능하지 않습니다! views.html.* 패키지/네임 스페이스 아래에서 정적 (스칼라) 객체로 사용할 수 있도록 모든 템플릿을 컴파일합니다. 자바의 Refection API를 사용하여 원하는 것을 얻을 수는 있지만 솔직히 말해서 가치가 있다고 생각하지 않으며 스칼라가 컴파일 할 때 클래스 객체에 알려지지 않은 문제가있을 수 있습니다.

렌더링해야 할 템플릿의 수가 확실히 한정적 일 것입니다. (컴파일해야하고 런타임에 추가 할 수 없으므로) 가장 안전한 방법은 상태를 자세히 확인하는 것입니다. 다음 적절한 템플릿 즉 선택 :

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