Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formatowanie daty w widoku
Forum PHP.pl > Forum > PHP
WebCM
Istnieje model:
  1. class Film
  2. {
  3. public $ID;
  4. public $title;
  5. public $releaseDate;
  6. }

Istnieje widok:
  1. Tytuł: {{film.title}}
  2. Data: {{film.releaseDate}}

Otrzymamy datę w formacie YYYY-MM-DD lub uniksowy znacznik czasu. Niektóre ORM-y same mapują pola typu date i datetime do obiektu klasy DateTime, ale załóżmy, że tak się nie dzieje i musimy sami oprogramować formatowanie daty. Dodatkowo chcemy w pewnych przypadkach wyświetlać tekst "Wczoraj", "Dziś", "8 sekund temu", itd. Jak to rozwiązać i dlaczego tak?

1. Dodanie funkcji pomocniczych
  1. // definiujemy funkcje
  2. function formatDate($data) { return ... }
  3. function formatISO8601($data) { return ... }
  4.  
  5. // potem podpinamy do silnika szablonów
  6.  
  7. // a w szablonie wywołujemy: {{formatDate(film.releaseDate)}}

2. Utworzenie klasy i ręczne mapowanie
  1. // definiujemy klasę
  2. class NaszaData extends DateTime
  3. {
  4. public function format() {}
  5. public function toISO8601() {}
  6. public function __toString() {}
  7. public function __construct($rawDate) {}
  8. }
  9.  
  10. // jeśli framework pozwala, mapujemy pole
  11. class Film
  12. {
  13. public function afterFetch()
  14. {
  15. $this->releaseDate = new NaszaData($this->releaseDate)
  16. }
  17. }
  18.  
  19. // odwołanie w szablonie: {{film.releaseDate}} lub {{film.releaseDate.toISO8601()}}

3. Inaczej?
viking
Ja bym tu raczej użył cechy (trait). Oprócz tego przyjemnym rozwiązaniem jest hydracja. W tym wypadku do pola releaseDate przypiąć coś w stylu:

  1. public function __construct($format = null)
  2. {
  3. if (!is_null($format)) {
  4. $this->format = $format;
  5. }
  6. }
  7.  
  8. public function hydrate($value)
  9. {
  10. if ( is_string($value) && '' === $value ) {
  11. $value = null;
  12. } elseif ( is_string($value) ) {
  13. $value = new DateTime($value);
  14. }
  15.  
  16. return $value;
  17. }
  18.  
  19. public function extract($value)
  20. {
  21. if ( is_string($value) && '' === $value ) {
  22. $value = null;
  23. } elseif ( $value instanceof DateTime) {
  24. $value = $value->format($this->format);
  25. }
  26.  
  27. return $value;
  28. }
!*!
A jaki jest problem obrobienia tej daty już w modelu i przesłanie gotowego formatu do widoku?
WebCM
Można użyć cechy, ale czy to najlepszy pomysł? Pola z datą mogą mieć różne nazwy:
  1. trait DataTrait
  2. {
  3. public function format() { /* jakie pole formatować? */ }
  4. public function toISO8601() {}
  5. }
  6. class Film
  7. {
  8. use DataTrait;
  9. }

Najważniejsze pytanie, czy funkcjonalność odpowiadająca za formatowanie daty może znaleźć się w modelu. Oprócz daty rozważmy np. emotikony. Z drugiej strony niektórzy krytykują używanie funkcji pomocniczych (helpers).
Crozin
Cytat
A jaki jest problem obrobienia tej daty już w modelu i przesłanie gotowego formatu do widoku?
Bo model jest od przetwarzania danych, a widok od ich prezentacji. Formatowanie daty to nic innego jak logika prezentacji.

@WebCM: Utwórz sobie jakiś obiekt/zestaw funkcji, które będa jako argument przyjmować datę, a jako drugi jej format i formatuj przy pomocy DateFormattera.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.