Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] [mysql] Wielo poziomowe menu.
Forum PHP.pl > Forum > PHP
bobo168
Mam kod który robi mi wielo poziomowe menu :
  1. <?php
  2. $q = mysql_query('select id,nazwa from podstrony where kategoria=0');
  3. while ($a = mysql_fetch_assoc($q)) {
  4. $nazwa = $a['nazwa'];
  5. $id = $a['id'];
  6. $pod = explode(',', $a['podrzedne']);
  7. ++$i;
  8.  
  9. echo '<option value="'.$id.'">'.$i.'. '.$nazwa.'</option>';
  10.  
  11. $q2 = mysql_query('select id,nazwa from podstrony where kategoria = '.$id);
  12. $a2 = mysql_fetch_assoc($q2);
  13. $nazwa = $a2['nazwa'];
  14. $id = $a2['id'];
  15. echo '<option value="'.$id.'">- '.$nazwa.'</option>';
  16.  
  17.  
  18. }
  19. ?>

No i to mi zrobi do takie postaci :
1. menu
- pod menu
2. menu
- pod menu
- pod menu

itd.

A żeby zrobić 3 poziomowe to by musiał być kod :


  1. <?php
  2. $q = mysql_query('select id,nazwa from podstrony where kategoria=0');
  3. while ($a = mysql_fetch_assoc($q)) {
  4. $nazwa = $a['nazwa'];
  5. $id = $a['id'];
  6. $pod = explode(',', $a['podrzedne']);
  7. ++$i;
  8.  
  9. echo '<option value="'.$id.'">'.$i.'. '.$nazwa.'</option>';
  10.  
  11. $q2 = mysql_query('select id,nazwa from podstrony where kategoria = '.$id);
  12. $a2 = mysql_fetch_assoc($q2);
  13. $nazwa = $a2['nazwa'];
  14. $id = $a2['id'];
  15. echo '<option value="'.$id.'">- '.$nazwa.'</option>';
  16.  
  17. $q3 = mysql_query('select id,nazwa from podstrony where kategoria = '.$id);
  18. $a3 = mysql_fetch_assoc($q3);
  19. $nazwa = $a3['nazwa'];
  20. $id = $a3['id'];
  21. echo '<option value="'.$id.'">- '.$nazwa.'</option>';
  22.  
  23. }
  24. ?>

Itd.

Moje pytanie jest takie : jak to zrobić żeby nie trzeba było pisać tego kodu tyle razy ilu będzie poziomowe menu ? Tylko żeby skrypt wiedział ilu jest poziomowe menu i tyle razy sobie pisał ten kod (oczywiscie za pomocą pętli) ?
woj_tas
Każde element menu ma id swojego rodzica
np:
Kod
id | id_rodzica
-----------------
1 | 0
2 | 0
3 | 0
4 | 0

przy czym id korzenia ma id_rodzica = 0
Kod
c.d.
id | id_rodzica
-----------------
5 | 1
6 | 1
7 | 3
8 | 4


otrzymujemy:
Kod
wynik
id | id_rodzica
-----------------
--1 (id_rodzica = 0)
----5 (id_rodzica = 1)
----6 (id_rodzica = 1)
--2 (id_rodzica = 0)
--3 (id_rodzica = 0)
----7 (id_rodzica = 3)
--4 (id_rodzica = 0)
----8 (id_rodzica = 4)


Zaletą takiego drzewa jest to ze można do niego dodawać kolejne galezie.

Jezeli chodzi o funkcje ktora pobiera drzewo z bazy proponowałbym sie zainteresować rekurencją smile.gif
misiek172
polecam drzewko folderów nospor'a, znajduje się tam klasa którą można użyć do generowania takiego menu poziomu do n
bobo168
A gdzie mogę znaleźć tą klasę ? Szukałem w google ale nic nie znalazłem :/
Ps. Macie jakieś inne pomysły bo ten co podal woj_tas to zadziała tyko dla jedno poziomego menu (tak jak moj podany w 1 poscie :/)
.radex
poszukaj na forum jakikolwiek post nospor'a i z opisu przejdź do tematu z klasą Tree.
misiek172
http://forum.php.pl/index.php?showtopic=54683&hl= tu masz link do drzewka nospora
woj_tas
Cytat(bobo168 @ 8.05.2007, 14:32:34 ) *
Ps. Macie jakieś inne pomysły bo ten co podal woj_tas to zadziała tyko dla jedno poziomego menu (tak jak moj podany w 1 poscie :/)

