Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Menu, submenu, subsubmenu, subsubmenu
Forum PHP.pl > Forum > Przedszkole
Blajo
Potrzebuję zrobić menu kategorii i podkategorii wyciąganych z bazy danych o strukturze

id_menu | nazwa | rodzic

id_menu - wiadomo
nazwa - wiadomo
rodzic - id_menu rodzica

Napisałem, działa i jest OK. Ale są na sztywno zaimplementowane 3 poziomy. Więc mam pytanie jak to napisać, żeby dynamicznie sam wyświetlał wszystkie menu i podmenu? Nawet w przypadku, kiedy będzie 20 podmenu?

Efekt jaki chcę osiągnąć:

1
-1.1
-1.2
-1.3
--1.3.1
--1.3.2
--1.3.3
-1.4
2
-2.1
-2.2
3
4
5
-5.1
-5.2

Ale podmenu dopiero widoczne po kliknięciu. Wersja online znajduje się pod adresem www.iseasy.pl/menu.php

A oto kod pisany "na sztywno".

  1. <?php
  2.  
  3. mysql_connect("localhost", "root", "");
  4.  
  5. $zapytanie = "SELECT * FROM menu WHERE rodzic = 0";
  6. $pobierz = mysql_query($zapytanie);
  7.  
  8. ?>
  9. <p><a href="menu.php">menu</a></p>
  10. <ul>
  11. <?php
  12.  
  13. while( $dane = mysql_fetch_array($pobierz) )
  14. {
  15.  echo "<li><a href='menu.php?id=".$dane['id_menu']."'>".$dane['nazwa']."</a></li>";
  16.  if( $dane['id_menu'] == $_GET['id'] )
  17.  {
  18. $zapytanie2 = "SELECT * FROM menu WHERE rodzic = $_GET[id]";
  19. $pobierz2 = mysql_query($zapytanie2);
  20. echo "<ul>";
  21. while( $dane2 = mysql_fetch_array($pobierz2) )
  22. {
  23.  echo "<li><a href='menu.php?id=".$dane['id_menu']."&id2=".$dane2['id_menu']."'>".$dane2['nazwa']."</a></li>";
  24.  if( $dane2['id_menu'] == $_GET['id2'] )
  25.  {
  26.  $zapytanie3 = "SELECT * FROM menu WHERE rodzic = $_GET[id2]";
  27.  $pobierz3 = mysql_query($zapytanie3);
  28.  echo "<ul>";
  29.  while( $dane3 = mysql_fetch_array($pobierz3) )
  30.  {
  31.  echo "<li><a href='menu.php?id=".$dane['id_menu']."&id2=".$dane2['id_menu']."'>".$dane3['nazwa']."</a></li>";
  32.  }
  33.  echo "</ul>";
  34.  }
  35. }
  36. echo "</ul>";
  37.  }
  38. }
  39. ?>
  40. </ul>


Liczę na pomoc w rozwiązaniu tego problemu.
phpion
Rekurencja to słowo klucz. Piszesz funkcję, która pobiera wszystkie podkategorie (1 poziom) należące do rodzica, czyli WHERE rodzic=$x. Główne kategorie powinny mieć rodzica ustawionego na NULL czyli startujesz od WHERE rodzic IS NULL. Następnie przelatujesz wybrane rekordy i wywołujesz rekurencyjnie funkcję jeszcze raz, tym razem jako parametr podając rodzica aktualnie iterowanego elementu. To w zasadzie tyle. DO tego odpowiednie umiejscowienie <ul> oraz <li> i osiągniecz oczekiwany efekt. Powodzenia!

PS: takie menu jak zaprezentowałeś w linku lepiej zrobić w JS wykorzystując kod wygenerowany przez PHP (na podstawie pomysłu podanego powyżej).
Blajo
Nie, musi być na PHP.

