2010-09-14 10 views
9

Otrzymuję dane z modelu (tablica z danymi) i muszę wyświetlić w określonym formacie. Muszę iterować po tablicy, sformatować dane, a następnie wyświetlić. Gdzie powinienem sformatować dane do wyświetlenia? W modelu, kontrolera lub widoku? Dziękuję.MVC: Gdzie powinienem sformatować dane?

+0

Jak chcesz. Ale lepiej w kontrolerze. – pltvs

+0

@Alexander nie odpowiedzialność kontrolera. – Gordon

+1

@ Robię to w kontrolerze ... – jared

Odpowiedz

5

Powtórzenie tablicy i wyświetlenie danych odbywa się w widoku. Dlatego też formatowałem w widoku. Jeśli formatowanie jest skomplikowane i/lub wymaga dużej ilości kodu, umieść go w funkcji pomocnika.

Na przykład:

Widok:

<?php foreach($array as $item): ?> 
    <p><?php echo format_function($item); ?></p> 
<?php endforeach; ?> 

Helper:

function format_function($text) 
{ 
    // Do some formatting here... 
    return $formatted_text; 
} 
+0

Funkcja pomocnika brzmi dobrze :) – jared

+4

NIE zanieczyszczaj swojego widoku takim gównem. Widok nie jest odpowiedzialny za formatowanie. Spróbuj użyć oddzielnej warstwy, która jest odpowiedzialna za formatowanie/transformację twojego modelu obiektowego do widoku przyjaznego modelu widoku :) Podobnie jak powiedział Stefanvds w .NET istnieje obiekt-obiekt odwzorowujący o nazwie AutoMapper może istnieje odpowiednik w php. – Rookian

+0

Nie zgadzam się. Każda struktura MVC, którą znam, ma gotowe do użycia wsparcie. Jeśli nie w takich przypadkach, to do czego powinienem użyć pomocników? Twoje rozwiązanie może być bardziej "czyste", ale w tym prostym przypadku czuję, że dodanie kolejnej warstwy przesadza. – Mischa

2

jeśli ViewData ma danych pochodzących z różnych modeli, albo ma tylko wybraną część 1 modelu, można utworzyć ViewModel, który można następnie mapować za pomocą Automapper.

ViewModels ma kilka zalet. Są jasne pracować, porozrzucane swoje dane, można dodać bezpieczeństwa, ...

+0

wszelkie linki ze szczegółami do tego wzoru? – Gordon

+0

@Gordon: http://en.wikipedia.org/wiki/View_model? – fabrik

+0

@fabrik Do innych zastosowań, zobacz [Zobacz model (ujednoznacznienie)] (http://en.wikipedia.org/wiki/View_model_%28disambiguation%29). Nigdy nie boli, aby mieć link podczas odwoływania się do wzoru. – Gordon

2

Można to zrobić w View.Not w modelu W widoku nie można konkretne działanie (konwersja/warunki /)

2

Jeśli pracujesz nad większym projektem, sugerowałbym, abyś miał dodatkową warstwę lub klasę, która jest odpowiedzialna za przekształcenie twojego obiektu (np. Obiektu modelu domeny) w obiekt transferu danych (zobacz obiekt modelu).

przeciwnym razie zastosować sugestie robi formatowanie w widoku :)

Przemieniający może być związany z ciągów formatowania, dziesiętne (waluta), datetimes i tak dalej. Możliwa jest również transformacja wykresu obiektu (spójrz na mój przykład) na płaskie DTO.

Sterownik będzie odpowiedzialny za wywołanie algorytmu odwzorowania.

W związku z tym nie trzeba wykonywać iteracji odniesień do obiektu. Zamiast tego używaj płaskiego, dobrze sformatowanego modelu widoku.

Twój widok nie będzie zaśmiecony i wygląda bardzo czysto.

Narzędzie, które wykonuje to zadanie transformacji, jest dostępne w świecie .NET. Nazywa się AutoMapper. Być może istnieje odpowiednik w PHP.

