Можно ли пройти в 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);

Понятно, что без кавычек, но, надеюсь, вы меня уловили.


person daniel9x    schedule 30.06.2016    source источник


Ответы (2)


Насколько мне известно, это (полностью) невозможно в Play! компилирует все шаблоны, чтобы они были доступны как статические (Scala) объекты в views.html.* пакете/пространстве имен. Вы можете достичь того, чего хотите, используя 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?).

person jsonmurphy    schedule 30.06.2016
comment
Спасибо. Кажется, это подтверждает то, что я смог узнать с момента публикации вопроса. - person daniel9x; 01.07.2016

Да, ты можешь. Шаблоны в Play используют исходный файл шаблона для создания эквивалентного класса scala. Передача объекта этого класса механизму рендеринга с параметрами, которые вы объявили для шаблона, приводит к рендерингу текста.

person Bob Dalgleish    schedule 30.06.2016
comment
Спасибо за ответ. Не могли бы вы предоставить мне пример того, как это может выглядеть? Мне особенно неясно, как передать объект движку рендеринга во время выполнения. - person daniel9x; 30.06.2016
comment
В вашем примере views.html.acceptedEmal выглядит так, как будто это объект шаблона Play, поэтому вы уже используете эту возможность. - person Bob Dalgleish; 30.06.2016
comment
Обновлен мой вопрос, чтобы, надеюсь, прояснить проблему, с которой я столкнулся. - person daniel9x; 30.06.2016