Play 2.0 доступ к запросу в шаблонах - PullRequest
12 голосов
/ 17 марта 2012

У меня есть следующие упрощенные настройки шаблона:

  • Main (шаблон)
    • Домашняя страница
    • Подробности

Теперь, когда пользователь входит в систему, атрибут сеанса username устанавливается так, чтобы я мог выяснить, вошел ли пользователь в систему или нет.Чтобы помочь мне выяснить, вошел ли пользователь в систему или нет, у меня есть следующий вспомогательный объект сеанса:

object SessionHelper {
  val sessionKey = "username"

  def authenticated(implicit request: RequestHeader) = {
    request.session.get(sessionKey).exists(_ => true)
  }
}

, который я могу использовать в шаблоне, который принимает объект запроса implicit,например:

(implicit request: play.api.mvc.RequestHeader)
...
@if(SessionHelper.authenticated) {
    <strong>Authenticated!</strong>
}
...

Поскольку - насколько я могу судить - это единственный способ получить неявную переменную в шаблоне, это означает, что везде, где я отображаю представление,Мне нужно явно "определить" неявную переменную запроса.Например:

def index = Action { implicit request =>
  Ok(views.html.index(myStuff))
}

Без оператора implicit request => он не компилируется.Теперь, хотя это немного неловко, пока я остаюсь в любом из «подвидов» (например, «Домашняя страница» или «Подробности»), это хорошо, потому что для каждого из этих представлений у меня есть метод контроллера и, следовательно, также доступ к неявному RequestHeader экземпляр.Тем не менее, когда мне нужно получить доступ к сеансу в моем шаблоне (например, Main), это не работает, потому что он никогда явно не отображается контроллером.

Я не сразу вижу способ получить доступк сеансу в шаблоне, и быстрый Google не раскрывает ничего, кроме пары вопросов по той же теме без разрешения.Есть идеи?

Обновление: похоже, это как-то связано с этим вопросом .

Ответы [ 3 ]

8 голосов
/ 18 марта 2012

Нет альтернативы передаче неявного запроса по всем вашим шаблонам, по крайней мере, в Play Framework 2.0.

Ссылка, которую вы добавляете в обновлении, состоит в том, чтобы перемещать больше данных по шаблонам только в 1 объекте, но вам все равно нужно объявлять неявный параметр везде.

2 голосов
/ 18 августа 2015

Если вы используете Play for Java, вы можете сделать что-то такое:

<li @if(requestHeader.uri == routes.Help.index.url){class="active"}>

Просто игнорируйте ошибку в вашем ide, он компилируется и работает хорошо.

Метод requestHeader был автоматически импортирован классом play.TemplateImports:

javaImports.add("play.core.j.PlayMagicForJava._");
2 голосов
/ 13 мая 2013

Я заметил интересную вещь: в моем приложении Java Play 2.1.0 я могу использовать неявные объекты, перечисленные в документации Play 1.2.5 , хотя они вообще не документированы в игре 2!Вероятно, это что-то вроде недокументированного исправления обратной совместимости.В любом случае, я могу сделать это:

<li @if(request.uri == routes.Help.index.url){class="active"}>

и это:

@for( (key, message) <- flash) { ... }

Как видите, я могу использовать переменные request и flash без их определения.Мой IntelliJ постоянно выделяет это как ошибку, но он все равно компилируется и работает.Похоже, что после версии 2.0 они решили эту проблему несколькими версиями.

...