Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Lista grup - rozwijanie klikniecie po kliknieciu
Forum PHP.pl > Forum > PHP
luckyluc
Witam programistów smile.gif

Probuje znalezc rozwiazane na nastepujacy problem. Mam tabela z lista grup. W tablicy jest kolumna parent odpowiedzialna za tworzenie podgrup:


grupy_id | grupy_parent | grupy_nazwa
1 | 0 | Produkty
2 | 0 | Przetwory
3 | 0 | Odpady
4 | 1 | Owoce
5 | 1 | Warzywa
6 | 4 | Gruszki
7 | 4 | Mango
8 | 5 | Banany
9 | 8 | Świeże
10 | 8 | Stare
11 | 2 | Mleczne


Z wypisaniem struktury grup nie mam problemu. Nazwa grupy [grupy_id]


- Produkty [1]
----Owoce [4]
------------Gruszki [6]
------------Mango [7]
------------Banany [8]
------------------------Świeże [9]
------------------------Stare [10]
----Warzywa [5]
- Przetwory [2]
----Mleczne [11]
- Odpady [3]

Niestety nie wiem jak wypisac krok po kroku, a raczej klikniecie po kliknieciu pewnej struktury tabeli. Dokladnie chcialbym wykonac cos takiego, aby na podstawie zmiennej $group rozwilal grupe i jej podrupy. Sprawdzal od konca czy w podanym id istnieja podrupy. Jesli tak to je wypisuje.


1. Pierwszy widok (klikam w Produkty - index.php?group=1)

- Produkty [1]
- Przetwory [2]
- Odpady [3]

2. Drugi widok (klikam w Owoce - index.php?group=4)

- Produkty [1]
----Owoce [4]

- Przetwory [2]
- Odpady [3]

3. Trzeci widok (klikam w Banany - index.php?group=8)

- Produkty [1]
----Owoce [4]
------------Gruszki [6]
------------Mango [7]
------------Banany [8]

- Przetwory [2]
- Odpady [3]


4. Czwarty widok. Ostatni poziom zagnieżdżenia w tym przykladzie. (klikam w Przetwory - index.php?group=2)

- Produkty [1]
----Owoce [4]
------------Gruszki [6]
------------Mango [7]
------------Banany [8]
------------------------Świeże [9]
------------------------Stare [10]

- Przetwory [2]
- Odpady [3]


5. Piaty widok. Zwija sie poprzednia lista, rozwija kolejna
- Produkty [1]
- Przetwory [2]
----Mleczne [11]

- Odpady [3]

Chodzi o stopniowe rozwijanie menu przesyłając parametr grupy_id. Jezeli wybrany rekord ma podgrupy to go rozwija z zapamiętaniem poprzedniego rozwinięcia w gałęzi. Strona ma sie przeładowywać. Prosze o wskazowki w jaki sposob mozna to zaprojektowac. Za kazda nawet najmniejsza pomoc bede wdzieczny.
ayeo
Skorzystaj z Treeview (wtyczka do jquery). Generujesz sobie zwykłą listę (HTML), a plugin robi całą robotę. W tym rozwiązaniu generujesz od razu całość drzewa.
Tu masz demka: http://jquery.bassistance.de/treeview/demo/

Pozdrawiam!
luckyluc
Dzieki za opowiedz. Przeanalizowałem Treeview i wszystko by pasowalo gdyby nie to, ze przy zmianie danych w linku menu sie zwija. Potrzebuje skryptu, ktory budowalby menu na podstawie zmiennej $group przesylanej w linku. Zmienna porownywana bylaby z polem grupy_id w bazie.


Link 1

index.php?show=produkty&group=9

- Produkty
----Owoce
------------Gruszki
------------Mango
------------Banany
------------------------Świeże
------------------------Stare
- Przetwory
- Odpady


Link 2

index.php?show=produkty_opis&group=9&s=3

