Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mvc]poraz kolejny...
Forum PHP.pl > Forum > PHP > Object-oriented programming
MadHatter
Witam,

Mam pytanie czysto teoretyczne. Buduje strone i chce ja oprzec na wzorcu MVC. Wspieram sie Smarty i Pear przy tym. I teraz moje pytania.
1. Czy za widok maja byc odpowiedzialne tylko szblony smarty czy tworzyc do niego osobna klase?
2. Poza przypisaniem danych ktore uzyskuje z modelu, podstrony roznia sie tez wygladem(dokladnie tlami glownej tresci), jaka czesc MVC powinna byc odpowiedzialna za ustwienie przykladowego tla? Rozwazam dwa przypadki, nie wiem jednak ktory bylby "najczystrzy" jesli chodzi o zalozenia ww wzorca. Pierwszy to to ze poszczegolne metody kontrolera przypisauja do szablonu smarty, dane z modelu oraz w kazdje metodzie jest deklarowana zmienna odpowiadajaca za tlo strony i tak tez przypisywana do szablonow. Drugie rozwiazanie to takie, ze w akcjach kontrolera wogole nie zajmu je sie ustawianiem tla a tylko wyborem widokow. W takim przypadku jednak ilosc szablonow musialbym odpowiednio rozmnozyc.

Czytam dosc spro na temat mvc, moje doswiadczenie z frameworkiem cakePHP wcale nie rozwialo wszelkich watpliwosci jednak, przynajmniej tych teoretycznych. Rozumiem ze wzorzec jest raczej czyms abstrakcyjnym i elastycznym niemniej na forum znalazlem taka definicje widoku:

Cytat
Główna zasasda MVC jest to aby w modelu byl tylko kod php a w VIEW tylko html


Natomiast w jednym z rtykulow na wortalu opis brzmi juz tak:

Cytat
Widok powinien wykorzystywać model do pobrania danych, które będą wyświetlone. Typowo, widok powinien utworzyć instancje klas modelu i wywołać metody odpowiedzialne za pobranie odpowiednich danych. Tym, czego należy się wystrzegać w widoku, jest modyfikacja danych. Widok nie powinien zmieniać w żaden sposób stanu aplikacji. Powinien np. wyświetlać listę użytkowników, ale nie powinien ich dodawać ani usuwać.


Rozbieznosc jest wiec dosc spora...

Jak najlepiej wedug Was zarac sie za to, w przypadku niewielkiej aplikacji?

Z gory dzieki i pozdrawiam!
menic
ech....
Ile razy to jeszcze będzie wałkowane?
Jest tyle pomysłów na to ilu jest programistów. Najlepiej to zacznij sam powoli pisac, próbuj rozne sposoby i wybierz ten, który ci bardziej do gustu przypadnie.
Cysiaczek
http://forum.php.pl/index.php?showtopic=69281&hl=widok
W podanym wyżej topiku masz sporo teorii z przykładami. Gdzieś w połowie strony napisałem kilka zdań na temat różnych interpretacji elemantów składowych wzorca.

Pozdrawiam.
MadHatter
Bardzo dziekuje, tego watku nie wygrzebalem, coz widze tylko ze problem ma mase rozwiazan, ale przynajmniej wiem ze nie robie jakiegos karygodnego myslowego bledu chyba... winksmiley.jpg

