Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] optymalna klasa kategorii, do poprawki
Forum PHP.pl > Forum > PHP
herbatniczek
witam, mam dla Was wielką prośbe...

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
  1. <?php 
  2. class wezel_drzewa_kat{ 
  3.  
  4. var $c_kategoria_ID; //identyfikator kategorii 
  5. var $c_nazwa; //nazwa kategorii 
  6. var $c_potomek; //istnienie potomka, wartość 0/1 
  7. var $c_lista_pot; //lista podkategorii 
  8. var $c_glebokosc; //stopień zagnieżdżenia kategorii 
  9. var $c_rodzic;  //identyfikator przodka kategorii 
  10.  
  11. //konstruktor klasy wypełnia zmienne składowe 
  12. function wezel_drzewa_kat($kategoria_ID, $nazwa, $potomek, $glebokosc, $rozwiniety, $rodzic){ 
  13.  
  14. $this->c_kategoria_ID=$kategoria_ID; 
  15. $this->c_nazwa=$nazwa; 
  16. $this->c_potomek=$potomek; 
  17. $this->c_lista_pot=array(); 
  18. $this->c_glebokosc=$glebokosc; 
  19. $this->c_rodzic=$rodzic; 
  20.  
  21. if ($potomek){ //jeśli istnieją podkategorie, są dodawane do listy  podkategorii 
  22. $wynik=mysql_query('select * from kategorie where  przodek=\"'.$kategoria_ID.'\"'); 
  23.  
  24.  for($licznik=0;$rzad=@mysql_fetch_array($wynik);$licznik++) 
  25. { 
  26. $this->c_lista_pot[$licznik]=new  wezel_drzewa_kat($rzad['kategoria_ID'],  htmlspecialchars(stripslashes($rzad['nazwa'])), 
  27. $rzad['potomek'],$glebokosc+1,$rozwiniety,$this); 
  28.  } 
  29. } 
  30. } 
  31.  
  32. function pobierz_rownorzedne($kategoria_ID){ //funkcja rekurencyjna, lokalizjue miejsce pobranej kategorii w strukturze drzewa 
  33.  ustawia $_SESSION['rozwiniety'][kategoria_ID] dla niej i wszystkich przodków w górę hierarchii drzewa, dzięki temu kolejn
  34.  węzły drzewa są wytłuszczone w menu 
  35. $i=0; 
  36. if ($this->c_kategoria_ID==$kategoria_ID) 
  37. { 
  38. unset($_SESSION['rozwiniety']); 
  39. $_SESSION['rozwiniety'][$this->c_kategoria_ID]=true; 
  40. $kursor=$this; 
  41. for($k=0;$k<=$kursor->c_glebokosc+1;$k++){ 
  42. $_SESSION['rozwiniety'][$kursor->c_rodzic->c_kategoria_ID]=true; 
  43. $kursor=$kursor->c_rodzic; 
  44. } 
  45. } 
  46. $ilosc_potomek=sizeof($this->c_lista_pot); 
  47. while ($i<$ilosc_potomek && $this->c_kategoria_ID!=$kategoria_ID){ 
  48. $this->c_lista_pot[$i]->pobierz_rownorzedne($kategoria_ID); 
  49. $i++; 
  50.  } 
  51.  return true; 
  52.  } 
  53.  
  54. function szukaj_kat($kategoria_ID){ //funkcja rekurencyjna, lokalizuje miejsce kategorii w strukturze drzewa i zwraca 
  55. dpowiedni węzeł 
  56.  
  57. $i=0; 
  58. $ilosc_potomek=sizeof($this->c_lista_pot); 
  59. while ($i<$ilosc_potomek && $this->c_lista_pot[$i]- >c_kategoria_ID!=$kategoria_ID) 
  60. { 
  61.  $this->c_lista_pot[$i]->szukaj_kat($kategoria_ID); 
  62.  $i++; 
  63. } 
  64. if ($this->c_lista_pot[$i]->c_kategoria_ID==$kategoria_ID){ 
  65.  
  66. $wynik= $this->c_lista_pot[$i]; 
  67. global $wezel; 
  68. $wezel=$wynik; 
  69. return true; 
  70.  } 
  71. return false; 
  72. } 
  73.  
  74.  
  75.  
  76. function kateg_w_dol(){ //funkcja rekurencyjna, dla danego węzła tworzy listę podkategorii i zwraca w post
  77. ci tablicy 
  78. global $lista_podk_kategoria_ID; 
  79. $liczba=count($lista_podk_kategoria_ID); 
  80. $lista_podk_kategoria_ID[$liczba]=$this->c_kategoria_ID; 
  81. $k=0; 
  82. $ilosc_potomek=sizeof($this->c_lista_pot); 
  83. if($ilosc_potomek==&& $liczba==0){ 
  84. $lista_podk_kategoria_ID[0]=$this->c_kategoria_ID; 
  85. return $lista_podk_kategoria_ID; //brak podkategorii 
  86. } 
  87. while ($k<$ilosc_potomek){ 
  88. $this->c_lista_pot[$k]->kateg_w_dol(); 
  89. $k++; 
  90.  } 
  91.  // return $lista_podk_kategoria_ID; 
  92. return true; 
  93. } 
  94.  
  95. function wyswietl(){ //funkcja rekurencyjna wyświetlająca hierarchiczne menu kategorii 
  96.  
  97. for($i=0;$i<$this->c_glebokosc;$i++){ 
  98. echo '&nbsp&nbsp'; 
  99. } 
  100. if ($this->c_glebokosc>-1){ 
  101.  if ($_SESSION['rozwiniety'][$this->c_kategoria_ID]) 
  102.  { 
  103. echo '<a href=\"index.php?strona=kategorie&kategoria_ID='.$this->c_kategoria_ID.'\"><b>'.htmlspecialchars(stripslashes($this->c_nazwa)).'</b></a><br>'; 
  104. }else{ 
  105. echo '<a href=\"index.php?strona=kategorie&kategoria_ID='.$this->c_kategoria_ID.'\">'.htmlspecialchars(stripslashes($this->c_nazwa)).'</a><br>'; 
  106.  } 
  107.  
  108. if($_SESSION['rozwiniety'][$this->c_kategoria_ID]) { 
  109.  
  110. $ilosc_potomek=sizeof($this->c_lista_pot); 
  111.  for($i=0;$i<$ilosc_potomek;$i++){ 
  112. $this->c_lista_pot[$i]->wyswietl(); 
  113. } 
  114. } 
  115. } 
  116. else { 
  117.  $ilosc_potomek=sizeof($this->c_lista_pot); 
  118.  for($i=0;$i<$ilosc_potomek;$i++) { 
  119.  $this->c_lista_pot[$i]->wyswietl(); 
  120.  } 
  121. } }; 
  122. ?>
NuLL
Ten temat tu nie pasuje mad.gif - nie to froum.
DeyV
pro -> php
herbatniczek
on był pro, został chyba przeniesiony
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.