Template, once again

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Template, once again

    Servus,

    hab mal wieder ne Frage.

    Die Datei nav.tpl sieht so aus:
    Code:
    <ul>
    {loop menu}
      <li><a href="{menu.path}">{menu.name}</a>
        {if menu.expanded}
          {include "nav_2.tpl"}
        {endif}
      </li>
    {endloop}
    </ul>
    nav_2.tpl
    Code:
    <ul>
    {loop menu.content into menu_2}
      <li><a href="{menu_2.path}">{menu_2.name}</a>
        {if menu_2.expanded}
          {include "nav_3.tpl"}
        {endif}
      </li>
    {endloop}
    </ul>
    Ich bekomme mein Menü angezeigt, sobald der Benutzer auf einen Menüeintrag klickt, wird das Untermenü angezeigt.

    Soweit so gut, aber...
    Das Untermenü wird nicht von nav.tpl sondern von nav_2.tpl angezeigt, das Untermenü dazu von nav_3.tpl, ...

    Ich suche nach einer Möglichkeit, das Template nav.tpl rekursiv aufzurufen (funktioniert) und das jeweilige Submenü auszugeben (funktioniert nicht)

    Hat da jemand einen kleinen Schubser in die richtige Richtung parat?

    Code:
    Array
    (
        [0] => Array
            (
                [name] => Punkt 1
                [path] => /?show=5
            )
    	    
        [1] => Array
            (
                [name] => Punkt 2
                [path] => /?show=3
                [content] => Array
                    (
                        [0] => Array
                            (
                                [name] => Punkt 2.1
                                [path] => /?show=17
                            )
    
                        [1] => Array
                            (
                                [name] => Punkt 2.2
                                [path] => /?show=19
    
                            )
                [expanded] => 1	
    
        [2] => Array
            (
                [name] => Punkt 3
                [path] => /?show=7
            )	    
    
    )
    Momentaner Stand:
    Entweder ich rufe nav.tpl rekursiv auf und bekomme einen Serverfehler, weil immer wieder mit dem kompletten Menü begonnen wird (irgendwann wird's halt zuviel) oder ich mache mit dem Untermenü (Index content) weiter und verliere dadurch, dass ich die Schleifenvariable überschreibe den Menüpunkt 3
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    gehe bei der Abarbeitung nicht vom Template aus (endlose Rekursion)
    sondern nutze dein Datenarray als "Bestimmer" wieviel wie tief ausgefüllt wird.

    Habe sowas selber bei mir drin, mit diesem Template
    Code:
    {loop menu}
    <ul>
       <li><a href="{link}">{name}</a>{loop menu}</li>
    </ul>{/loop menu}
    dh. wenn bei den Daten (bei dir zB "Punkt 2") noch ein Unterarray exisitiert,
    wird der Block "menu" nochmals in sich selbst eingesetzt,
    ansonsten wird "{loop menu}" entfernt
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Nachtrag:

      Die Templateklasse, die das umsetzt, schreibt eine lauffähige PHP-Datei.

      Im Array data stehen die vom Skript zugewiesenen Variablen (z. B. menu).

      Durch das loop wird im Array loops (der Templateklasse) ein Eintrag mit dem Index menu angelegt, dadurch wird bei jedem weiteren Zugriff auf menu auf das Array loops undn icht auf das Array data zugegriffen.

      Durch das endloop wird der Eintrag aus dem Array loops wieder entfernt
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Original geschrieben von TBT
        gehe bei der Abarbeitung nicht vom Template aus (endlose Rekursion)
        sondern nutze dein Datenarray als "Bestimmer" wieviel wie tief ausgefüllt wird.
        [...]
        wenn bei den Daten (bei dir zB "Punkt 2") noch ein Unterarray exisitiert,
        wird der Block "menu" nochmals in sich selbst eingesetzt,
        ansonsten wird "{loop menu}" entfernt
        Ups, Da haben sich unsere Beiträge wohl überschnitten.

        Muss mal schauen, ob ich das bei mir eingesetzt bekomme, wahrscheinlich aber nicht, da ich den Templatecode ja nicht bei jedem Aufruf interpretiere sondern beim ersten Mal ein PHP-Skript erstellen lasse, das fortan verwendet wird.

        Ich kann also nichts nochmal einsetzen, sondern muss dafür sorgen, dass, dass ich eine Rekursion im PHP-Code hinbekomme.

        Ich könnte
        Code:
        {menu call "meine_php_funktion"}
        schreiben und in meine_php_funktion die Rekursion abwickeln, aber das ist ja nicht im Sinne des Erfinders.

        Mal schauen, wem was einfällt. Vielleicht ja auch mir *g*
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Mir is was eingefallen
          Code:
          <ul>
          {loop menu recursive for content}
            <li><a href="{menu.path}">{menu.name}</a>
              {if menu.expanded}
                {recursiveloop}
              {endif}
            </li>
          {endloop}
          </ul>
          funktioniert toll
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Noch ein Nachtrag:
            Das funktioniert, weil ich für jedes loop im Template eine fucntion loop_xyz erstelle (xyz ist immer eindeutig, es gibt also nicht zwei Funktionen, die den gleichen Namen haben) und nach dem endloop wird die Funktion loop_xyz dann aufgerufen.

            Bei recursiveloop wird ebenfalls loop_xyz aufgerufen, nur eben innerhalb der Funktion.

            Das funktioniert alles ganz wunderprächtig, aber mich plagt da eine Frage, auf die ichm ir Antwort erhoffe:

            Gibt es Umstände, unter denen ich im PHP-Code nicht einfach eine Funktion loop_xyz definieren kann?
            Mir würde nichts einfallen, außer die Funktion würde bereits existieren, aber das kann ich ausschließen
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              fällt mir nichts ein, andernfalls kannst du doch create_function benutzen um nen eindeutigen namen zu erhalten ..
              mfg,
              [color=#0080c0]Coragon[/color]

              Kommentar


              • #8
                Hab's mir mal angeschaut, aber bei create_function muss ich ja den kompletten Code angeben und ich weiß ja beim Parsen des Templates noch nicht, was alles dazugehört.

                Wenn ich Funktionen an jeder Stelle anlegen kann, werde ich mit uniqid('loop') auch glücklich werden, denke ich...
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  nicht wirklich ..

                  PHP-Code:
                  $args '$foo, $bar';
                  $func 'return array($foo, $bar);'
                  dann entspricht

                  PHP-Code:
                  $new_func create_function($args$func); 
                  einem

                  PHP-Code:
                  function $new_func (eval($args)) { eval($func); } 
                  wobei du bei letzterem den namen selbst vergeben müsstest

                  ps: hoffe das stimmt jetzt so, die verallgemeinerte letztere form hab ich nie probiert

                  EDIT:
                  da fällt mir ein .. function &func () {} geht doch gar nicht, un************pected variable ..
                  wie also machst du das dann ?

                  Zuletzt geändert von Coragon Rivito; 23.01.2005, 18:12.
                  mfg,
                  [color=#0080c0]Coragon[/color]

                  Kommentar


                  • #10
                    Ich mache das so (in etwa)
                    PHP-Code:
                    <?php
                    $loopfunction 
                    uniqid('loop');
                    return 
                    '<?php function '.$loopfunction.'($loopdata) { ?>';
                    ?>
                    zum Erzeugen des Funktionskopfes
                    PHP-Code:
                    <?php
                    $loopfunction 
                    get_loopfunction();
                    return 
                    '<? php '.$loopfunction.'($loopdata); ?>';
                    ?>
                    für den rekursiven Aufruf und
                    PHP-Code:
                    <?php
                    return '<?php }
                    '
                    .$loopfunction.'($template_vars[$loopdata]); ?>';
                    ?>
                    für den initialen Aufruf
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar

                    Lädt...
                    X