Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Poprawne generowanie zagnieżdżonych list ul
wiechol
post
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:

  1. <?php
  2. function showHtmlLists(){
  3. include_once(ROOT_DIR.'kategorieArray.php');
  4. $li = '<ul>';
  5. $tmpLevel = 0;
  6. foreach($categories as $elem){
  7. if($elem['level'] > $tmpLevel){
  8. $li .='<ul>';
  9. }elseif($elem['level'] < $tmpLevel){
  10. $li .='</ul>';
  11. }
  12.  
  13. $li .= '<li>'.$elem['name'].'</li>';
  14.  
  15. $tmpLevel = $elem['level'];
  16. }
  17. $li .= str_repeat('</ul>', $tmpLevel);
  18. $li .= '</ul>';
  19.  
  20. return $li; 
  21. }
  22. ?>


Ten post edytował wiechol 20.08.2007, 19:34:12
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zyx
post
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) .
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 04:46