Jeszcze raz dzieki i pozdrawiam!
sanchoo
no to ja ma pytanie ... z klasy smile.gif
  1. <?phpclass A
  2. {
  3. }
  4. class B extends A
  5. {
  6. private zmienna;
  7. private $strona;
  8. public function getZmiana()
  9. {
  10. return $this->zmienna;
  11. }
  12. public function getStrona()
  13. {
  14. return $this->strona;
  15. }
  16. $this->strona=new C;
  17. }
  18. class C{$stronaC= $contlore->getStrona()->getZmiana(); // jak mam odwolac sie do elementu zmiennaw clasie B questionmark.gif bo to nie dziala :)}
  19.  
  20. $contlorer = new B;?>


Ps: gdyby ktos zajrzal do przedszkola byl bym wdzieczny smile.gif http://forum.php.pl/index.php?showtopic=74579&hl=
Cysiaczek
Przyjrzyj się definicji swojej klasy C, wogóle napisz jeszcze raz ten kod, tym razem poprawnie, bo wogóle to nie ma prawa działać.

Pozdrawiam.
sanchoo
faktycznie zle napsialem.. napsialem to z palca zeby tylko przedtsawic problem:

  1. <?php
  2. klasa A{
  3.  
  4. private $strona;
  5. getStrona() //pubiera strona
  6.  
  7. $this->strona = new B; //w konstruktorze
  8.  
  9.  
  10. }
  11.  
  12. classB
  13. {
  14.  
  15. private $zawartosc;
  16. getZawartosc() pobiera zawartosc;
  17. $this->zawartosc="KOT"; //w konstruktorze
  18.  
  19. }
  20.  
  21. clasa View{
  22. global contlorer;
  23.  
  24. $contlorer->getStrona()->getZawartosc(); // tak nie pobiera mi :( a zalezy mi aby pola byly private; //w konstruktorze
  25.  
  26.  
  27. }
  28.  
  29. $contlorer = new A;
  30. new View;
  31. ?>
Sedziwoj
@sanchoo
Ty może już nie pisz, albo najpierw sprawdź czy to co podałeś działa.
Do tego użycie globali to debilizmy, gdy się bez nich spokojnie da obejść.
sanchoo
hehe tak jak mowilem chodzilo o kokreny przyklad smile.gif ogolnie.. klasa wywoluje klase nie mozliwe?? i inna klasa chce pobrac dane z klasy ktora wywola klasa... smile.gif .. co tu ma dzialac smile.gifquestionmark.gif
  1. <?php
  2. $this->zawartosc="KOT"; //w konstruktorze
  3. ?>

ale to chyba nie trzba wyjasniac smile.gif
no nie wazne... widze ze jak sie nie poda zerznietego kodu ktory sie "kompiluje" to ciezko zczaic o co komus chodzi... moze to i racja ... wsumie jak ktos napisze "pseudo kod" ktoremu wydaje sie jasny to nei koniecznie ktos moze zrozumiec o co chodzi... w kazdym razie poakzalm znajoemu z pracy... i jakos bez 2 zdan powiedzial mi co mam zrobic smile.gif
ale dzieki za zainteresowanie....
Sedziwoj
@sanchoo
Co ma działać, to że to co piszesz jest nie zgodne z żadnymi zasadami, po co dajesz komentarze, kiedy kod sam by to powiedział, a nie trzeba dodatkowo się nad tym wysilać, bo Tobie się nie chce pisać. Va nawet nie opisałeś słowami tego, tylko narzekasz i sugerujesz że osoby z tego grona są głupsze od Twojego kolegi z pracy.
A zrozum że po prostu nie chce się ludziom wnikać w czyjeś wywody, gdy są niejasne, wtedy chodzi nadinterpretacja i mozna zrozumieć że działa inaczej niż Ty myślałeś że to prezentujesz. Więc radził bym nauczyć się opisywać swoje problemy, czy pomysły w taki sposób aby dla innych były łatwo przyswajalne, bo nie chodzi tu o to aby utrudnić innym zrozumienie. A Twój "pseudokod" taki jest.
sanchoo
Cytat
to ciezko zczaic o co komus chodzi... moze to i racja ... wsumie jak ktos napisze "pseudo kod" ktoremu wydaje sie jasny to nei koniecznie ktos moze zrozumiec o co chodzi...

jesli wyszlo tak jak mowisze ze zasugerowalem smile.gif to przepraszam.. zadaje sobie sprawe ze inaczej jest zapytac kogos na zywo.. a inaczej przez forum gdzie pytanie musi byc bardzo dokladnie sprecyzowane.
sanchoo
MVC a walidajca formularzy smile.gif
Chce zamknac walidacje w jednej klasie. Wydumalem to tak:
w pliku index.php:
  1. <?php
  2. include('class_control.php');
  3.  
  4. if(($walid = new walid())==true)
  5. {
  6.  
  7. $name = model::name_dzial($_GET['dzial']);
  8.  
  9. $control = new $name($name, $_GET['id'], $walid); //przekazuje obiket do kontolrera (kontolere jest dziedziczony do klasy podstawowej contolrera.
  10. }else echo "error";
  11. ?>

i clasa walid:

  1. <?php
  2. class walid
  3.  {
  4.  private $error=array();
  5.  
  6.  public function __construct() 
  7.  {
  8.  $this->error['dzial']=$this->id_dzial($_GET['dzial']); na samym poczatku przekazuje dzial w zaleznosci od dzialu bedzie rozna ilosc zm
    iennych... np bedzie trzbea dodasc shaslhe albo zabepzieczyc przed SQL Injection. Dlate tu spr. tylko dzial (czy to numer czy w bazie istenije)
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  if(in_array(false, $this->error))
  16.  {
  17.  $name = model::name_dzial($this->error['dzial']);
  18.  $control = new $name($name, 0);
  19.  exit();
  20.  }
  21.  return true; //to jest chyba nie potrzebne kod zatrzyma sie wyzej wywalajac odpowiedni widok ER
    ROR strona nie istnieje czy cos.
  22.  
  23.  }
  24. ?>



obiket walid loaduje w korzeniu kontolrera:
  1. <?php
  2. public $walid;
  3. public function __construct($dzial, $id, $walid)
  4.  {
  5.  $this->model= new model;
  6.  $this->walid=$walid;
  7. ?>


i teraz moge sobie wywolywac w contolrolerze np jesli chce zabezpieczyc sie przed SQL Injection to w klasie walidacji stworze sobie odpowiednia funkcje .. ktora zwroci mi juz sprawdzona wartosc do zapytania.

Pytanie czy to dobre rozwiazanie?? dzieki temu co prawadam unikam np global $walid itp... ale mvc zaczyna bardziej mi sie wiazac... walidacje trez bede stosowal w widoku wiec bede musial przekazac mu obiket smile.gif
menic
Może TO ci pomoze. Na koncu jest przykład jak u siebie rozwiązałem problem validacji smile.gif
Speedy
Cytat
Główna zasasda MVC jest to aby w modelu byl tylko kod php a w VIEW tylko html


Nie tylko HTML. Widok odpowiada za wyświetlanie i prezentację danych w każdej postaci - tj. XHTML, XML, RSS, PDF, XLS, CSV itd.
Nie odbywa się w nim pobieranie danych, ani też ich modyfikacja. Dane są wyłącznie prezentowane. Wg mnie, dla każdego typu prezentowanych danych powinien być utworzony osobny "subwidok".
sanchoo
Cytat(Speedy @ 27.08.2007, 00:43:20 ) *
Nie odbywa się w nim pobieranie danych,
hmm.. widok w mvc ma dostep do modelu po co innego jak nie pobieranie danych? Jesli nie moze pobierac danych wtedy zostaje tylko opcja ze kontroler podaje mu dane.. a to juz nie jest MVC tylko ...wylecialo mi z glowy smile.gif Wzorzec gdzie kontlorer jest lacznikiem widoku i modelu. Oczyiwscie widok nie ma mozlwisci edycji danych!!Dodam z u mnie widok odpowiada za pobranie danych... i wrzucenie ich do smartow:)
menic
@up: no czekam jaki to to jest wzorzec tongue.gif Bo banialuki piszesz...
sanchoo
menic dzieki za info.
Zrobilem to mniej weicej tak: Model dziedziczy z klasy walid. I tam sobie odpoweidnio sprawdzam dane. Jesli jest jakis blad powiedzmy nick za krotki to zapisuje to tak. $this->error['nick']="Nick jest za krotki" Dzieki czemu pozniej laduje do smartow wyswietl przy nicku $model->getError("nick")... i po sprawie..
Podbnie jest rozwiazane w Ruby.
Niestey xml nie maielm zadnej stycznosci... raczej z jego zastoswaniem.. nie ta liga jeszcze winksmiley.jpg
Cysiaczek
Chcesz powiedzieć, że zrobiłeś Model extends Validator ?
No bez jaj...
sanchoo
chcialem waldiacje zamnac w jedenj klasie smile.gif... tak mi polecil znajomy ktory siedzi kupe lat... zadalem kilka pytac wyzej jak uzywacie walidacje w mvc to tylko "menic" cos napisal.. a teraz psizesz "bez jaj" .. napisz jak ty to robisz bede wdzieczny... jak widac w temacie "pierwsze kroki"

  1. "Modelem nazywamy tą część kodu aplikacji, która jest odpowiedzialna za kontakt z danymi biznesowymi, gdziekolwiek są składowane
  2. (zwykle w relacyjnej bazie danych). Model nie tylko służy do pobierania i modyfikacji danych biznesowych, ale także zajmuje się ich spójnością i
  3. integralnością poprzez odpowiednie mechanizmy walidacji danych." na:
http://blog.zabiello.com/articles/2007/01/...mplates-and-mvcno mogl bym tam osbne funkcje zaladowac do walidacji... ale wydawalo mi sie bardziej estetycznie jesli walidacja bedzie w osobnym pliku jako klasa... dlaczego to jest zle roziazanie?
Cysiaczek
Nie chodzi mi o to, że umieszczenie walidacji w modelu jest złe, a jedynie o sam fakt zaistnienia tutaj relacji dziedziczenia. Tu jedyną relacją jaka jest prawdiłowa, to zawieranie, czyli wg, podręcznika php - agregacja - Obiekt Modelu zawiera obiekt Validator.

Pozdrawiam.
menic
Pomijając kwestie nazewnictwa wzorców... U mnie validacja jest jako osobna klasa, która jest odpalana jako filtr przed wykonaniem kontrolera. Jesli walidacja sie nie powiedzie, to wykonujemy akcje zawartą w xml'u
sanchoo
.. w tej chwili wydaje mi sie to... na jedno wyjdzie:/ ale z kilku ostatnich doswiadczen wiem ze.. osoby powyzej 500 komentow z reguly maja racje o czym przkeonalem sie pozniej . Perzerobie to.
Teraz faktycznie nie moge znalezc nic o tym ze widok sobie scice odpowiednie dane z modelu. ...Jak zaczynalem pisac w mvc opieralem sie na tym http://www.codeproject.com/useritems/PraticalMvc/MvcUml.gif i tu wydawalo mi sie dosc logiczne ze widok sobie moze pociagnac dane z modelu....
menic
Z tego co zauwazyłem to validacja, validacji nie rowna winksmiley.jpg Przywołujesz cytat z bloga... Ok, ale IMO validacja w tamtym znaczeniu jest typu, ze sprawdzasz jakie dane są wstawiane. Np. kolumna w bazie oczekuje liczby, a ty starasz sie wsadzic tam stringa.
A co do tego czy widok moze sobie pobierac dane z modelu... To już zalezy od tego co ty preferujesz. Ja jestem za tym, aby widok miał tylko to co mu poda kontroler, wywołujący model.
bim2
Cytat
Opisów i implementacji MVC jest tyle ilu programistów...


Ja robie to tak (chodzi mi o ten wasz przeklęty widok).

Kontroler wywołuje akcje Index (obojetne)

class Action_Index extends Application_Action
{
function default()
{
$this->getModel('Index', 'getNews');
$this->getView('Index', 'showNews');
}
}
w modelu pobieram dane i zapisuje do kontrollera zmienna np. $this->aNews; (metoda __set i __get)

Według mnie kontroller wywołuje tylko akcje, akcja model i viewa i może dodawać do bazy danych. Dzięki temu, że akcja dodaje do bazy danych nie mam balaganu. Jak chce zmienić co¶ w dodawaniu, np rejestracji chce dodać nowe pole to szukam w akcji, a nie w modelu gdzie jest jeszcze profil użyszkodnika, logowanie i inne rzeczy.

Co do validacji, zrobiłbym to jako filtr podczas uruchamiania Akcji/Modelu i oparłbym konfigurację na plikach xml (jak menic).
Sedziwoj
@bim2
Coś chyba masz pokopane... albo źle rozumiem.
Model ma i tylko on wiedzieć skąd i umieć pobrać dane.
Widok powinien umieć prezentować mu podane dane.
Kontroler (u Ciebie akcja) wie z których (liczba mnoga) modeli pobierać dane i do którego widoku je przekazać.

Widok powinien dostawać dane a nie je pobierać, bo już z doświadczenia wiem, że jak się zmieni co jest widokiem pojawiają się problemy. A tego właśnie chcemy uniknąć. Do tego widok nie powinien wiedzieć o istnieniu modeli, daje to odpowiednią izolację, dzięki temu, można zmieniać warstwę modelu nie ruszając warstwy widoku.
sanchoo
"Kontroler moze pobierac z modelu i przekazywac do widoku, moze rowniez tylko wywolac odpowiedni widok ktory sam sobie dane z modelu zaciagnie, "
(...)
Ktos inny.. "Jestem zdania że widok powinien dostać dane i tylko je wyświetlić, zero interakcji z innymi elementami."

Chyba dokładnie jest tyle interpretacji co programistow. Co do:

Cytat(Sedziwoj @ 27.08.2007, 21:49:01 ) *
@bim2
Widok powinien dostawać dane a nie je pobierać,



Narazie ma tak ze widok moze pobierac sam dane z modelu jest to sporadyczne... np jak potrzebuje login po id ... ewentualnie wyswietlic posortowana liste plikow wedlug rozmiaru.... kontroler mu przekauzje np "sort=size" a widok ma odpowiednia klase ktora sobie posortuje przed samym wyswietleniem. Moja aplikacja sie rozrasta i powoli zaczyna sie troche syfic.. z tym widokiem...
Tylko teraz mam duze ALE do samego siebie... skoro u mnie sa jeszcze smarty.. to wychodzi na to ze jako tako widok to tpl to co to jest Widok jako php ktory odpowiada za odpwoednie ulozenie danych i odpalenie smartow smile.gifquestionmark.gif
Zaraz wyjdzie na to ze daleki jestem od MVC....
Sedziwoj
@sanchooPamiętaj, że widokiem może być wszystko, możesz przesyłać dane np. za pomocą SOAP a wtedy to coś co odbiera nie może odpalić jakiegoś obiektu, to coś musi mieć dane.Czy posortować dane i które powinien wiedzieć widok, np. na podstawie danych z GET, i uruchomić odpowiedni model (np. z parametrami sortowania) i już posortowane dane przekazać widokowi.

Pamiętaj że baza o wiele szybciej posortuje niż PHP (zakładając użycie bazy danych)

EDIT. Kiepsko działa to doklejanie postów
sanchoo
Wiem ze baza posortuje szybciej... tylko tu jest inna sprawa.. jest tak:
Admin wrzuca klientowi pliki..
Klient sie loguje i widzi te pliki w postaci listy. Name, Size, Time (czas otrzymania) ... nazwy plikow nie sa ladowane do bazy tylko dynamiczne sciagane z katalogu uzytkownika. Pliki laduje do tablicy asocjacyjnej. Zaleznosci jaki parametr mu rpzekaze .. czy time czy name to tak mi posortuje.
Tu pojawil mi sie kolejny problem: gosc zarzyczyl sobie ze jesli plik przekracza 1000KB to ma byc w MB. Wtedy robil mi tak ze 2MB byly mniejsze od 100KB. Zrobilem to tak ze Sortuje w KB i w smartach sprawdzam jesli jest wiekszy nic 1000KB to dziele to przez 1024. Nic innego mi do glowy nie rpzyszlo:)
bim2
@Sedziwoj
Akcja u mnie to nie kontroller... rozdzieliłem to jeszcze bardziej i poszedłem o krok dalej (może w tył)

Zadania akcji:
-Wywołuje modele i widoki
-Dodaje dane do bazy danych
Zadania modelu:
-Pobiera dane i przekazuje widokowi
Zadania widoku:
-Wyświetla wszystko i grupuje

Wydaje mi sie to lepsze (z akcją), że model nie dodaje danych, bo jak już pisałem, jeśli chce coś dodać do rejestracji (następne pole) to szukam w akcji, a nie w modelu gdzie miałbym jeszcze logowanie, profil użytkownika itd.

Możesz mieć inne zdanie, może zrobiłem coś źle, ale ja po prostu oddzieliłem następne rzeczy i dzięki temu "widzę więcej"
Ludvik
Cytat
Tu pojawil mi sie kolejny problem: gosc zarzyczyl sobie ze jesli plik przekracza 1000KB to ma byc w MB. Wtedy robil mi tak ze 2MB byly mniejsze od 100KB. Zrobilem to tak ze Sortuje w KB i w smartach sprawdzam jesli jest wiekszy nic 1000KB to dziele to przez 1024. Nic innego mi do glowy nie rpzyszlo:)