A coś więcej? jakiś przykład?
phpion
Nie jesteś w stanie napisać funkcji, która wyszukuje rekordy o konkretnej wartości rodzica? Nie jesteś w stanie wywołać funkcji jeszcze raz z wnętrza samej siebie? No bez przesady, kombinuj.
Blajo
  1. <?php
  2.  
  3. function rysuj_menu($rodz)
  4. {
  5.  $zapytanie = "SELECT * FROM menu WHERE rodzic = $rodz";
  6.  $pobierz = mysql_query($zapytanie);
  7.  
  8.  echo "<ul>";
  9.  while( $dane = mysql_fetch_array($pobierz) )
  10.  {
  11.  
  12. echo "<li><a href='menu.php?id=".$dane['id_menu']."'>".$dane['nazwa']."</a></li>";
  13. if( $dane['id_menu'] == $_GET['id'] )
  14. {
  15.  echo rysuj_menu($_GET['id'],2);
  16.  
  17. }
  18.  }
  19.  echo "</ul>";
  20. }
  21.  
  22. echo rysuj_menu(0);
  23. ?>


Coś w tym kierunku? Niestety nie spełnia oczekiwanej funkcjonalności...
Piotrwusek
rekrutacją

funkcja wywałana w funckji z jakimś ogranicznikiem
chlebik
Dla szybkosci generowania takiego menu unikalbym rekurencji z ponownie wywolywanym zapytaniem do bazy - wystarczy, ze masz 5 poziomow i juz zaczyna sie to przycinac. Nie lepij po prostu wrzucic zapytanie do bazy i zrobic ORDER na id_rodzica questionmark.gif Potem po prostu to wyswietlic z IFem jesli trzeba.
Blajo
Więc można prosić o przykłady?
antyqjon
http://kapelak.pl/2008/04/04/drzewa-w-mysql/

http://dev.mysql.com/tech-resources/articl...hical-data.html

Poczytaj, może naprowadzi Cię na nieco ciekawsze rozwiązanie.
Blajo
Wszystko przeglądałem, i wszystko jest takie same.
Wypisywanie struktury bez możliwości klikania i przekazywania parametrów co ma zostać rozwinięte.


  1. <?php
  2.  
  3.  
  4. function sideNodes($addr)
  5. {
  6. $query = "SELECT * FROM menu WHERE rodzic = $addr";
  7. $result = mysql_query($query);
  8.  
  9.  
  10. while ($row = mysql_fetch_array($result))
  11. {
  12. echo "<li>";
  13. echo "<a href=?id=".$row['id_menu'].">".$row['nazwa']."</a>";
  14. echo "</li>";
  15. }
  16.  
  17. }
  18.  
  19.  
  20. function treeView($addr)
  21. {
  22. if ($addr == 0) 
  23. {
  24. sideNodes($addr);
  25. return;
  26. }
  27.  
  28. $query = "SELECT * FROM menu WHERE id_menu = $addr";
  29. $result = mysql_query($query);
  30.  
  31. $row = mysql_fetch_array($result);
  32.  
  33. echo '<ul>';
  34. treeView($row['rodzic']);
  35. echo '</ul>';
  36.  
  37. sideNodes($addr);
  38. }
  39.  
  40.  
  41. if( !isset($_GET['id']))
  42. treeView(0);
  43. else
  44. treeView($_GET['id']);
  45.  
  46. ?>



Napisałem taką funkcję, ale nie wy wyświetla tego tak jak chcę. Wiec jak to napisac, żeby było dobrze?
Czy ktoś mi pomoże?
marcinpruciak
Jeszcze aktualne?

też się z tym męczyłem udało mi się osiągnąć taki efekt:

http://195.205.202.32:6893/Szablon/index.php?id=home

O to chodziło?

Zrobiłem to takim kodem:

  1. <?php
  2. $lacz=lacz_bd();
  3.  $zapytanie="select * from strony where rodzic=''";
  4.  $wynik=$lacz->query($zapytanie);
  5.  
  6. ...
  7.  
  8. while($rzad = mysqli_fetch_assoc($wynik))
  9.    {
  10.   echo '<li><a href="index.php?id='.$rzad['id'].'">'.$rzad['tytul_menu'].'</a></li>';
  11.   submenu($rzad['id']);
  12.   }
  13. ?>





  1. <?php
  2. function submenu($id)
  3. {
  4.  $lacz=lacz_bd();
  5.  $zapytanie2="select * from strony where rodzic='$id'";
  6.  $wynik2=$lacz->query($zapytanie2);
  7.  
  8.   while($rzad2=mysqli_fetch_array($wynik2))
  9.   {
  10.   echo $rzad2['tytul_menu'];
  11.   }
  12. }
  13. ?>
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.