MadHatter
21.07.2007, 18:54:09
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
21.07.2007, 20:56:12
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
21.07.2007, 21:13:17
http://forum.php.pl/index.php?showtopic=69281&hl=widokW 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
21.07.2007, 23:37:39
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...

Jeszcze raz dzieki i pozdrawiam!
sanchoo
13.08.2007, 12:12:12
no to ja ma pytanie ... z klasy

<?phpclass A
{
}
class B extends A
{
private zmienna;
private $strona;
public function getZmiana()
{
return $this->zmienna;
}
public function getStrona()
{
return $this->strona;
}
$this->strona=new C;
}
class C
{$stronaC= $contlore->getStrona()->getZmiana(); // jak mam odwolac sie do elementu zmiennaw clasie B
bo to nie dziala :)}
$contlorer = new B;?>
Ps: gdyby ktos zajrzal do przedszkola byl bym wdzieczny
http://forum.php.pl/index.php?showtopic=74579&hl=
Cysiaczek
13.08.2007, 12:19:38
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
13.08.2007, 13:04:01
faktycznie zle napsialem.. napsialem to z palca zeby tylko przedtsawic problem:
<?php
klasa A{
private $strona;
getStrona() //pubiera strona
$this->strona = new B; //w konstruktorze
}
classB
{
private $zawartosc;
getZawartosc() pobiera zawartosc;
$this->zawartosc="KOT"; //w konstruktorze
}
clasa View{
$contlorer->getStrona()->getZawartosc(); // tak nie pobiera mi :( a zalezy mi aby pola byly private; //w konstruktorze
}
$contlorer = new A;
new View;
?>
Sedziwoj
13.08.2007, 17:25:08
@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
13.08.2007, 20:35:48
hehe tak jak mowilem chodzilo o kokreny przyklad

ogolnie.. klasa wywoluje klase nie mozliwe?? i inna klasa chce pobrac dane z klasy ktora wywola klasa...

.. co tu ma dzialac


<?php
$this->zawartosc="KOT"; //w konstruktorze
?>
ale to chyba nie trzba wyjasniac

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

ale dzieki za zainteresowanie....
Sedziwoj
13.08.2007, 22:19:17
@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
14.08.2007, 07:21:24
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

to przepraszam.. zadaje sobie sprawe ze inaczej jest zapytac kogos na zywo.. a inaczej przez forum gdzie pytanie musi byc bardzo dokladnie sprecyzowane.
sanchoo
24.08.2007, 11:48:35
MVC a walidajca formularzy

Chce zamknac walidacje w jednej klasie. Wydumalem to tak:
w pliku index.php:
<?php
include('class_control.php');
if(($walid = new walid())==true)
{
$name = model::name_dzial($_GET['dzial']);
$control = new $name($name, $_GET['id'], $walid); //przekazuje obiket do kontolrera (kontolere jest dziedziczony do klasy podstawowej contolrera.
?>
i clasa walid:
<?php
class walid
{
public function __construct()
{
$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)
{
$name = model::name_dzial($this->error['dzial']);
$control = new $name($name, 0);
}
return true; //to jest chyba nie potrzebne kod zatrzyma sie wyzej wywalajac odpowiedni widok ER
ROR strona nie istnieje czy cos.
}
?>
obiket walid loaduje w korzeniu kontolrera:
<?php
public $walid;
public function __construct($dzial, $id, $walid)
{
$this->model= new model;
$this->walid=$walid;
?>
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
menic
24.08.2007, 11:57:43
Może
TO ci pomoze. Na koncu jest przykład jak u siebie rozwiązałem problem validacji
Speedy
26.08.2007, 23:43:20
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
27.08.2007, 13:38:18
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

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
27.08.2007, 14:13:53
@up: no czekam jaki to to jest wzorzec

Bo banialuki piszesz...
sanchoo
27.08.2007, 14:16:39
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
Cysiaczek
27.08.2007, 14:32:17
Chcesz powiedzieć, że zrobiłeś Model extends Validator ?
No bez jaj...
sanchoo
27.08.2007, 14:42:26
chcialem waldiacje zamnac w jedenj klasie

... 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"
"Modelem nazywamy tą część kodu aplikacji, która jest odpowiedzialna za kontakt z danymi biznesowymi, gdziekolwiek są składowane
(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
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
27.08.2007, 14:47:03
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
27.08.2007, 14:50:02
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
27.08.2007, 14:51:14
.. 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
27.08.2007, 14:57:33
Z tego co zauwazyłem to validacja, validacji nie rowna

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
27.08.2007, 17:33:21
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
27.08.2007, 20:49:01
@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
28.08.2007, 07:45:45
"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

Zaraz wyjdzie na to ze daleki jestem od MVC....
Sedziwoj
28.08.2007, 08:29:14
@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
28.08.2007, 08:49:00
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
28.08.2007, 10:20:38
@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
28.08.2007, 11:33:35
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
28.08.2007, 13:21:50
No dokładnie tam zrobilem ...
Dzieki za artykul przyda sie bardzo!
Sedziwoj
28.08.2007, 13:43:33
@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
28.08.2007, 14:20:19
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
28.08.2007, 14:36:04
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
<?php
$this->article = ArticlePeer::retrieveByPk($this->getRequestParameter('id'));
?>
Do widoku automatycznie dostaniemy zmienna $article zawierającą metody typu getXXX(). No i w widoku:
<?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
Sedziwoj
28.08.2007, 14:43:44
@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
28.08.2007, 14:43:48
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
sanchoo
28.08.2007, 14:50:16
... a ja mysle ze warto uslyszec inne opinie

Przynajmniej dla mnie.... dopiero zaczynam, i jak narazie poruszam sie po omacku

a im wiecej czytam wypowiedzi ty jest jasniej

menic
28.08.2007, 15: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.
@
sanchoo: U mnie było odwrotnie... Im wiecej czytałem tym mniej wiedziałem

@
bim2: im wiecej dyskusji tym lepiej. Zawsze mozna trafić na coś ciekawego
Sedziwoj
28.08.2007, 15:56:54
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)
<?php
/**
* Pobiera z Peer nazwe metody do obsługi danej kolumny.
*
* <code>
* $strPeerName = 'peer_name';
* $obj = call_user_func( array( $strClassPeer, 'retrieveByPK' ), 1 );
* $strValue = call_user_func( array($obj,'get'.self::getMethodFromPeer($strClassPeer,'column_name')));
* echo $strValue;
* call_user_func( array($obj,'set'.self::getMethodFromPeer($strClassPeer,'column_name')), 'new_value' );
* $obj->save();
* </code>
*
* @param string $strPeerName Nazwa klasy Peer
* @param string $strColumnName Nazwa kolumny dla której szukamy metody
* @return string Nazwa metody do obsługi kolumny
*/
static public function getMethodFromPeer
( $strPeerName, $strColumnName ){ $objTableMap = call_user_func
( array( $strPeerName, 'getTableMap' ) ); $strFunct = $objTableMap->getColumn( $strColumnName )->getPhpName();
return $strFunct;
}
?>
Podajesz peer i nazwę kolumny dostajesz nazwę metody (bez get/set to sam wybierasz)
sanchoo
30.08.2007, 07:29:03
Mam 2 kolejne problemy

... sa zamienne rozwiazania

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
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.