I tak powinno być. Nie można porównać danych zapisanych w różnych jednostkach. To tak jakbyś porównał człowieka mającego 6 stóp wzrostu do tego, co ma 2 metry, i wyszłoby Ci, że jest wyższy. Najpierw wspólne jednostki, potem porównywanie/sortowanie, a na samym końcu konwersja.

Właśnie od tego jest widok, żeby można było spokojnie zmienić prezentację danych. Teraz wystarczy, że w widoku dokonasz konwersji KB->MB.

Ostatnio przysiadłem i napisałem coś na ten temat. Tutaj możecie to przeczytać. Ja skłaniam się ku koncepcji, że widok powinien być oddzielony od modelu. Do przekazywania danych korzystamy z obiektu kontekstu odpowiedzi. Na pewno jest to dobre podejście dla stron www, ale w innych przypadkach może się nie sprawdzić.
sanchoo
No dokładnie tam zrobilem ...
Dzieki za artykul przyda sie bardzo!
Sedziwoj
@sanchoo
No i co za różnica że model nie pobiera danych z DB tylko z katalogów?
Zwraca listę, a skąd ją bierze to nie ważne, umie ją posortować. A pole w każdym rekordzie powinno mieć ten sam typ, co w tym przypadku wielkość ale tez jednostkę.
Więc nadal to model powinien umieć posortować dane podstawowe. Czy je przefiltrować.

