Play Framework – Formatowanie JodaTime w templatach

Ostatnio hobbystycznie tworzę projekt w Scali z użyciem Play Framework. Sam framework jest bardzo interesujący, ale jest o nim bardzo wiele napisane w całym internecie dlatego to nie jemu poświęcony jest wpis.

Wpis jest o pewnym małym problemie, na który się dzisiaj natknąłem i niestety internet nie był zbyt pomocny – przynajmniej przy frazach wyszukiwania na jakie wpadłem 🙂

Problem: Chcę wyświetlić na stronie sformatowaną datę, którą mam w postaci obiektu klasy DateTime z biblioteki JodaTime.

Większość znalezionych rozwiązań niestety dotyczy daty zapisanej jako stary dobry java.util.Date. W takim przypadku wystarczy jedynie napisać:

@myDate.format("dd.MM.yyyy")

Oczywiście java.util.Date nie ma takiej metody więc jest tam zastosowana jakaś magia Scali 🙂

Znalazłem pewne rozwiązania dotyczące JodaTime ale były one bardzo brzydkie – wymagały zbyt dużo niepotrzebnego kodu w templacie, a to przecież Scala…

Pomyślałem o zrobieniu własnej Scalowej magii dla dat z JodaTime – w tym przypadku nieocenione okazały się doświadczenia związane z tym co opisałem w poprzednim poście. Utworzyłem sobie nowy obiekt:

object Extensions {
class JodaTimeWrapper[T <: ReadableInstant](t:T) {
  def format(pattern: String): String = {
    val fmt = DateTimeFormat.forPattern(pattern)
    fmt.print(t)
  }
  implicit def convertToJodaTimeWrapper[T <: ReadableInstant](t:T) =
    new JodaTimeWrapper(t)
}

I potem w pliku *.scala.html jedynie:

@import views.Extensions._
@myJodaTimeDate.format("dd.MM.yyyy")

Job done. A o co właściwie chodzi? Analogicznie jak w przypadku DSLa dla SWT utworzyłem klasę JodaTimeWrapper, która na zadanym obiekcie pozwala wywołać metodę format(). Potem tylko deklaracja implicit konwertera typu ReadableInstant na nasz wrapper. Kluczowe jest tutaj właśnie słówko implicit. Dzięki niemu kompilator w trakcie pracy jest w stanie stwierdzić, że obiekt typu DateTime jest również obiektem typu ReadableInstant (bo jest to jego klasa nadrzędna) i wie, że może sobie ten obiekt przekonwertować na JodaTimeWrapper i stamtąd już potrafi wywołać metodę format().

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s