[MySQL][PHP] Drzewko IP - Wielopoziomowa lista |
[MySQL][PHP] Drzewko IP - Wielopoziomowa lista |
7.12.2016, 21:50:26
Post
#1
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
W tym wątku nauczyłem się robić drzewko IP z kategoriami. (dzięki nospor).
Udało mi się zrobić formularz z polem select i wszystkimi kategoriami i podkategoriami:
ale nie umiem zrobić z tego listy <ul></ul> wielopoziomowej, może jakaś dobra dusza mi podpowiedzieć jak to zrobić? z jednym poziomem sobie jakoś radzę. Nie wiem jak zaimplementować listę z kolejnymi poziomami tego drzewa |
|
|
8.12.2016, 10:23:07
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Pobierasz wszystkie kategorie selectem, ale wazne bys dla zapytania ustawil ORDER BY LEVEL ASC + ewentualnie inne pola jesli chcesz sortowac po np. nazwie
Potem lecisz pokolei po rekordach w php i budujesz tablice, ktorej indexem jest ID kategorii a wartoscia reszta danych kategorii + pole na CHILDREN ktore jest tablica i tam bedziesz wstawial bezposrednie dzieci danej kategorii/subkategorii Gdy juz bedziesz mial tak zbudowana tablice lecisz foreachem najpierw po elementach ktore maja level 0. Jesli one maja dzieci to wchodzisz foreachem w dzieci i iterujesz po dzieciach itd itd. Tutaj bardzo przydatna bedzie rekurencja. Sory ze tak ogolnikowo ale mam troche na glowie dzisiaj -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
8.12.2016, 13:08:12
Post
#3
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Kod // [b]$cats[/b] zawiera tablice z wynikami zapytania o wszystkie kategorie foreach($cats as $cat) { $arr[$cat->kategoria_id] = array( 'nazwa'=>$cat->nazwa, 'ip' => $cat->ip, 'poziom' => $cat->poziom, 'dzieci'=>array() // i tu nie wiem co i jak wstawic w te tablice... ); } Na razie probuje stworzyc te tablice i stanalem na stworzeniu tablicy w elemencie 'dzieci'. Wiem ze w tablicach w elemencie 'dzieci' powinny byc dane kolejnych dzieci tak jak w powyzszej tablicy, z tablicami w 'dzieci' do ostatniego zagniezdzenia, tylko nie wiem jak te tablice stworzyc Ten post edytował arturpiotrowski 8.12.2016, 13:10:43 |
|
|
8.12.2016, 13:21:24
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Nie, chodzilo mi tylko o bezposrednie dzieci. To bedzie w miare plaska tablica
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
13.12.2016, 19:13:20
Post
#5
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Przepraszam że dopiero teraz piszę, a idRodzica z IP jak mam wyciągnąć?
np. przez explode IP po kropce rozbić na tablicę i wyciągając element po numerze level? |
|
|
14.12.2016, 09:45:42
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Moze byc tak jak mowisz ale rownie dobrze moze byc tak, ze przedostatni element po robiciu po kropce to rodzic
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
17.12.2016, 05:41:36
Post
#7
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
chyba z 1 zadaniem się udało, wydaje mi się że działa dobrze:
biorę się za 2 zadanie:) Przepraszam ale chyba sam sobie nie poradzę, siedzę nad tym już 2 dzień i nic mądrego do głowy mi nie przychodzi. Nie wiem jak się za to zabrać Jak rozumiem powienienem teraz napisać funkcję z 2 pętlami foreach pierwsza pętla dla elementów tablicy głównej druga dla childrens? Tylko co zrobić aby przypisać subkategorie do właściwego children[cat_id] mam zbudować kolejną tablicę czy już taką listę <ul><li></li></ul>? Ten post edytował arturpiotrowski 17.12.2016, 05:53:35 |
|
|
19.12.2016, 11:24:03
Post
#8
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Nie, nie dwa foreach tylko rekurencja.
Wpierw pobierasz id kategorii z level 1 i to jako parametr przekazujesz do funkcji. Funkcja ta leci po twojej glownej kategorii ale tylko dla przekazanych id. Gdy dana kategoria ma dzieci, to masz id tych dzieci i znowu odpalasz funkcje z parametrami tych dzieci. itd itd ladna rekurencja, ktora generuje ci twoje zagniezdzone ul -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
21.12.2016, 06:38:27
Post
#9
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Dzięki, coś się ruszyło do przodu choć jeszcze daleko do ideału:
zwraca mi w źródle coś takiego: Nie wiem czemu mi pokazuje tylko pierwszy poziom drzewa, jak w każdym poziomie pierwszym jest co najmniej jedna gałąź niżej, a w niektórych więcej jak jedna niżej?. Jak mniemam teraz za każdą rekurencją jest odpytanie bazy? Jak to zrobić żeby tylko raz pobrał dane z bazy? Co to jest te 7 razy puste <ul></ul> na początku, jak się tego z tamtąd pozbyć? Ten post edytował arturpiotrowski 21.12.2016, 07:18:03 |
|
|
21.12.2016, 10:01:08
Post
#10
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat Jak mniemam teraz za każdą rekurencją jest odpytanie bazy? Ke? pokaz mi prosze palcem gdzie ty w tym kodzie rekurencji lecisz do bazy....Nie var_dump($output); a return $output; edit: a, tutaj $tree = $this->cat_tree(); ze niby lecisz do bazy.... to: $tree = $this->cat_tree(); ma byc odpalone tylko raz a nie w rekurencji. Raz wygenerowane $tree masz albo przekazywac jako parametr do funkcji albo trzymac jako wlasciwosc klasy bo widze ze masz to na klasie zrobione -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
22.12.2016, 00:31:44
Post
#11
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
wiem o return, tu raczej chodziło mi o wyrzucenie od razu na ekran danych więc zastosowałem tymczasowo var_dump
ale to nadal zwraca tylko jeden poziom i kod html jaki podałem w poście wyżej Wydaje mi się że kłopot jest tutaj:
Wydaje mi się czy rekurencja cały czas rzeźbi na tym samym drzewie $tree a nie schodzi głębiej po gałęzi 'childrens'? Ale jak mam to zrobić aby szła po childrens? Pewnie pomogłoby przekazywanie w funkcji categories_tree(), przy rekurencji jako drugiego parametru tablicy z drzewem 'childrens' ale ono też ma teraz, tylko indeksy z cat_id Ten post edytował arturpiotrowski 22.12.2016, 00:56:48 |
|
|
23.12.2016, 11:14:43
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Parametrem dla funkcji categories_tree() sa dzieci a nie poziom. Skoro sa to dzieci, to masz iterowac po tych dzieciach a nie po calym drzewie. Dzieki temu bedziesz zawsze iterowal po tym co trzeba.
Zas za pierwszym razem jak odpalasz funkcje categories_tree() masz jej przekazac id elementow z poziomu 0 -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
23.12.2016, 23:14:50
Post
#13
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
nospor, dziękuję Ci za cierpliwość, chyba pora w tym temacie zmienić forum na to z Twojej stopki
nie wiem jakim sposobem pobrać id elementów z poziomu 0 przy pierwszym odpaleniu funkcji? :-( a także potem id dzieci zawartych w $childrens? |
|
|
24.12.2016, 16:08:36
Post
#14
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat nie wiem jakim sposobem pobrać id elementów z poziomu 0 przy pierwszym odpaleniu funkcji? Normalnie iterujesz po glownej tablicy i pobierasz z niej te ID, ktore maja level 0 Cytat a także potem id dzieci zawartych w $childrens? No przeciez w children masz wlasnie id, to jaki problem?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
27.12.2016, 00:06:23
Post
#15
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Coś mi wyszło, wygląda chyba na prawidłowy układ, ale nie wiem czy o to Ci chodziło?
|
|
|
27.12.2016, 14:58:55
Post
#16
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Po pierwsze nie zadne childs a children... nie kalecz jezyka.
Po drugie to tu foreach($tree as $k => $v){ if($v['level'] == 0){ echo $cats->categories_tree($k); } } miales pobrac wpierw wszystkie id z level 0 a dopiero potem przekazac to do tablicy. Po chinsku zdaje sie nie pisze A teraz ty odpalasz funkcje dla kazdego ID z osobna. To samo zreszta robisz wewnatrz funkcji dla kazdego z dziecka :/ . Po trzecie: wewnatrz funkcji iterujesz za kazdym razem po calym drzewie. Mowilem: masz iterowac po dzieciach a nie po calym drzewie. Poprawny kod:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
27.12.2016, 23:07:07
Post
#17
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Pięknie dziękuję za pomoc, faktycznie wygląda to logiczniej niż to co ja wyskrobałem, a mógłbym prosić jeszcze o podpowiedź jak nie wyświetlać elementu "Root" na tej liście? Ma on jako jedyny level = 0. Wystarczy tylko dać inny numer levela?
Jeszcze jedno a jakbym chciał coś wykluczyć z tego drzewa? Chodzi o wykluczenie kilku cat_id i ich dzieci. Ewentualnie pokazać tylko jedną kategorię (niekoniecznie z levela 1) i jej potomków. Jak mogę to zrobić? Ten post edytował arturpiotrowski 27.12.2016, 23:14:48 |
|
|
27.12.2016, 23:22:53
Post
#18
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
ad1: tak
ad2: to daj if ktory sprawdza czy jest cos na liscie co chcesz wykluczyc czy nie i jak jest to nie jedz po tym -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
29.12.2016, 22:43:03
Post
#19
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 6.12.2016 Ostrzeżenie: (0%) |
Dzięki, pokombinuję, narazie zrobiłem tak i chyba nawet działa:
$excluded dałem jako parametr funkcji categories_tree() Jeszcze tylko pomyślę jak zrobić breadcrumbs dla konkretnej kategorii i będę miał chyba komplet W tej chwili tworzy się całe drzewo z podkategoriami, a jak zrobić aby pokazać tylko kategorię i X głębokości podkategorii? Ten post edytował arturpiotrowski 28.12.2016, 02:29:50 |
|
|
29.12.2016, 22:47:26
Post
#20
|
|
Grupa: Moderatorzy Postów: 36 455 Pomógł: 6292 Dołączył: 27.12.2004 |
Cytat W tej chwili tworzy się całe drzewo z podkategoriami, a jak zrobić aby pokazać tylko kategorię i X głębokości podkategorii? No to zapytaniem pobieraj tylko te dane ktore cie interesuja -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 13:17 |