@bim2
Czy mi się wydaje, czy możesz tylko z jednego modelu na raz korzystać?
A do tego model musi wiedzieć jak przekazać dane do widoku, co powoduje że zmieniając widok, czy model musisz zmienić ten drugi.
Aby zmienić model musisz zmienić akcję, więc jeszcze dodatkowo musisz ingerować w model, zamiast ustawić tylko odpowiednie przypisanie danych do widoku.
Ciągle jest zależność między modelem a widokiem, a obaj zależą też od akcji, czyli masz wszędzie zależności, gdzie tu rozbicie gdzie MVC? Przecież ten wzorzec ma właśnie służyć do jak najmniejszej zależności i przenikania się warstw odpowiedzialnych za różne rzeczy.
sanchoo
Cytat(Sedziwoj @ 28.08.2007, 14:43:33 ) *
@sanchooA do tego model musi wiedzieć jak przekazać dane do widoku,
co masz namysli przez to?? Pytam model odpowiada... nie wazne czy zapytam go zapytam z widoku czy kontrolera.. model tylko wyrzuca... niektore dane potrzebuje pobrac aby pozniej wykorzystac do edycji.. wtedy robie to w kontrolerze... jesli np dodam usera model mi zwraca OK DODALEM! i kontroler to daje do widoku... Powiedzmy ze mam jakas liste firm w select to widok u mnie wywoluje funkcje z modelu "podaj mi liste" i laduje odrazu do widoku... Narazie jest ok.. abrdzo mozliwe ze sie rpzejade bo sie strasznie wszystko zagmatwa :/
Cytat
Typowo, widok powinien utworzyć instancje klas modelu i wywołać metody odpowiedzialne za pobranie odpowiednich danych
z http://wortal.php.pl/phppl/wortal/artykuly...vc/elementy_mvc... jak mozna to inaczej interpretowac?
Cytat
Należy jednak pamiętać, że widok nie jest szablonem (lub raczej zbiorem szablonów). Widok to przede wszystkim kod, który "wyciąga" z modelu potrzebne dane, natomiast nic nie stoi na przeszkodzie, aby widok wykorzystywał wewnętrznie szablony.
menic
Przy tej dyskusji należy podkreślić, że CAŁKOWITE oddzielenie tych warstw jest mitem. Weźmy jako przyklad Symfony... W kontrolerze (akcji) za pomoca propela generujemy zapytanie
  1. <?php
  2. $this->article = ArticlePeer::retrieveByPk($this->getRequestParameter('id'));
  3. ?>