Przeciez napisalem ze mozna dodawac dowolnie galezie. Drzewo mozesz rozbudowywać :

Kod
--1 (id_rodzica = 0)
----5 (id_rodzica = 1)
------6 (id_rodzica = 5)
--------9 (id_rodzica = 6)
----------10(id_rodzica = 9)
--2 (id_rodzica = 0)
bobo168
Cytat(woj_tas @ 8.05.2007, 20:43:46 ) *
Przeciez napisalem ze mozna dodawac dowolnie galezie. Drzewo mozesz rozbudowywać :

Kod
--1 (id_rodzica = 0)
----5 (id_rodzica = 1)
------6 (id_rodzica = 5)
--------9 (id_rodzica = 6)
----------10(id_rodzica = 9)
--2 (id_rodzica = 0)


A jak zrobisz coś takiego:

Kod
1.Menu
   -  podkategoria
     - jakas strona
     - jakas strona
   - jakas strona
   -  podkategoria2
     - jakas strona
     - jakas strona

itd.
-=Peter=-
Poniższa funkcja generuje "drzewko", na początek podajesz jej parametry 0,0 (albo jako pierwsze podajesz id od którego ma zacząć generację). Struktura bazy danych to "id|id_nadrzedne|nazwa". (możliwe że gdzieś popełniłem błąd, bo pisałem praktycznie z pamiecie i nie sprawdzałem tego kodu, ale wiem że takie rozwiązanie skótkuje, gdyż jakiś czas temu z niego korzystałem).

  1. <?php
  2. function drzewko($id_nadrzedne, $wciecie){
  3. $query = "select id, id_nadrzedne, nazwa from tabela where id_nadrzedne=$id_nadrzedne";
  4. $result = mysql_query($query);
  5.  
  6. while($row = mysql_fetch_assoc($result)){
  7. for($i=0, $i<$wciecie;$i++){
  8. echo "&nbsp;";
  9. }
  10. echo $row['nazwa'].'<br/>';
  11. drzewko($row[$id], $wciecie+1);
  12. }
  13. }
  14. ?>
woj_tas
Cytat(bobo168 @ 8.05.2007, 21:28:28 ) *
A jak zrobisz coś takiego:

Kod
1.Menu
   -  podkategoria
     - jakas strona
     - jakas strona
   - jakas strona
   -  podkategoria2
     - jakas strona
     - jakas strona

itd.


Kod
1.Menu (id_rodzica = 0)
   - 2 podkategoria (id_rodzica = 1)
     - 3 jakas strona (id_rodzica = 2)
     - 4 jakas strona (id_rodzica = 3)
   - 5 jakas strona (id_rodzica = 1)
   - 6 podkategoria2 (id_rodzica = 5)
     - 7 jakas strona (id_rodzica = 6)
     - 8 jakas strona (id_rodzica = 7)


Może źle sie zrozumielismy, ale w taki sposób jak podaje można tworzyc dowolnie rozbudowane menu.
Ty w swoim menu od razu dzielisz na menu glowne i podkategorie oraz strony. Ja traktuje kazdy element menu jednakowo. Bo przeciez nie wiesz do konca czy w trakcie rozbudowy nie bedziesz musial podzielic "strony" w sowim menu i zrobic z niej podkategorie.... Kwestią jest tylko jak pobierzesz te dane z bazy oraz jak pozniej je wyswietlisz...

EDIT:
Dokladnie tak jak napisał -=Peter=- . Ewentualnie mozna w zapytaniu dodac jeszcze sprawdzanie czy istnieje jakis artykul o id_rodzica równym id artykulu. Dla calego drzewa fukcje wywolujemy z parametrem id_nadrzedne = 0.
bobo168
Cytat(-=Peter=- @ 9.05.2007, 00:02:02 ) *
  1. <?php
  2. function drzewko($id_nadrzedne, $wciecie){
  3. $query = "select id, id_nadrzedne, nazwa from tabela where id_nadrzedne=$id_nadrzedne";
  4. $result = mysql_query($query);
  5.  
  6. while($row = mysql_fetch_assoc($result)){
  7. for($i=0, $i<$wciecie;$i++){
  8. echo "&nbsp;";
  9. }
  10. echo $row['nazwa'].'<br/>';
  11. drzewko($row[$id], $wciecie+1);
  12. }
  13. }
  14. ?>


Wszystko fajnie działa oprócz tego że te wcięcie nie działa :/ Nie wiecie jak to zrobić żeby działało ?
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.