![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Tworzę katalog produktów. Menu jest rozwijane w dół, może być n-poziomowe. Tworze je skryptem, kolumny m.in. (id, name, link, image, parent_id). Chciałbym stworzyć bread crumps ale jak narazie nie przychodzi mi do głowy jak to zrobić? Tworzę to w CI. Nie jest to zbyt rozbudowany system. Narazie link mam postaci http://www.katalog.pl/device/show/2/5 gdzie kolejno device - kontroller show - metoda 2 - id grupy 4 - do paginacji proszę o wskazówki jak wykonać "gdzie jestem" Chciałbym to zrobić już teraz zanim wykonam cały katalog a potem przez Okruszki ... będę musiał coś poprawiać wstecz. może napisać coś takiego co by sprawdzało pokrewieństwo wstecz aż do parent_id = 0 pozdrawiam Ten post edytował john_doe 22.08.2011, 14:50:33 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
hmmm, masz wiele możliwości stworzenia struktury drzewa w bazie danych, najprostsze to korzystanie z dodatkowej kolumny: parent_id
drugi sposob to tzw. nested sets. Ja korzystam z obu naraz. Poza tym masz jeszcze materialized path. Najprościej - jak działają? a/ kazdy wpis ma id i parent_id - odwolują sie do siebie nawzajem. aby znaleźć breadcrumb musialbys pobrać element który aktualnie wyswietlasz oraz wszystkie wiersze 'starsze' - niestety przez rekurencję, a więc sposób jest po prostu powolny i kosztowny b/ nested set to taka konstrukcja, gdzie najwyzszy element jest jak zbiór i zawiera w sobie wszystkie 'poniższe', a one zawierają kolejne dzieci, a te dzieci kolejne dzieci itd. ważne są 'uszy' zbioru. Zbiór pusty ma lewe ucho = 1, prawe ucho = 2. Jeżeli dodamy coś do tego zbioru, to teraz dziecko będzie miało lewe ucho = 2, prawe = 3, natomiast zbiór 'rodzic' będzie mieć zmodyfikowane prawe ucho - powiększone o 2. W rezultacie dostajemy coś takiego: ![]() Mam nadzieję, że widzisz, gdzie są 'uszy' - to liczby na krawędziach. Ten sposob jest ok, ale o ile wyciągnięcie 'ścieżki' jest proste dzięki niemu, to już inne modyfikacje (usunięcie, przeniesienie) bywają kosztowne. Ja najbardziej lubie pracować na połączeniu obu powyższych c/ materialized path zawiera po prostu kolumnę, w której wpisujesz id albo bezpośredino breadcrumbsy, np. tak: 1, meble, kategoria z meblami, meble 2, drewniane, kategoria z meblami drewnianymi, meble.drewniane 3, kuchenne, kategoria z meblami drewnianymi do kuchni, meble.drewniane.kuchenne 4. stoły, kategoria z meblami drewnianymi do kuchni bedacymi stolami ;D, meble.drewniane.kuchenne.stoly Jak widać masz breadcrumb w ostatniej kolumnie jak na dłoni - tyle, ze wyobraz sobie co sie stanie, jesli bedziesz chcial przeniesc gdzies indziej element ![]() Poza powyzszym musisz pamietac o elementach statycznych - nie wszystko masz w bazie. dlatego najfajniejszym moim zdaniem rozwiązaniem jest tworzyć (statycznie lub dynamicznie plus cacheowanie) pliku np. xml zawierajacego całą 'nawigację' - hierarchiczną strukturę strony w postaci xmlowego drzewa. Wtedy tylko odczytujesz sobie z pliku 'gdzie jestes' i wyciągasz ścieżkę. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
uirapuru dzięki za post. Na chwilę obecną wykorzystuję punkt a) o którym piszesz.
mając tabele id | label | link | parent_id rzeczywiście muszę stworzyć funkcję rekurencyjną "wspinającą" się ku górze kończąć na parent_id = 0 zastanawiam się czy lepiej dać z tej tabeli SELECT * i potem robić operacje przeszukiwania na tablicy aby uniknąć ponownego i ponownego odpalania zapytania. tylko jeszcze tego nie napisałem... pozdro |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Pierwsze rozwiązanie ma wielką wadę właśnie w tym przypadku - trzeba orać zapytaniami bazę. Dlatego właśnie łącze 1) z 2) - wtedy za pomocą jednego select wyciagam od razu wszystkie elementy 'starsze' (po prostu znajdujące się na lewo od 'ucha' interesującego nas elementu, to tak w wielkim uproszczeniu)
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
wiesz robię to 1szy raz więc muszę się przkonać i udoskonalić
narazie mam tyle i nie chodzi ![]()
zwraca mi aktualny label bez przodków |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
polecam a) x-debug i korzystać z debugowania kodu (podstawowe narzędzie w arsenale programisty) albo chociaż
![]() ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Co do problemów z wywołaniem rekurencyjnym: po pobraniu ścieżki zapisz ją w cache i następnymi żądaniami stamtąd pobieraj. Nie będziesz "orał" bazy danych.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
dodatkowym przyspieszeniem moim zdaniem rekurencji owej byłoby napisanie funkcji w sql, którą się wywołuje dla konkretnego elementu a ona zwraca w postaci np. jsona poszczególne elementy - odpada wtedy tez koniecznosc robienia zapytań w php w kółko...
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
No tak, ale wówczas i tak odpalasz X zapytań, ale z poziomu bazy danych. Na pewno będzie to szybsze, ale rekurencyjne wywoływanie zapytań i tak będzie występowało. Ja bym postawił mimo wszystko na cache, ewentualnie zabawę z funkcją na bazie danych + cache.
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 182 Pomógł: 9 Dołączył: 30.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
phpion: i mysle, ze to bardzo dobre rozwiazanie w pewnych przypadkach
![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
nie za bardzo kumam o co Wam chodzi panowie? w tej chwili przypisuję każdy zwrot z bazy i dopisuję go do ścieżki. Tak wygląda kod
![]() |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Powinno zatrybić ![]() ps. do tego dodałbym szukanie po IP LINK - mmo użycia LIKE jest naprawdę wydajne Ten post edytował CuteOne 24.08.2011, 00:15:00 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
dzięki CuteOne mam taki kod teraz z Twoją sugestią ... ten sam rezultat. Czy wchodzą w menu rozwijam gałąź w dół i klikam w link czyli powinno być
menuGłówne -> subMenu w breadcrumps i taki link http://127.0.0.1/main/device/3 array 3 => array 'label' => string 'subMenu1' (length=10)
Ten post edytował john_doe 24.08.2011, 11:23:12 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
while($result->parent == 0) nie ma sensu - wykonujesz pętle tylko gdy parent = 0 po czym psrawdzasz czy id = 0 istnieje (id powinno zaczynać się od 1)
ps. po co pętla skoro pobierasz tylko jeden rekord?? ![]() Ten post edytował CuteOne 24.08.2011, 18:41:28 |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
racja CuteOne
podaję rozwiązanie, dodatkowo w tym przypadku przydałoby się dołożyć funkcjonalność odwracania zwracanego stringa, w tej postaci breadcrump jest od tyłu. i przerabiam na materialized path
Ten post edytował john_doe 26.08.2011, 00:03:01 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.06.2025 - 22:58 |