Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie danych z Kontrolera do Widoku
Forum PHP.pl > Forum > PHP > Object-oriented programming
adbacz
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:

  1. function load_class($class, $type) {
  2. if(file_exists(BASEPATH.APP_FOLDER.'\\'.$type.'\\'.$class.'.php')) {
  3. include_once(BASEPATH.APP_FOLDER.'\\'.$type.'\\'.$class.'.php');
  4. return new $class();
  5. }
  6. else {
  7. show_error('Brak pliku/klasy: '.BASEPATH.APP_FOLDER.'\\'.$type.'\\'.$class.'.php');
  8. }
  9. }

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.
vee
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ć smile.gif ) wiele składników. Wtedy aby przeładować autoloader wystarczy np. usunąć plik cache i mapa zostanie wygenerowana jeszcze raz.

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
blooregard
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:

  1. ... // jakis kod
  2. $this->view = new View() // deklarujemy skladowa kontrolera reprezentujaca obiekt widoku
  3.  
  4. ...
  5. $this->view->setElement('naglowek', "Witam na mojej stronie"); // ustawienie zmiennej widoku w tablicy
  6. ...



i teraz widok wywołany przez ten kontroler:
  1. <html>
  2. <head>
  3. ....
  4. </head>
  5.  
  6. <body>
  7. <h1><?=$this->getElement('naglowek')?></h1> // tu nastepuje pobranie wartosci elementu tablicy o kluczu 'naglowek'
  8. <div>
  9. lorem ipsum....
  10. </div>
  11.  
  12. ...
  13. </html>


To tylko jedno z możliwych rozwązań.
adbacz
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ę.
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.