Oto przykład

Jest to model obiektowy: alt text

Można przekształcić go w tym inteligentnego modelu Widok:

alt text

zalet tego podejście:

  • rozdzielenia dotyczy

  • czysty widok

  • żadne duplikacje kod, tzn formatowania datetime w każdym widoku. (Nie powtarzaj się!)

Wadą tego podejścia:

  • drogie jak na początku, więc małe projekty nie czerpać z tego podejścia
1

Do w Twoim Widoku, ponieważ jest odpowiedzialny za prezentację.

Powodem

  • nie robi to model jest, że można następnie renderowanie różne poglądy, stosując te same dane (w przeciwnym razie trzeba utworzyć inny zestaw danych),
  • nie robi w kontrolerze jest tak dlatego, że nie jest obowiązkiem kontrolera

Zobacz MVC background reading

2

Prezentacja! = formatowanie danych. Rozważmy następujący przykład:

Międzynarodowy sklep ze stroną produktu zawierającą różne informacje dotyczące wymiarów produktu itp. Ze względu na międzynarodowy charakter sklepu, dane powinny być sformatowane inaczej dla każdego miejsca, w którym jest odwiedzany sklep. Na przykład: W Europie pomiary są wyświetlane jako wartości metryczne, podczas gdy klienci z USA widzą te same dane sformatowane jako wartości imperialne.

Należy zauważyć, że ten szczególny typ danych nie powinien być zapisywany wiele razy dla każdego formatu, chociaż dane dotyczące cen powinny na przykład być. Wynika to z faktu, że ceny produktów do różnią się w zależności od regionu. Z drugiej strony pomiary i daty są równe w różnych lokalizacjach; tylko sposób wyświetlania i formatowania różnią się. Informacje powinny być zawsze przechowywane z jak najmniejszą nadmiarowością.

Część widokowa takiego sklepu (lub jakiejkolwiek aplikacji opartej na MVC, o to chodzi) nie powinna robić nic innego poza renderowaniem danych i określaniem, w jaki sposób dane te są prezentowane użytkownikowi. Same dane nie powinny być w żaden sposób zmieniane przez widok.Właśnie dlatego informacje dotyczące pomiarów i czasu powinny być przechowywane w standardzie ISO w formacie standardowym, dzięki czemu formatowanie danych do innych formatów jest łatwiejsze. Pomiary powinny być przechowywane na przykład jako wartości metryczne. Rzeczywiste formatowanie danych dla ustawień narodowych powinno odbywać się w modelu po pobraniu zbioru danych z bazy danych, najlepiej z dostępną statycznie klasą klasy pomocniczej dla uzyskania największej elastyczności. Po sformatowaniu danych jest on zwracany do kontrolera, który następnie zwraca go do bieżącego widoku.

Inną ważną wadą tego sposobu obsługi formatowania danych jest to, że dane nadal będą poprawnie sformatowane, gdy spróbujesz pobrać zestaw danych za pomocą akcji bez widoku (np. Obiekt JSON pobrany przez AJAX). Dane, które są odsyłane do klienta w jakikolwiek sposób (za pomocą "normalnego" szablonu HTML lub jako ciąg JSON/XML) nie powinny się różnić; tylko sposób, w jaki jest przedstawiony .

+0

Uzgodnione. SoC dotyczy odpowiedzialności i zazwyczaj w architekturze prezentacji z pasywnym widokiem (np. Wariacja MVP, MVVM, MVPVM itp.), Odpowiedzialność za formatowanie/przygotowanie danych nie spoczywa na widoku. Byłby to prezenter/viewmodel, aw przypadku bardziej "ASP" MVC w stylu MVP, na przykład, sterownik jeszcze lepiej, vm). Pasywność zwiększa testowanie/ponowne użycie, utrzymuje logikę biz z prezentacji. I ostatnia para zrobiła świetny punkt, o którym nie myślałem, co oznacza również, że "sformatowany" nie musi oznaczać sformatowania do oglądania. – user1172173

Powiązane problemy