Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php + mysql] Menu
Forum PHP.pl > Forum > PHP
luki100011
Witam
Zaczne tak oto kod sql
  1. CREATE TABLE `menu` (
  2. `id` int(8) NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(30) NOT NULL,
  4. `potomek` int(8) NOT NULL DEFAULT '0',
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=8 ;
  7.  
  8. --
  9. -- Zrzut danych tabeli `menu`
  10. --
  11.  
  12. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (1, 'meble', 0);
  13. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (2, 'krzesla', 0);
  14. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (3, 'szafy', 1);
  15. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (4, 'sofy', 1);
  16. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (5, 'fotele', 1);
  17. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (6, 'drewniane', 3);
  18. INSERT INTO `menu` (`id`, `nazwa`, `potomek`) VALUES (7, 'drewnopodobno', 3);


Oraz kod php wyswietlajacy zawartosc menu z moziwoscio klikania i zaglebiania sie w strukture:
meble / szafy / ..
  1. <?php
  2. $polaczenie=mysql_connect('sql','sql,'sql');
  3. mysql_select_db('sql',$polaczenie);
  4. //
  5. $tmp=explode(',',$co);
  6. echo $tmp[1].'<br>';
  7. $zap=mysql_query('select * from menu where potomek=0');
  8. while($row=mysql_fetch_assoc($zap)){
  9. echo '<a href="?co='.$row['id'].'">'.$row['nazwa'].'</a><br>';
  10. if ($row['id']==$tmp[0]){
  11. $$tmp[0]=mysql_query('select * from menu where potomek='.$tmp[0]);
  12. while($row=mysql_fetch_assoc($$tmp[0])){
  13. echo '--><a href="?co='.$tmp[0].','.$row['id'].'">'.$row['nazwa'].'</a><br>';
  14. //
  15. if ($row['id']==$tmp[1]){
  16. $$tmp[1]=mysql_query('select * from menu where potomek='.$tmp[1]);
  17. while($row=mysql_fetch_assoc($$tmp[1])){
  18. echo '----><a href="?co='.$tmp[0].','.$tmp[1].','.$row['id'].'">'.$row['nazwa'].'</a><br>';
  19. }
  20. }
  21. //
  22. }
  23. }
  24. }
  25. //
  26. mysql_close($polaczenie);
  27. ?>


Jak do tej pory wystarczalo mi zagniezdzanie sie do tej liczby elementow - 3. Robulem to na warunkach if i dziala nie najgorzej.
To rozwiazanie ma nastepujacy problem - ano jak zmeinic warunki if na petle ktora sama bedzie potrafila okreslic jak daleko ma sie zagniezdzac. Czyli czy to 2, 5, 10... poziom podmenu.

A moze inne rozwiazania questionmark.gif
zleek
zrób sobie funkcję rekurencyjną do której będziesz przekazywał za każdym razem id odpowiadające polu potomek z bazy. W ten sposób możesz sobie menu zagnieżdżać bez ograniczeń
luki100011
Wstyd sie przyznac ale co to jest: funkcja rekurencyjnaquestionmark.gif
A wlasciwie jak to wykorzystac.
Nie chcialbym uzyskac efektu ze wszystkie podkatalogi mi sie rozwina tak jak to ma miejsce przy metodach "drzewek" chcialbym aby zostala taka funkcjonalnosc jak obecnei ale z wieksza liczna zaglenien.
zleek
Cytat(luki100011 @ 29.03.2007, 12:08:42 ) *
Wstyd sie przyznac ale co to jest: funkcja rekurencyjnaquestionmark.gif
A wlasciwie jak to wykorzystac.
Nie chcialbym uzyskac efektu ze wszystkie podkatalogi mi sie rozwina tak jak to ma miejsce przy metodach "drzewek" chcialbym aby zostala taka funkcjonalnosc jak obecnei ale z wieksza liczna zaglenien.


Funkcja rekurencyjna jest to funkcja, która wywołuje bezpośrednio sama siebie lub pośrednio przez inną funkcję.

Tak na szybko z głowy napiszę Ci w punktach jakby to wyglądało:

  1. <?php
  2. function getMenu($potomek)
  3. {
  4. $query = "select id, nazwa where potomek='".$potomek."'";
  5. $res = mysql_query($query);
  6. while($row = mysql_fetch_row($res))
  7.  {
  8.  echo $row[1]."<br />";
  9.  getMenu($row[0]);
  10.  }
  11. }
  12.  
  13. getMenu(0);
  14. ?>


W skrócie działa to tak, że wywołujesz funkcje getMenu z parametrem 0, czyli pobierze z bazy wszystkie rekordy ktore w polu potomek maja 0. Następnie dla każdego takiego rekordu następuje wywołanie getMenu z parametrem będącym id rekordu, dzięki czemu pobrane zostaną wszystkie rekordy podrzędne dla tego rekordu. itd...
luki100011
Dzieki i tu kolejny problem wszytsko dzial niby dobrze ale ywswietla sie cale drzewo z wszystkimo rozgaleziami a ja chce miec mozliwosc wyboru przez klik co ma mi sie pojawic ;-)

Jakas rada dla twojej funkcji jak to uzyskac questionmark.gif
zleek
Dodać kolejny element do parametrów funkcji który będzie identyfikatorem aktualnie klikniętej pozycji i to odpowiednio ropoznawać wewnątrz funkcji.
luki100011
Wydubalem cos takiego i dizla tylko do pzoiomu pierwszego pod zostalych galezi nei rozwija.

  1. <?php
  2. function getMenu($co,$coo=0)
  3. {
  4. $tmp=explode(',',$co);
  5. $potomek=$tmp[0];
  6. $query = "select * from menu where potomek=".$potomek;
  7. $res = mysql_query($query);
  8. while($row = mysql_fetch_assoc($res))
  9.  {
  10.  echo '<a href="?co='.$coo.','.$row['id'].'">'.$row['nazwa'].'</a><br>';
  11.  if ($tmp[1]==$row['id']) getMenu($row['id'],$co);
  12.  }
  13. }
  14. if ($co==null) $co=0;
  15. getMenu($co);
  16. //przykladowe $co='0,1,3'
  17. ?>
zleek
Nikt nie powiedział że będzie to proste snitch.gif
Musisz albo za każdym razem sprawdzać sobie jakie pozycje muszą być rozwinięte aby dotrzeć do aktywnej pozycji i je rozwinąć, albo (wydaje mi się że prostsze rozwiązanie) przechowywać w zmiennej lub tablicy ścieżkę zawierającą id klikniętych pozycji i jeżeli dane id znajdzie się w tej ścieżce to rozwinąć pozycję o zadanym id.

Mam nadzieję ze nie zakręciłem za bardzo
luki100011
dzięki za pomoc. Udało sie.

Ale teraz kolejny problem w gałęzi mam pod kategorie które maja określoną ilość produktów np. w sumie 30.
jak w gałęzi głównej zliczyć ile jest produktów w podkategoriach questionmark.gif
np

główna (10)
-----Pod a(5)
-----Pod b(2)
-----Pod c (3)
|----------Pod c A (1)
|----------Pod c B (2)

Pomocy
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.