Do widoku automatycznie dostaniemy zmienna $article zawierającą metody typu getXXX(). No i w widoku:
  1. <?php echo $article->getTitle() ?>
Wszystko jest swietnie, dopóki nie zmienimy nic w bazie danych, np. kolumnę title na nazwa. Propelem generujemy nowy model i... Znika nam metoda getTitle(). I teraz albo we wszystkich widokach zmienimy getTitle() na getNazwa() albo do modelu dodamy metode getTitle() zwracającą getNazwa(). Tak więc całkowite oddzieleni tych warstw praktycznie nie istnieje i trzeba wybrac "mniejsze" zło winksmiley.jpg
Sedziwoj
@menic
Mylisz się da sie to zrobić, bo masz takie coś jak phpName i phpNamingMethod w schema.xml
Do tego można tworzyć tablice tabela -> nazwa klasy, jak również kolumna -> metoda.
Do tego w Propel 1.3 masz toArray, możesz zrobić rzutowanie z bazy na widok (danych) i wtedy całkowicie się uniezależnić.
bim2
Mogę korzystać z ilu modeli/widoków chce. I jak zmienie model nie zmieniam widoku. Mam coś ala baze danych kontrollera. Z założenia kontroller ma połączyć akcje, model i widok i wyświetlić nam stronę. W modelu robie $this->aUsers = $r->fethAll(); a w widoku echo $this->aUsers; Zmieniając model, musze zadbać tylko o to, aby nazwa była taka sama. Jeśli chce zmienić model na całkowicie inny to mogę wywołać $this->getModel('Innu', 'Model');... Skończmy tą dyskusję. Ile programistów tyle pomysłów wstydnis.gif
sanchoo
... a ja mysle ze warto uslyszec inne opinie smile.gif Przynajmniej dla mnie.... dopiero zaczynam, i jak narazie poruszam sie po omacku winksmiley.jpg a im wiecej czytam wypowiedzi ty jest jasniej winksmiley.jpgwinksmiley.jpg
menic
@Sedziwoj: do czynienia z propelem 1.3 nie miałem, wiec nie dokladnie o co chodzi... Ale Co do phpName itp... Owszem masz takie cos, ale No to jest tak jak by nakładka na tą sytuacje co opisałem w poscie wyzej. Wygenerujesz metode getTitle() ktora bedzie wskazywała na kolumne "nazwa". Tylko że takie działanie IMO wprowadza zamęt, szczególnie jak jest duża baza danych. Zazwyczaj nazwa metody jest identyczna z nazwą kolumny. W przypadku zmiany moze zapoanować małe zamieszanie, szczególnie dla osób które dopiero sie wdrażają do projektu.
@sanchoo: U mnie było odwrotnie... Im wiecej czytałem tym mniej wiedziałem winksmiley.jpg
@bim2: im wiecej dyskusji tym lepiej. Zawsze mozna trafić na coś ciekawego smile.gif
Sedziwoj
Cytat(menic @ 28.08.2007, 16:10:51 ) *
@Sedziwoj: do czynienia z propelem 1.3 nie miałem, wiec nie dokladnie o co chodzi... Ale Co do phpName itp... Owszem masz takie cos, ale No to jest tak jak by nakładka na tą sytuacje co opisałem w poscie wyzej. Wygenerujesz metode getTitle() ktora bedzie wskazywała na kolumne "nazwa". Tylko że takie działanie IMO wprowadza zamęt, szczególnie jak jest duża baza danych. Zazwyczaj nazwa metody jest identyczna z nazwą kolumny. W przypadku zmiany moze zapoanować małe zamieszanie, szczególnie dla osób które dopiero sie wdrażają do projektu.


