![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 12.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam
O jakiegoś czasu męczę się z problemem poprawnego generowania wielopoziomowych list. Listy przedstawiają strukturę drzewiastą z bazy, a dokładniej kategorie i podkategorie. Dotychczas stosowałem spacje by uzyskać pożądany efekt jednak teraz muszę skorzystać z list <ul><li> Podchodziłem do tego tematu już wiele razy jednak zawsze z marnymi rezultatami. Na poniższym screenie graficzne przedstawienie problemu: http://img145.imageshack.us/img145/6786/kategorieiw9.jpg Po lewej mamy przedstawioną tabelkę z poprawnie wyglądającą listą kategorii(ustawioną za pomocą spacji) dodatkowo pokazałem tam dane z bazy. Po prawej natomiast widok poprawnie wyglądającej listy(Wpisana manualnie). Nie mam już siły na te listy więc proszę was o sugestie, pomoc w tym temacie. Tablica kategorii wystarczy ją dodać przez include i objechać foreachem z magicznym kodem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Dodatkowo podam jeszcze poprawny kod listy: Kod <ul> <li>Windows <ul> <li>Win 98 <ul> <li>Win 98 SE</li> </ul> </li> <li>Win XP <ul> <li>Win XP Basic</li> <li>Win Xp Profesional</li> </ul> </li> <li>Win Vista <ul> <li>Win Vista Starter</li> <li>Win Vista Home Basic</li> <li>Win Vista Home Premium</li> <li>Win Vista Business</li> <li>Win Vista Enterprise</li> <li>Win Vista Ultimate</li> </ul> </li> <li>Win 95</li> </ul> </li> <li>Linux <ul> <li>Debian</li> <li>Gentoo</li> <li>Mandriva Linux</li> <li>Ubuntu</li> <li>Slackware</li> <li>Red Hat Linux</li> </ul> </li> <li>Mac OS <ul> <li>Mac OS X 10.3 Panther</li> <li>Mac OS X 10.4 Tiger</li> <li>Mac OS X 10.5 Leopard</li> </ul> </li> <li>Testowa A <ul> <li>Testowa AB <ul> <li>Testowa ABC <ul> <li>Testowa ABCD <ul> <li>Testowa ABCDE</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> Najlepsze wyniki do jakich doszedłem to poprawne wyświetlanie list ale niepoprawne zagnieżdżanie:
Ten post edytował wiechol 20.08.2007, 19:34:12 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
slick101 -> z tak pobranych danych bez dodatkowej obróbki raczej drzewa nie wygenerujesz. Sposób zapisywania w bazie polecam zmienić, np. tak, by wykorzystywał algorytm przechodzenia drzewa zmodyfikowaną metodą preorder. Implementacja od strony kodu jest dość złożona, ale za to oferuje bardzo wydajne pobieranie. Podczas pobierania ponadto otrzymujesz informację o głębokości każdego węzła, którą można zastosować do wyświetlania. Algorytm jest wtedy bardzo prosty. W każdej iteracji pętli po liście pamiętamy obecny i poprzedni element listy. Postępujemy następująco (wiechol, przeczytaj uważnie, bo zauważyłem, że w Twoim kodzie próbujesz właśnie w takim kierunku iść - jeśli wszystko załapiesz, to problem masz rozwiązany):
1. Jeśli current.depth = previous.depth, wtedy zamykamy LI dla poprzedniego elementu, otwieramy znacznik LI dla nowego i wyświetlamy element current. Nie zamykamy go jednak. 2. Jeśli current.depth > previous.depth, oznacza to, że wchodzimy do podelementu. Otwieramy więc UL, w nim LI i w nim dopiero treść. Nie zamykamy go. 3. Jeśli current.depth < previous.depth, wracamy do wyższego poziomu. Musimy wtedy wykonać tyle zamknięć /UL i /LI, ile wynosi różnica między obiema głębokościami. Następnie otwieramy nowy LI i wyświetlamy current. PS. System szablonów OPT posiada wbudowaną obsługę wyświetlania takich drzew (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.10.2025 - 04:46 |