![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Ostatnio stanąłem przed problemem stworzenia menu drzewiastego. Sporo czytałem na ten temat i znalazłem wiele ciekawych artykułów na ten temat, ale autorzy tych artykułów skupiali się głównie na rozwiązaniach typu „drzewo Depesza”. Po krótkim zastanowieniu doszedłem do wniosku że raczej nie potrzebuję aż tak złożonego systemu. A skoro tak to jedyne rozwiązanie jakie mi pozostaje to standardowe id | id rodzica. Ale takie rozwiązanie wymaga wielu zapytań co jest nieefektywne, a alternatywą są tak na dobrą sprawę tylko drzewa które są skomplikowane w zarządzaniu. Po zastanowieniu przyszło mi do głowy zasadnicze pytanie: „jak często jest aktualizowane menu?”. No właśnie we wszystkich przypadkach w których to rozwiązanie ma być wykorzystane pewnie nie częściej niż raz na miesiąc – pomijając fazę wdrażania systemu. A skoro tak to poco za każdym razem wykonywać te same czasochłonne zapytania skoro można zrobić cache. Osobiście widzę tu dwie możliwości: 1) Zapisanie do plików każdej możliwej kombinacji układu menu – zapis wraz z kodem HTML, a później tylko wczytanie pliku 2) Zapis do pliku struktury bazy (zserializowana tablica), a następnie dynamiczne tworzenie menu na podstawie tej tablicy Zdecydowałem się na rozwiązanie drugie – chociaż coraz intensywniej myślę na pierwszym ![]() Na schemacie poniżej widać przykładowe drzewo, gdzie kategoria „M_1_3” jest aktualnie wybraną kategorią, a kolorem zielonym zaznaczono gałęzie które muszą być widoczne. ![]() A to kod – tagi HTML'a umieściłem dla uproszczenia, w „normalnej wersji” oczywiście jest użyty system szablonów.
przykładowa baza
Chciałbym Was prosić o ocenę zarówno tego kodu jaki sugestie co myślicie o obu sposobach cachowania Pozdrawiam, Sazian Ten post edytował sazian 7.05.2012, 21:34:50 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Opisz ten kod dokładniej, w uwzględnieniem "standardu" dokumentowania kodu php. Samo zrobienie menu wielopoziomowego to nie problem. Schody zaczynają się gdy np. chcesz przenieść jakąś gałąź, u Ciebie tego nie widzę.
-------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
Opisz ten kod dokładniej mam nadzieje że tak wystarczy Samo zrobienie menu wielopoziomowego to nie problem. Schody zaczynają się gdy np. chcesz przenieść jakąś gałąź, u Ciebie tego nie widzę. Niezgodę się z Tobą, przenoszenie jest trudne w drzewach a nie w rozwiązaniu „id | id rodzica” tu wystarczy zmienić id rodzica i ponownie przeliczyć pozycje w kategorii z której przenosimy. Niestety pojawia się problem przy wyświetlaniu.Wyświetlanie wymaga albo wielu „join'ów” albo wczytywania rekurencyjnego w php ale to generuje wiele zapytań. Ten post edytował sazian 7.05.2012, 21:50:27 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Właśnie, musisz przeliczyć. A czy to będzie wydajne tak jak masz to teraz przy załóżmy 30k pod menu, które są też rodzicami? Rzuciłem tylko okiem jak to rozwiązałeś i nie pasuje mi to, bo podchodzę do tematu nieco inaczej. Pobieram dane na podstawie id rodzica i tak rekurencyjnie gdy wystąpi dziecko, mam całą ładną tablicę którą ładuje w cache. Z przenoszeniem/kasowaniem bywa różnie... do kasowania rodzica czy dziecka używam wyrażeń regularnych są szybsze, do przenoszenia też, choć tu problemy są z przeliczeniem całej struktury i sprwdzeniem czy takowa już w wybranym drzewie nie istnieje.
-------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 01:57 |