2012-03-17 19 views
12

aşağıdaki basitleştirilmiş şablon kurulum var: şablonları istemek için 2.0 Play erişimiyle

Şimdi

  • Ana (şablon)
    • Anasayfa
    • Detaylar zaman kullanıcı oturum açtığında, username oturum özniteliğini belirleyebileceğim şekilde ayarlandı Bir kullanıcı giriş yapmış veya etmediyse. Bir kullanıcı oturum veya eğer beni anlamaya yardımcı olmak için değil, ben şu oturumu yardımcı nesnesi vardır:

      object SessionHelper { 
          val sessionKey = "username" 
      
          def authenticated(implicit request: RequestHeader) = { 
          request.session.get(sessionKey).exists(_ => true) 
          } 
      } 
      

      Ben örneğin bir implicit istek nesnesi götüren bir şablonda kullanabilirsiniz:

      bildiğim kadarıyla bu bir şablonda bir örtülü değişkeni almak için tek yoldur — söyleyebilirim — yana
      (implicit request: play.api.mvc.RequestHeader) 
      ... 
      @if(SessionHelper.authenticated) { 
          <strong>Authenticated!</strong> 
      } 
      ... 
      

      , her yerde ben açıkça örtülü isteği "define" gerekir, bir görünümü oluşturur anlamına gelir değişken. Örneğin: implicit request => deyimi olmadan

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

      , bu derleme değil. Şimdi bu biraz garip olsa da, "alt görüşlerin" (örn. Ana Sayfa veya Ayrıntılar) içinde kaldığım sürece, bu görünümlerin her biri için bir denetleyici yöntemine sahip olduğum ve dolaylı olarak örtük örneği. Bununla birlikte, şablonuma (ör. Ana) oturumuma erişmem gerektiğinde, bu, hiçbir zaman bir denetleyici tarafından açık bir şekilde oluşturulmadığı için çalışmaz.

      Bir şablonda oturuma erişmenin bir yolunu hemen göremiyorum ve hızlı bir Google, aynı konuyla ilgili bir kaç sorudan başka bir çözüm bulunmuyor. Herhangi bir fikir?

      Güncelleme: Bu biraz this question ile ilgili gibi görünüyor.

cevap

8

Zorunlu isteği, en azından Play Framework 2.0'daki gibi tüm şablonlarınızda geçirmenin bir alternatifi yoktur.

Güncelleştirmede eklediğiniz bağlantı, şablonlar etrafındaki daha fazla veriyi yalnızca 1 nesneye taşımaktır, ancak yine de her yerde gizli parametreyi bildirmeniz gerekir.

2

İlginç bir şey farkettim: Java Play 2.1.0 uygulamasında, Play 1.2.5 documentation içinde listelenen örtük nesneleri kullanabiliyorum, oysa bunlar oyun 2'de hiç belgelenmiyor! Muhtemelen belgelenmemiş geriye dönük uyumluluk düzeltmesi gibi bir şeydir. Neyse, ben bunu yapabilirsiniz:

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

ve bu: Gördüğünüz gibi, ben onları tanımlamadan request ve flash değişkenleri kullanabilirsiniz

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

. Benim IntelliJ sürekli olarak hata olarak vurgulamaktadır, ancak yine de derler ve çalışır. Yani, 2.0'dan sonra birkaç versiyon gibi görünüyorlar, bu problemi çözdüler.derler,

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

Sadece ide hatayı görmezden ve iyi çalıştırın: Java için Çal kullanıyorsanız

+2

, ben bulunamadı ": değer isteğini" olsun:

requestHeader yöntem

sınıfa play.TemplateImports tarafından otomatik ithalat oldu. – Wrench

+0

@Wrench: Kaka'nın cevabına bakın, bir açıklama sunar. Kısaca: bazı implicit'in kullanılabilir olmasını sağlayabilirsiniz. O sınıfa gir –

2

, bir şeyler yapabilirsiniz. Çal 2.3.x ile

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