jeśli komuś się chce, to wejrzyjcie w kod poniższej klasy, która generuje drzewo kategorii w mojej aplikacji i moze daloby sie ją jakoś poprawic, wyglądała bardziej profesjnalnie...
Klasa jest juz podczepiona pod wiekszy projekt, wiec wazne jest, zeby funkcje zwracaly te same wyniki, no chyba ze jakas lzejsza przeróbka...
Klasa dziala.. tylko mam problem typu: funkcja szukaj_kat ma znaleźć kategorie podaną w parametrze, (musi byc parametr, bo drzewo stworzone jest na pczątku całe i robie $this->szukaj_kat(4) na przyklad) i zwrócić węzeł...
Narazie robie to przez
global $wezel;
$wezel=$wynik;
gdzie $wezel jest zdefiniowany w kodzie nad $drzewo = new .....
, nie dziala to przez return $wezel, wiec nie moge zrobic czegos takiego:
$wezel=$this->szukaj_kat(4); wtedy wezel nie jest obiektem. to chyba wynika z rekurencyjnosci tej funkcji, ale nie wiem jak ją zatrzymać w odpowiednim momencie...
Do klasy będzie potrzebna tabela kategorie:
PK kategoria_ID // id kategorii
nazwa //nazwa kategorii
potomek //istnienie potomka 0/1
przodek //id przodka kategorii
<?php class wezel_drzewa_kat{ var $c_kategoria_ID; //identyfikator kategorii var $c_nazwa; //nazwa kategorii var $c_potomek; //istnienie potomka, wartość 0/1 var $c_lista_pot; //lista podkategorii var $c_glebokosc; //stopień zagnieżdżenia kategorii var $c_rodzic; //identyfikator przodka kategorii //konstruktor klasy wypełnia zmienne składowe function wezel_drzewa_kat($kategoria_ID, $nazwa, $potomek, $glebokosc, $rozwiniety, $rodzic){ $this->c_kategoria_ID=$kategoria_ID; $this->c_nazwa=$nazwa; $this->c_potomek=$potomek; $this->c_glebokosc=$glebokosc; $this->c_rodzic=$rodzic; if ($potomek){ //jeśli istnieją podkategorie, są dodawane do listy podkategorii { $this->c_lista_pot[$licznik]=new wezel_drzewa_kat($rzad['kategoria_ID'], htmlspecialchars(stripslashes($rzad['nazwa'])), $rzad['potomek'],$glebokosc+1,$rozwiniety,$this); } } } function pobierz_rownorzedne($kategoria_ID){ //funkcja rekurencyjna, lokalizjue miejsce pobranej kategorii w strukturze drzewa ustawia $_SESSION['rozwiniety'][kategoria_ID] dla niej i wszystkich przodków w górę hierarchii drzewa, dzięki temu kolejn węzły drzewa są wytłuszczone w menu $i=0; if ($this->c_kategoria_ID==$kategoria_ID) { $_SESSION['rozwiniety'][$this->c_kategoria_ID]=true; $kursor=$this; for($k=0;$k<=$kursor->c_glebokosc+1;$k++){ $_SESSION['rozwiniety'][$kursor->c_rodzic->c_kategoria_ID]=true; $kursor=$kursor->c_rodzic; } } while ($i<$ilosc_potomek && $this->c_kategoria_ID!=$kategoria_ID){ $this->c_lista_pot[$i]->pobierz_rownorzedne($kategoria_ID); $i++; } return true; } function szukaj_kat($kategoria_ID){ //funkcja rekurencyjna, lokalizuje miejsce kategorii w strukturze drzewa i zwraca dpowiedni węzeł $i=0; while ($i<$ilosc_potomek && $this->c_lista_pot[$i]- >c_kategoria_ID!=$kategoria_ID) { $this->c_lista_pot[$i]->szukaj_kat($kategoria_ID); $i++; } if ($this->c_lista_pot[$i]->c_kategoria_ID==$kategoria_ID){ $wynik= $this->c_lista_pot[$i]; $wezel=$wynik; return true; } return false; } function kateg_w_dol(){ //funkcja rekurencyjna, dla danego węzła tworzy listę podkategorii i zwraca w post ci tablicy $lista_podk_kategoria_ID[$liczba]=$this->c_kategoria_ID; $k=0; if($ilosc_potomek==0 && $liczba==0){ $lista_podk_kategoria_ID[0]=$this->c_kategoria_ID; return $lista_podk_kategoria_ID; //brak podkategorii } while ($k<$ilosc_potomek){ $this->c_lista_pot[$k]->kateg_w_dol(); $k++; } // return $lista_podk_kategoria_ID; return true; } function wyswietl(){ //funkcja rekurencyjna wyświetlająca hierarchiczne menu kategorii for($i=0;$i<$this->c_glebokosc;$i++){ } if ($this->c_glebokosc>-1){ if ($_SESSION['rozwiniety'][$this->c_kategoria_ID]) { echo '<a href=\"index.php?strona=kategorie&kategoria_ID='.$this->c_kategoria_ID.'\"><b>'.htmlspecialchars(stripslashes($this->c_nazwa)).'</b></a><br>'; }else{ echo '<a href=\"index.php?strona=kategorie&kategoria_ID='.$this->c_kategoria_ID.'\">'.htmlspecialchars(stripslashes($this->c_nazwa)).'</a><br>'; } if($_SESSION['rozwiniety'][$this->c_kategoria_ID]) { for($i=0;$i<$ilosc_potomek;$i++){ $this->c_lista_pot[$i]->wyswietl(); } } } else { for($i=0;$i<$ilosc_potomek;$i++) { $this->c_lista_pot[$i]->wyswietl(); } } }; ?>