Tylko że Ty zmieniasz nazwę kolumny w bazie, ten przykład co podałeś, więc robisz większy zamęt, Do tego pisałem o dynamicznym mapowaniu (klas dopiero w 1.3) ale metod dla pola da się wyciągać bo robię to, co prawda kod jest cięższy, ale odporny na zmiany. (a w elementach dynamicznie generujących tylko tak się da)
  1. <?php
  2. /**
  3.  * Pobiera z Peer nazwe metody do obsługi danej kolumny.
  4.  *
  5.  * <code>
  6.  * $strPeerName = 'peer_name';
  7.  * $obj = call_user_func( array( $strClassPeer, 'retrieveByPK' ), 1 );
  8.  * $strValue = call_user_func( array($obj,'get'.self::getMethodFromPeer($strClassPeer,'column_name')));
  9.  * echo $strValue;
  10.  * call_user_func( array($obj,'set'.self::getMethodFromPeer($strClassPeer,'column_name')), 'new_value' );
  11.  * $obj->save();
  12.  * </code>
  13.  * 
  14.  * @param string $strPeerName Nazwa klasy Peer
  15.  * @param string $strColumnName Nazwa kolumny dla której szukamy metody
  16.  * @return string Nazwa metody do obsługi kolumny
  17.  */
  18. static public function getMethodFromPeer( $strPeerName, $strColumnName ){
  19. $objTableMap = call_user_func( array( $strPeerName, 'getTableMap' ) );
  20. $strFunct = $objTableMap->getColumn( $strColumnName )->getPhpName();
  21. return $strFunct;
  22. }
  23. ?>

Podajesz peer i nazwę kolumny dostajesz nazwę metody (bez get/set to sam wybierasz)
sanchoo
Mam 2 kolejne problemy smile.gif
... sa zamienne rozwiazania smile.gif

1. http://uber-uploader.sourceforge.net/ - to jest do upladu z paskiem postepu:)..
2. Komunikat "Trwa wysylanie" .."zakonczono sukceme" lub nie wyslano teog i tego...

W jai spsopb do MVC mozna zladowac pierwszy sytem.. wlasciwei w 1 i 2 sprawa jest identyczna...
Potrzebuje wyswietlic komunikat "trwa wysylanie pliku"... a jak sie zakocnzy to zakonczono winksmiley.jpg
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.