Author Topic: nested loops  (Read 1444 times)

0 Members and 1 Guest are viewing this topic.

vertigo

  • Guest
nested loops
on: Sat, 02. September 2006 - 16:19:01
hallo,

ich fange gerade erst mit vLib an und habe ein problem mit nested loops.

das array sieht so aus:
Code: [Select]
array(7)  {
(...)
        ["childs"]=>
        array(5)  {
            [0]=>
            array(8)  {
                ["name"]=>
                string(12)  "Die  Gründung"
                ["link"]=>
                string(15)  "guildFoundation"
(...)
                ["active"]=>
                int(0)
                ["child"]=>
                string(0)  ""
            }
(...)
                ["childs"]=>
                array(2)  {
                    [0]=>
                    array(8)  {
                        ["name"]=>
                        string(9)  "Nach  Rang"
                        ["link"]=>
                        string(13)  "membersByRank"
(...)
                        ["child"]=>
                        string(0)  ""
                    }
(...)

Editiert von CVB: Ich habe den Code stark gekürzt. Bitte keine zu langen CODE-Postings, Code bitte auslagern!


php ist:
Code: [Select]
function getHtml() {
$this->tmpl = new vlibTemplate(_AC_TMPL_PATH./_mainNavi.html);
$this->tmpl->setloop(navi, $this->naviList);
$this->html = $this->tmpl->grab();
return $this->html."<br /><br />".var_dump_html($this->naviList)."<br /><br />";
}

template code ist:
Code: [Select]
[p0]<br />
<TMPL_LOOP name="navi">
{tmpl_var name=name}<br />
<TMPL_IF NAME="child" OP="!=" VALUE="">
&nbsp;&nbsp;&nbsp;&nbsp;[{tmpl_var name=child}]<br />
<TMPL_LOOP name="childs">
&nbsp;&nbsp;&nbsp;&nbsp;{tmpl_var name=childs.name}<br />
<TMPL_IF NAME="childs.child" OP="!=" VALUE="">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[{tmpl_var name=childs.child}]<br />
<TMPL_LOOP name="childs.childs">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{tmpl_var name=childs.childs.name}<br />
</TMPL_LOOP>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[/{tmpl_var name=childs.child}]<br />
</TMPL_IF>
</TMPL_LOOP>
&nbsp;&nbsp;&nbsp;&nbsp;[/{tmpl_var name=child}]<br />
</TMPL_IF>
</TMPL_LOOP>
[/p0]

raus kommt:
Code: [Select]
[p0]
World of Warcraft
Die Gilde
    [p2]
    Die Gründung
    Gildensatzung
    Mitglieder
        [p12]
        [/p12]
    Bosses Down!
    Info
    [/p2]
Aktuell
My Collateral
    [p4]
    Registrieren
    Passwort vergessen?
    [/p4]
Community
    [p6]
    Members
    Foren
    Galerien
    [/p6]
Media
    [p7]
    Files
    Movies
    [/p7]
?
    [p9]
    FAQ
    Glosar
    [/p9]
[/p0]

die ] stehen für spätere divs und dienen nur der übersicht (genau wie die & nbsp;), wie man sehen kann ist zwar [p12] [/p12] vorhanden, aber die schleife läuft wohl nicht durch.

für schnelle hilfe wäre ich sehr dankbar.

grüße
 vertigo
Last Edit: Wed, 06. September 2006 - 11:36:54 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: nested loops
Reply #1 on: Sat, 02. September 2006 - 20:27:11
Das ist mir zu kompliziert. Bitte den ganzen Source-Code oder einen lauffähigen Auszug posten, so dass ich mir den Source-Code ansehen kann.

Wie das geht steht in den Regeln oder ein Beispiel steht hier:
http://lamp.clausvb.de/vlib_examples/basic.php

Außerdem wäre es gut, wenn Du den Array so aufbauen könntest, dass ich ihn mit Copy&Paste übernehmen kann, um das Beispiel auszuprobieren.

Wenn ich die Ausgabe ohne die DIVs (ohne) hinbekomme, sollte das Problem ja auch gelöst sein, oder?

Gruß
Claus

vertigo

  • Guest
Re: nested loops
Reply #2 on: Sun, 03. September 2006 - 13:13:30
hallo claus,

vielen dank für deine schnelle antwort, das array kannst du dir jetzt kopieren. ich habe deinen
ratschlag beherzigt und das ganze mal in gewünschte form gebracht.

finden kannst du es unter http://collateral.xfhosting.com/tool/test.php

und ja, das problem wäre gelöst auch wenn du es ohne divs hinbekommst :-)

ich habe nochmal in der doku geschaut. da findet sich
Quote
If you build an inner loop, the $variable_name becomes the name of the loop, and you start again with the same structure.

daher denke ich, die 2te innere schleife kann man über
Code: [Select]
<TMPL_LOOP name="childs"> die entsprechenden variablen mit
Code: [Select]
{tmpl_var name=childs.name} ansprechen.

versucht, jedoch erfolglos habe ich auch schon
Code: [Select]
<TMPL_LOOP name="childs.childs"> variablen dann
Code: [Select]
{tmpl_var name=childs.childs.name}
ach so, ist ja immer ganz gut, wenn man sehen kann war daraus werden soll.
das ganze soll eine navigation geben, zu sehn ist das hier: http://collateral.xfhosting.com/main.php
die navi funktioniert auch schon, eben nur die 2te innere schleife nicht :-(


grüße
 vertigo
Last Edit: Sun, 03. September 2006 - 13:22:07 by vertigo

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: nested loops
Reply #3 on: Mon, 04. September 2006 - 05:58:57
Hinweis: Die englische Doku stammt noch aus Zeiten von vLIB 4.0.0 aus dem Jahre 2003 oder 2004. Ich bin nach und nach dabei sie auf den aktuellen Stand zu bringen. Da Kelvin nicht mehr mit an Bord ist, weiß ich nicht, was Bug und was Feature ist. Die Doku ist zu 95% verlässlich, aber ein paar Sachen, die dokumentiert sind funktionieren anders. Zum Beispiel kann der TMPL_INCLUDE zum inkludieren von PHP-Dateien verwendet werden, wozu ganz ausdrücklich der TMPL_PHPINCLUDE verwendet werden sollte.

---

Das Problem ist gelöst. Du benutzt die Template-Variablen falsch.

Nicht
{tmpl_var name=childs.name}
sondern
{tmpl_var name=name}

Außerdem benutzt Du die Variablen doppelt. Das funktioniert nicht.

Ich habe die dritte LOOP-Ebene in "kinder" umbenannt:

            2 => array (
                
name => Mitglieder,
                
child => xxp12,
                
kinder => array (
                    
=> array (
                        
name => Nach  Rang,
                        
child =>  ,
                        
childs => 
                    
),
                    
=> array(
                        
name => Nach  Klasse,
                        
child => ,
                        
childs => 
                    
)
                )
            ),



Danach funktioniert die Ausgabe in der dritten Ebene.

Das Template sieht dann so aus:

Code: [Select]
        <TMPL_LOOP name="childs">
            &nbsp;&nbsp;&nbsp;&nbsp;{tmpl_var name=name}<br />
            <TMPL_IF NAME="child" OP="!=" VALUE="">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Child: {tmpl_var name=child}]<br />
                <TMPL_LOOP name="kinder">
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name: {tmpl_var name=name}<br />   
                </TMPL_LOOP>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[/{tmpl_var name=child}]<br />
            </TMPL_IF>
        </TMPL_LOOP>

Die inneren Loops können die gleichen Namen für Template-Variablen enthalten, aber ich rate sehr dringend davon ab das zu tun. Bedenke, dass ein Template etwas Statisches ist und keine OOP (childs.childs.name) möglich ist. Das es bei "childs.name" funktioniert wundert mich eher, als dass es mir sinnvoll erscheint. Gerade weil ein Template etwas Statisches ist, würde ich die Ebenen vielleicht durchnummerieren:
erste_name
- zweite_name
- - dritte_name

Wenn Du Deine Navigation so (mit allen PHP Freiheiten) aufbauen möchtest, empfehle ich die Template Engine nur mit PHP.

Ich habe im Moment keinen Zugriff auf meinen Server, aber wenn Du nicht klar kommst, poste ich das ganze Beispiel heute Abend noch einmal auf meinem Server (lamp.clausvb.de).

Gruß
Claus
Last Edit: Mon, 04. September 2006 - 06:12:03 by ClausVB

vertigo

  • Guest
Re: nested loops
Reply #4 on: Mon, 04. September 2006 - 22:12:02
super, das klappt so  ;D

vielen dank für deine mühen claus, ich denke ich werde dich noch das ein oder andere mal
zu rate ziehen  8)

grüße
 verigo

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: nested loops
Reply #5 on: Wed, 06. September 2006 - 10:44:21
vielen dank für deine mühen claus,

Ich bedanke mich auch bei Dir, weil Du mir mit den Code-Postings auf Deinem Server entgegen gekommen bist. Das steht zwar so in den Regeln, aber macht kaum einer. Code hier im Forum zu lesen und im Kopf zu parsen ist aber sehr schwer, deswegen muss jeder "Hilfe-Suchende" auch aktiv an der Lösung mitarbeiten und seine Hausaufgaben machen.

Das hast Du getan und dafür bedanke ich mich.

Gruß
Claus