![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) ![]() ![]() |
Tak wlasnie siedze i mysle sobie, bo chce przepisac swoja aplikacje z GOD classes na prawdziwe OOP. Chce aby kazda klasa reprezentowala jeden typ danych, np. klasa Articles ma metody tworzace obiekty klasy Article, ktora posiada z kolei metody zwracajace dane danego artykulu. Ale jest problem... Artykuly w bazie danych polaczone sa relacyjnie z Article_Type, oraz Category. I problem w tym, ze klasa Article_Type to tylko article_type z DB, Category to tylko category z DB. W templejcie potrzebuje wyswietlic artykuly wraz z ich kategoria oraz typem (np. test, recenzja czy cokolwiek innego). I nie wiem, jak mam polaczyc te obiekty. Moge oczywiscie zrobic wywolanie obiektu Category z Article, ale to za kazdym wyswietleniem danych tworzy jedno zapytanie do bazy o nazwe kategorii. Ma ktos jakis pomysl?
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 11.01.2004 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Cytat zastanawiam sie jak zdolacie zaprojektowac klasy zwlaszcza wybierajace dane z baz danych np. artykuly, wraz z powiazaniem relacyjnym owych tablic. czy zrobicie moze GOD classes, co jest bledem?
W A1 Internet poradziliśmy sobie w ten sposób, że połączyliśmy klasy generowane przez DB_DataObject (http://pear.php.net/package/DB_DataObject) z klasami - kontrolerami poszczególnych stron albo modułów na stronie. W praktyce wygląda to tak, że w oparciu o każdą z tabel w bazie danych automatycznie tworzona jest klasa - model (DAO), w której możemy nadpisać np. metodę wyciągającą, uaktualniającą albo usuwającą dane. Możemy też dopisać nowe metody. Zazwyczaj z DAO korzysta się w taki sposób: [php:1:b04b93a0cc] <?php $article=&new Model_Article; $article->get('id',2343); $article->find(); // tworzy zapytanie SQL i wykonuje je $article->fetch(); // pobiera pierwszy (i jedyny) z wyników print($article->title); // teraz możemy zobaczyć tytuł artykułu ?> [/php:1:b04b93a0cc] Tak mniej więcej wygląda kontroler strony wyświetlającej konkretny artykuł, tyle że bez ostatniej linii (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , bowiem obiekt $article przekazujemy do szablonu. A co zrobić jeśli chcemy wyciągnąć kilka artykułów? Wycwaniliśmy się i jeśli chcemy np. wyświetlić 10 ostatnich artykułów, dodajemy do klasy DAO taką oto metodę: [php:1:b04b93a0cc] <?php class Model_Article { // [...] function findLast($limit=10) { $this->selectAdd(); // w DB_DataObject kasuje listę pól $this->selectAs(array('id','title','time_added','abstract','author')); // wyciągamy tylko niektóre pola $this->orderBy('time_added DESC'); $this->limit($limit); $this->find(); } //[...] } ?> [/php:1:b04b93a0cc] Z kolei w klasie - kontrolerze strony wyświetlającej ostatnie wiadomości dajemy taki oto kod: [php:1:b04b93a0cc] <?php $article=&new Model_Article; $article->findLast(); $this->publish('article',$article); // tutaj przekazujemy obiekt $article do szablonu ?> [/php:1:b04b93a0cc] Szablon zaś wygląda tak: [xml:1:b04b93a0cc] <div id="articlelast"> <dl> {while $article->fetch()} <dt> {$article->title}<br /> <small>{$article->time_added}</small> </dt> <dd> {$article->abstract} </dd> {/while} </dl> </div> [/xml:1:b04b93a0cc] Powyższy szablon wykorzystuje naszą klasę A1_Template (znaną też jako Template_A1), którą niedługo udostępnimy na licencji LGPL. Powiązaniami relacyjnymi tabeli article z innymi tabelami zająć się może DB_DataObject. Związane z tym metody wywołać można w klasie - kontrolerze strony albo ewentualnie nadpisanej metodzie w klasie DAO. Jeśli ktoś zna lepszy sposób na rozwiązanie tej kwestii, ma u mnie zimne piwo (lub czasopisma). |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 13:57 |