2012-03-17 60 views
12

我有以下簡單的模板設置:播放2.0訪問模板要求

  • 主(模板)
    • 首頁
    • 詳細信息現在

當用戶登錄,設置會話屬性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)時,這不起作用,因爲它永遠不會由控制器明確呈現。

我沒有立即看到一種方式來獲得一個模板訪問會話,並快速谷歌沒有透露比沒有解決同一主題的幾個問題多等。有任何想法嗎?

更新:似乎這與this question有點相關。

回答

8

沒有替代繞過所有的模板隱式的要求,至少不會像遊戲框架2.0。

您在更新添加的鏈接是隻有1對象走動模板的詳細數據,但你仍然需要無處不在聲明隱含參數。

2

我注意到了一件有趣的事情:在我的Java Play 2.1.0應用程序中,我可以使用在Play 1.2.5 documentation中列出的隱式對象,但它們在第二次播放中根本沒有記錄!可能它就像是無證的向後兼容性修復程序。無論如何,我可以做到這一點:

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

這:

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

正如你所看到的,我可以用requestflash變量沒有定義它們。我的IntelliJ不斷強調它爲錯誤,但無論如何編譯和工作。所以它看起來像2.0之後的幾個版本,他們解決了這個問題。

+2

隨着播放2.3.x版本,我得到 「未找到:價值訴求」。 – Wrench 2015-01-06 19:50:18

+0

@Wrench:看看卡卡的回答,他提供了一個解釋。 總之:你可以有一些隱式的可用。挖掘到這個類 – 2016-08-22 14:38:23

2

如果您在使用播放for Java中,你可以做一些這樣的:

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

簡單地忽略這個錯誤在你的IDE,它編譯並運行良好。

requestHeader方法是進口自動play.TemplateImports類:

javaImports.add("play.core.j.PlayMagicForJava._");