- Produkty
----Owoce
------------Gruszki
------------Mango
------------Banany
------------------------Świeże
------------------------Stare
- Przetwory
- Odpady


Czy mozna to zrobic za pomoca warunkow i petli ?
ayeo
Nie rozumiem. Jeżeli chcesz, żeby się nie zwijało to masz: {presist: cookie} czy jakoś tak i będzie pamiętało swój "stan". Nie wiem czy o to chodzi.

Pozdrawiam!
qBK
Kiedyś coś takiego robiłem, w sumie sporo zależy od tego, czy masz dużo tych kategorii czy niewiele - od tego zależy jak skonstruować wyciąganie ich z bazy. Moje rozwiązanie raczej jest dalekie od optymalnego, ale może wywiąże się z tego jakaś ciekawa dyskusja smile.gif

Dla niedużej liczby kategorii można zrobić coś takiego (ogólna wizja)
  1. <?php
  2. function generateTree($iCategoryId=0){
  3. (...)
  4. require_once('TreeContainer.php'); // własna klasa napisana na
  5. //potrzeby funkcji, nic szczególnego
  6. $outputCats = new TreeContainer;
  7.  
  8. // wersja 1: tablica wszystkich kategorii wyciągana z bazy - dlatego
  9. // nie może być tego za dużo
  10. $rsAllcats = $db->getAllCats();
  11. // array z numerami (ID) kategorii glownych
  12. $roots = $db->getRootsIds();
  13. // w zasadzie roots i allcats są powiązane i możnaby drugie
  14. // wyciągnąć z pierwszych... też kwestia przemyślenia, implementacji bazy itd.
  15.  
  16. if($iCategoryId > 0) { // tj. wyswietlaj kategorie o przekazanym id
  17. foreach($roots as $id){
  18. $outputCats->addWithSons($id, $rsAllcats, $iCategoryId);
  19. }
  20. }
  21. else { // wyswietlaj tylko roots
  22. foreach($roots as $id){
  23. $outputCats->addWithoutSons($id, $rsAllcats);
  24. }
  25. }
  26.  
  27. return $outputCats;
  28. }
  29.  
  30. // oczywiscie zmienną $_GET['group'] trzeba sprawdzic czy jest porządną liczbą itd.
  31. $tree = generateTree($_GET['group']);
  32. // wyświetlenie drzewka to już iteracja po obiekcie, elementy są ustalone
  33. // w takiej kolejności jak będą na wyjściu, czyli
  34. //- Produkty
  35. //----Owoce
  36. //------------Gruszki
  37. //------------Mango
  38. //------------Banany
  39. //------------------------Świeże
  40. //------------------------Stare
  41. //- Przetwory
  42. //- Odpady
  43. ?>


Funkcją addWithSons która przejeżdża po wszystkich elementach sprawdzam czy $iCategoryId (odpowiednik Twojego $_GET['group']) jest synem albo ojcem aktualnie iterowanego elementu ($id); czyli tak naprawdę addWithSons dodaje synów tylko czasami.
generalnie przydałaby się kolumna w bazie która przechowuje ścieżkę (najlepiej po id, np id=1 -> Produkty.. id=20 -> Owoce, id=65 ->Gruszki to gruszki->path = /1/20/ ).

Tu można zrobić dwie wersje, albo wyciągać z bazy do php wszystko (sprawdzanie ojca/syna np. substringami na podstawie ścieżki), albo już przy SQL filtrować za pomocą LIKE%.

Jeśli sprawdzenie (jest synem / ojcem) powiedzie się to w środku rekurencyjnie jeszcze raz wywołuję addWithSons na obecnym elemencie.

No i przy dodawaniu nowego elementu do kontenera (tablicy) trzeba jakoś zaznaczyć poziom zagłębienia, np. ustawić $element->name, $element->href, $element->level (element->level można na podstawie liczby separatorów w ścieżce) i później robić odpowiednie wcięcia czy co tam chcesz.
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.