![]() |
![]() |
![]()
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 ![]() 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: 1 597 Pomógł: 30 Dołączył: 19.02.2003 Skąd: Tychy Ostrzeżenie: (0%) ![]() ![]() |
Jeśli w ten sposób nie umiesz sobie poradzić to spróbuj rekurencji. Zapis jest zdecydowanie krótszy, bez ifów.
-------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 12.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Próbowałem już z rekruencją jednak również z mizernymi skutkami, dzięki rekurencji generowana jest odpowiednia kolejność wyświetlania kategorii / podkategorii.
Na razie nie mam siły i czasu na zabawę w e if-y ,pod koniec projektu spróbuje sie jeszcze raz z tym zmierzyć. Pozdrawiam Wiktor P.S Poprawiłem zamieszczoną powyżej tablice, Windowsy z kategorii Win Vista miały level 3 a powinny mieć 2. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 28.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Wiechol spadles mi z nieba. Mam identyczny problem:
nie potrafie zrobic tego, ze jezeli oba elementy sa w tej samej galezi, maja ten sam odstep (sa w tym samym submenu) jak zwal tak zwal, to aby na poczatku element ktory bedzie rodzicem (ktory bedzie mial pod soba inne pozycje wygenerowal sie jako:
kolejne zagniezdzone <ul>: http://i33.tinypic.com/dxy9gw.png Oto kawalek kodu przy ktorym walcze:
To co jest zakomentowane to moje modyfikacje ktorymi prosze sie nie sugerowac, domyslnie dla pomocy kod korzysta z tabeli Dariusza: http://scarlet00.republika.pl/kategorie.sql Za cholere nie wiem gdzie przy tych foreach'ach powstawiac warunki if zeby mi generowaly to o czym napisalem. Prosze o jakas pomoc i z gory dziekuje. Czy poradziles juz sobie z tym problemem i mozesz mi pomoc? |
|
|
![]()
Post
#5
|
|
![]() 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 ![]() -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 19:50 |