Leeloo5E: Smarty-Template: Array nach HTML-Liste

Hallo,

nach dem ich mein letztes Problem erfolgreich mit DOM lösen konnte, stehe ich nun eigentlich wieder vor dem selben Problem. Besagte Struktur, die in Form eines Arrays vorliegt

  
Array (  
  [0] => Array (  
                 [level] => 1  
                 [name] => Wurzel  
  )  
  [1] => Array (  
                 [level] => 2  
                 [name] => Kapitel 1  
  )  
  [2] => Array (  
                 [level] => 3  
                 [name] => Kapitel 1.1  
  )  
  [3] => Array (  
                 [level] => 3  
                 [name] => Kapitel 1.2  
  )  
  [4] => Array (  
                 [level] => 4  
                 [name] => Kapitel 1.2.1  
  )  
  [5] => Array (  
                 [level] => 2  
                 [name] => Kapitel 2  
  )  
 )  

soll anstatt in dort vorgegebene "section"-Struktur nun in eine ul-li-Struktur:

  
<ul>  
  <li>Kapitel 1  
    <ul>  
      <li>Kapitel 1.1.</li>  
      <li>Kapitel 1.2.  
        <ul>  
          <li>Kapitel 1.2.1.</li>  
        </ul>  
      </li>  
    </ul>  
  </li>  
  <li>Kapitel 2.</li>  
</ul>  

Das Problem diesmal wieder: Ich verwende für die Auswertung des Array Smarty.
Zuvor hatte ich mit der Beispiel-Klasse von Arne Klempert zum Thema NestedSets das ganze als Tabelle mit vorherigem Einfügen von Grafiken realiisert. So das dieser Dokumentenstruktureffekt auftrat. Mit der ul-li-Liste möchte ich nun ein dynamisch aufklappbares Menü erstellen. Die passende Java-Klasse hab ich schon. Nur bleibt die Frage, wie ich das Menü in die obige Struktur unter Verwendung der Smarty-Template-Möglichkeiten bringe?

Wenn ich so weiter überlege, glaube ich, das krieg ich nicht hin so: In jedem eingefügten Listenpunkt besteht die Möglichkeit, dass dort ebenfalls ein weiteres neues UL-Element eingefügt werden kann, aber eben nicht immer, anstatt dessen kann auch ein weiteres LI-Element folgen ...

Sehr weit bin ich leider noch nicht:

  
 <ul class="mktree">  
  <!--{assign var='last' value=0}-->  
  <!--{foreach item=chapter from=$chapters}-->  
   <li>  
     <!--{$chapter.level}-->  
     <!--{$chapter.name}-->  
   </li>  
  
    <!--{assign var='last' value=$chapter.level}-->  
    <!--{$last}-->  
  <!--{/foreach}-->  
</ul>  

Ich setze also eine Variable 'last' auf 0. Dann gehe ich das Array durch. Dort habe ich den Namen und das Level. D.h. ich habe das letzte Level immer da und kann mit dem aktuellen vergleichen.

Gruß,
Leeloo

--
"Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
  1. Hallo,

    na gut, ok, mit den paar Infos wirds wohl nicht funktionieren. Hab ja zum Glück noch mehr. Mein Array sieht also so aus, dass ich zusätzlich noch die Informationen über die Anzahl der Kinder des aktuellen Knotens und ob er noch einen nachfolgendes Geschwisterchen hat:

    Array (
      [0] => Array (
                     [level] => 1
                     [name] => Wurzel

    [childs] => 5
                       [lower] => 0

    )
      [1] => Array (
                     [level] => 2
                     [name] => Kapitel 1

    [childs] => 3
                       [lower] => 1

    )
      [2] => Array (
                     [level] => 3
                     [name] => Kapitel 1.1

    [childs] => 0
                       [lower] => 1

    )
      [3] => Array (
                     [level] => 3
                     [name] => Kapitel 1.2

    [childs] => 1
                       [lower] => 0

    )
      [4] => Array (
                     [level] => 4
                     [name] => Kapitel 1.2.1

    [childs] => 0
                       [lower] => 0

    )
      [5] => Array (
                     [level] => 2
                     [name] => Kapitel 2

    [childs] => 0
                       [lower] => 0

    )
    )

      
    ~~~html
      
    <ul class="mktree">  
     <!--{assign var='last' value=1}-->  
     <!--{foreach item=chapter from=$chapters}-->  
      
      <!--{if $last > $chapter.level}-->  
       <li>  
      <!--{/if}-->  
      <!--{if $last < $chapter.level}-->  
       <ul>  
        <li>  
      <!--{/if}-->  
      <!--{if $last eq $chapter.level}-->  
       <li>  
      <!--{/if}-->  
      
      <!--{$chapter.name}-->  
      <!--{$chapter.level}--> //Testausgabe Level  
      <!--{$chapter.childs}--> //Testausgabe Kinder  
      <!--{$chapter.lower}--> //Testausgabe Nachfolger  
      
      <!--{if $chapter.lower == 0}--> // Kein Nachfolger -> Liste zu  
        </li>  
      <!--{/if}-->  
      
      <!--{if $chapter.childs == 0 AND $chapter.lower == 0}-->  
        // Ja und hier jetzt sooft zu machen wie Differenz zwischen aktuellem Level und folgendem, oder letzten? bin noch verwirrt.  
        </ul></li>  
      <!--{/if}-->  
      
      <!--{assign var='last' value=$chapter.level}-->  
     <!--{/foreach}-->  
    </ul>  
    
    

    Gruß,
    Leeloo

    --
    "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra