2012-03-17 42 views
12

Tôi có đơn giản hóa mẫu thiết lập sau:Chơi 2.0 truy cập để yêu cầu trong các mẫu

  • Main (template)
    • Trang chủ
    • Chi tiết

Bây giờ khi một người dùng đăng nhập, thuộc tính phiên username được đặt để tôi có thể tìm nếu người dùng đăng nhập hay không. Để giúp tôi để tìm ra nếu người dùng đang đăng nhập hay không, tôi có đối tượng session helper sau:

object SessionHelper { 
    val sessionKey = "username" 

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

nào tôi có thể sử dụng trong một mẫu mà phải mất một đối tượng implicit yêu cầu, ví dụ:

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

kể từ — như xa như tôi có thể nói — đây là cách duy nhất để có được một tiềm ẩn biến trong một khuôn mẫu, nó có nghĩa là ở khắp mọi nơi tôi làm cho một cái nhìn, tôi cần phải rõ ràng "xác định" theo yêu cầu tiềm ẩn biến. Ví dụ:

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

Nếu không có tuyên bố implicit request => thì không biên dịch. Bây giờ trong khi điều này hơi khó xử, miễn là tôi ở trong bất kỳ "khung nhìn phụ" nào (ví dụ: Trang chủ hoặc Chi tiết) thì tốt vì mỗi lần xem tôi có một phương thức điều khiển và cũng như truy cập vào các ẩn số RequestHeader ví dụ. Tuy nhiên, khi tôi cần truy cập vào phiên trong mẫu của tôi (ví dụ: Chính), điều này không hoạt động vì nó không bao giờ được hiển thị một cách rõ ràng bởi bộ điều khiển.

Tôi không thấy ngay cách truy cập phiên trong mẫu và Google nhanh chóng không tiết lộ nhiều hơn một vài câu hỏi về cùng một chủ đề mà không có giải pháp. Bất kỳ ý tưởng?

Cập nhật: có vẻ như điều này có phần liên quan đến this question.

Trả lời

8

Không có cách nào khác để chuyển yêu cầu ẩn xung quanh tất cả các mẫu của bạn, ít nhất là không phải của Play Framework 2.0.

Liên kết bạn thêm trong bản cập nhật là di chuyển nhiều dữ liệu hơn xung quanh các mẫu trong chỉ 1 đối tượng, nhưng bạn vẫn cần khai báo tham số ngầm ở mọi nơi.

2

Tôi nhận thấy một điều thú vị: trong ứng dụng Java Play 2.1.0 của tôi, tôi có thể sử dụng các đối tượng ngầm được liệt kê trong Play 1.2.5 documentation, trong khi chúng không được ghi lại ở tất cả trong trò chơi 2! Có lẽ nó là một cái gì đó giống như sửa chữa tương thích ngược không có giấy tờ. Dù sao, tôi có thể làm điều này:

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

và điều này:

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

Như bạn thấy, tôi có thể sử dụng requestflash biến mà không cần định nghĩa chúng. IntelliJ của tôi liên tục làm nổi bật nó như là lỗi, nhưng nó vẫn biên dịch và hoạt động. Vì vậy, có vẻ như một vài phiên bản sau 2.0 họ đã giải quyết vấn đề này.

+2

Với Play 2.3.x, tôi nhận được "không tìm thấy: Yêu cầu giá trị". – Wrench

+0

@Wrench: Nhìn vào câu trả lời của kaka, anh ấy đưa ra một lời giải thích. Tóm lại: bạn có thể có sẵn một số nội dung ẩn. Đào vào lớp học đó –

2

Nếu bạn đang sử dụng Play cho Java, bạn có thể làm điều gì đó này:

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

Chỉ cần bỏ qua các lỗi trong ide của bạn, nó biên dịch và chạy tốt.

Phương pháp requestHeader đã nhập khẩu tự động bởi lớp play.TemplateImports:

javaImports.add("play.core.j.PlayMagicForJava._"); 
Các vấn đề liên quan