![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Zacząłem pisac swój Framework opierając sie na MVC i możliwie największym OOP, aby następne aplikacje wychodzące z moich rąk były bardziej moja zasługą niż innych (CodeIgniter przede wszystkim). No i do pewnego momentu wszystko było ok. Teraz dwa pytania:
1. Jak przesyłać dane do widoku? Chodzi mi o powiedzmy jedną wielka tablicę asocjacyjną, w której będą pod odpowiednimi indeksami odpowiednie dane i wysłać ją do widoku, żeby tam była widoczna. Po zwykłym includowaniu pliku widoku (przez widok rozumiem większośc kodu HTML z dodatkami php) nie było widać żadnych zmiennych, i w tym problem, bo chyba tak powinno być. Czytałem kod w CI, żeb zobaczyć jak tam jest to rozwiązane, ale od czytania tego kodu rozbolała mnie głowa a najgorsze, że nic z tego nie zrozumiałem ;/ 2. Jak napisać klase do ładowania innych klas? Powiedzmy, że mamy kontroler, z którego chcemy wywołać model. Możemy napisac prostą funkcję, która może wyglądać przykładowo tak:
i będzie nam zwracała obiekt, który przypiszemy do zmiennej. Ale jak załadować klasę do załadowywania klas? Mam nadrzędny kontroler po którym dziedziczą wszystkie inne i jak w tych "wszystkich innych" rozwiązać ten problem? Mógłbym w każdym robić nową instancje obiektu i ładować cały plik funkcją powyżej ale czy to ma sens? I jak załadować widok? Tutaj potrzebuję odpowiedzi na pierwsz epytanie bo jak na razie stoję w miejscu. Myślałem nad rozwiązaniem stosowanym w CI, $this->nazwaKlasy->nazwaMetody() - ale jak tego dokonać? Mógłbym prosić o jakąś pomoc albo namiary jak to wykonać? Przeszukałem juz google i tutejsze tematy o MVC ale przeważnie pisane jest o tym jak korzystać lub czy dobrze ktoś z tego (z MVC) korzysta a nie jak coś zrobić. Bardzo liczę na czyjąś pomoc. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 64 Pomógł: 5 Dołączył: 16.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
2. autoloader, spl_autoload_register
na organizację takiego autoloadera są (wg mnie) 2 warte uwagi sposoby, pierwszy to organizacja w stylu Zend Framework, tzn klasa o nazwie np. adbacz_db znajduje się w pliku adbacz/db.class.php a klasa adbacz_db_mysql w pliku adbacz/db/mysql.class.php. Takie rozwiązanie niestety wymusza konkretną strukturę plików i katalogów, co bardzo utrudnia stosowanie zewnętrznych rozwiązań (gdybyś chciał np. zintegrować doctrine do projektu) drugi sposób to tzw mapa: skanujesz wszystkie pliki i foldery pod kątem plików np. *.class.php, file_get_contents otwierasz po kolei każdy z nich i sprawdzasz czy w środku są definicje klas lub interface. Jeśli jest to zapisujesz to wszystko w tablicy w postaci np. "nazwaKlasy" => 'ścieżka/do/pliku.php', Ważne jest aby taką mapę sobie cache'ować, zwłaszcza w projektach, które mają (lub mają mieć ![]() Osobiście korzystam z opcji drugiej, bo jest ona dla mnie po prostu wygodniejsza, mimo, że cięższa do realizacji. Autoloader w jakiejkolwiek formie (ale dobrze działający - tzn z przeładowaną mapą dla sposobu 2 lub z dobrze zorganizowaną strukturą katalogów i plików dla przykładu 1) zapewni CI automatyczne dołączanie klas jak tylko będziesz chciał utworzyc nowy obiekt, czy skorzystać z metody statycznej. w dziale "pro" rozwinęła się ciekawa dyskusja na temat właśnie autoloaderów i zarządzania plikami: Temat: Wlaczanie plikow autoloader Ten post edytował vee 13.10.2011, 07:21:49 |
|
|
![]()
Post
#3
|
|
![]() Newsman Grupa: Moderatorzy Postów: 2 033 Pomógł: 290 Dołączył: 21.12.2007 Skąd: Łódź ![]() |
Cytat 1. Jak przesyłać dane do widoku? Chodzi mi o powiedzmy jedną wielka tablicę asocjacyjną, w której będą pod odpowiednimi indeksami odpowiednie dane i wysłać ją do widoku, żeby tam była widoczna. Po zwykłym includowaniu pliku widoku (przez widok rozumiem większośc kodu HTML z dodatkami php) nie było widać żadnych zmiennych, i w tym problem, bo chyba tak powinno być. Czytałem kod w CI, żeb zobaczyć jak tam jest to rozwiązane, ale od czytania tego kodu rozbolała mnie głowa a najgorsze, że nic z tego nie zrozumiałem ;/ Abstrakcyjna klasa widoku (i dziedziczące po niej klasy konkretnych widoków) może posiadać tablicę w postaci klucz => wartość, gdzie klucz odpowiada zmiennej wyświetlanej w widoku, a wartość - jej zawartość. W kontrolerze możesz ustawiać te zmienne np. tak:
i teraz widok wywołany przez ten kontroler:
To tylko jedno z możliwych rozwązań. -------------------- Life's simple... You make choices and don't look back...
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
blooregard - coś właśnie takiego udało mi się w nocy sklecić. Mamy nadrzędną klasę View z metodami do ustawiania tytułów, stylów, tagów META itd, oraz główną metodę z szablonem strony (większość kodu HTML plus wstawki pól tej klasy) i po wywołaniu tej metody zostaje wyświetlone wszystko co zostało zapisane w odpowiednich polach klasy View. Dodatkowo, można stworzyć dodatkową klasę dziedziczącą po klasie View i w niej zawrzeć mniejsze, dodatkowe metody, które sa małymi widokami do których można wysyłać dane w postaci tablic. A że w głównej klasie jest metoda, która w zależności od drugiego parametry albo dopisuje do pola $this->sContent treść strony (html) albo zapisuje tylko podaną treść, można też w klasie podrzędnej dodawać na końcu każdej metody metodę z klasy nadrzędnej, by w samym kontrolerze pisac tylko nasze dodatkowo napisane metody, które to zajmą sie i generowaniem HTML, i przesyłaniem wszystkiego do głównego pola klasy View.
Tylko teraz tak się zastanawiam, jeśli w głównym polu klasy View, $this->sContent, można tylko dopisywać lub nadpisywać dane, to czy nie wyjdzie na to, że kontroler w pewnym sensie będzie generował widok tak, jaka jest kolejność wywoływanych w nim dodatkowych metod z klasy podrzędnej? Wiecie o co mi chodzi? No chyba, że rozwiązac to jakoś inaczej, dodatkowo dodać nowe pola w klasie podrzędnej i do nich zapisywać odpowniedni kod HTML wygenerowany w mniejszych metodach a na końcu, po wygenerowaniu wszystkich danych, uruchomić gówną metodę w klasie podrzędnej View, która nam to wszystko skleci w logiczną, zależną od nas całość (bo ustawimy sobie kolejność wyświetlania danych z pól klasy podrzędnej jak będziemy chcieli w danym momencie) i dodatkowo wywoła metode z klasy nadrzędnej, która nam wyświetli juz gotowy kod HTML, całą stronę. Ten post edytował adbacz 13.10.2011, 13:08:08 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 31.07.2025 - 10:33 |