Author Topic: tmpl_include in Loop  (Read 1473 times)

0 Members and 1 Guest are viewing this topic.

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
tmpl_include in Loop
on: Wed, 01. October 2008 - 15:02:42
Hallo.

Ich habe folgendes Problem: Ich will bei meiner Seite eine Navigation aufbauen, deren Informationen aus einer MySQL-Datenbank kommt. Das erforderliche Loop-Array wird bei mir per Funktion aufgerufen und ist kein Problem. Auch der Loop an sich funktioniert.

Zum besseren Verständnis die einzelnen Ausgaben / Sourcecodes:

Loop-Array:
Code: [Select]
Array (
  [0] => Array (
    [navi_text] => Aktuelles
    [navi_link] => news/
    [hierarchie_stufe] => 1 
  )
  [1] => Array (
    [...]
    [hierarchie_stufe] => 2
[...]

Dann die Datei oversight.php:

Code: [Select]
require_once page_core/templatesys/vlibTemplate.php;

$tmpl = new vlibTemplate(templates/helvetia.html);

$navigation_links = create_navigation($id_intern);

$tmpl->setloop(navigation, $navigation_links);

$tmpl->pparse();

Zur Erklärung: create_navigation() gibt obiges mehrdimensionales Array aus.

Jetzt zum Template helvetia.tmpl:

Code: [Select]
<tmpl_loop name="navigation">
<tmpl_if name=hierarchie_stufe op=== value=1>
  <tmpl_include file=navigation_main.html>
<tmpl_else>
  <tmpl_include file=navigation_sub.html>
</tmpl_if>
</tmpl_loop>

Hier werden je nach Hierarchie-Stufe verschiedene Templates zur Darstellung der Navigation geladen. Konkret: Wenn in der DB für "hierarchie_stufe" eine 1 steht, ist es ein Hauptbereich und das entsprechende Template wird geladen.

Vllt. noch der Code eines per tmpl_include eingefügten Templates (navigation_main.html):

Code: [Select]
<div class="hauptkategorie">
<a class="hauptkategorie" href="{tmpl_var name=navi_link}">{tmpl_var name=navi_text}</a>
</div>

Nur jetzt ist das Problem: die tmpl_var "navi_link" und "navi_text" werden nicht ersetzt, obwohl das Template innerhalb des Loops eingefügt wird.
Ich nehme an, dies liegt daran, weil die Variablen innerhalb des eingefügten Templates nicht vorhanden sind. Gibt es eine Möglichkeit, diese Variablen mit Inhalt zu füllen? Ich habe die Doku und das Forum durchsucht, aber zu diesem Problem keine Lösung finden können.

vielen Dank schon im Voraus.
Grüsse
Christoph Geiser
Last Edit: Wed, 01. October 2008 - 15:28:03 by Christoph Geiser

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #1 on: Wed, 01. October 2008 - 18:33:09
Drei Fragen:
- Welche Version von vLIB setzt Du ein?
- Was passiert, wenn der Quellcode nicht inkludiert wird, sondern im Klartext dort steht?
- Wie sind die Variablen in der "vlibIni.php" gesetzt?

Mich interessieren folgende Werte:

Code: [Select]
MAX_INCLUDES => 2,
GLOBAL_VARS => 1,
GLOBAL_CONTEXT_VARS => 1,
LOOP_CONTEXT_VARS => 1,
SET_LOOP_VAR => 1

"GLOBAL_CONTEXT_VARS" ist nicht ganz so wichtig, weil sie für Deine Programmierung nicht relevant sind.

Danke und Gruß
Claus

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
Re: tmpl_include in Loop
Reply #2 on: Wed, 01. October 2008 - 21:06:27
1.) 4.1.0. ... ich sollte vllt. grad mal auf 4.2.0 updaten.
2.) Dann werden die Variablen mit den Werten aus der DB gefüllt -> Es funktioniert folglich.
3.) Meine Werte sind wie folgt:
  • MAX_INCLUDES => 2
  • GLOBAL_VARS => 1
  • GLOBAL_CONTEXT_VARS => 1
  • LOOP_CONTEXT_VARS => 1
  • SET_LOOP_VAR => 1

Ich weiss, dass ich den Navi-Code eigentlich auch direkt in das Haupttemplate schreiben könnte, nur möchte ich möglichst jeden Teil der Seite in einem eigenen Template haben, damit man das Ganze leicht anpassen kann.

Edit: Ich habe gerade auf 4.2.0 updated, beim includen des Templates kommt aber das selbe Resultat raus... :(
Last Edit: Wed, 01. October 2008 - 21:22:14 by Christoph Geiser

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #3 on: Thu, 02. October 2008 - 00:15:32
Ich kann den Fehler reproduzieren. Ich versuche in den nächsten Tagen eine Lösung zu finden. Wenn es nicht klappt, musst Du den Code ins Template aufnehmen, oder Deinen Ansatz ändern:

- Modulares Programmieren mit REQUIRE_ONCE
- Beispiel 2: Modulares Programmieren mit REQUIRE_ONCE

Damit geht es auf jeden Fall, weil die modularen Teile mit PHP inkludiert werden und nicht mit vlibTemplate.

Gruß
Claus

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #4 on: Thu, 02. October 2008 - 00:23:54
Sorry, vergiss es. Dein Vorhaben geht nicht. Ich habe gerade folgenden Thread gefunden:
tmpl_include innerhalb von loops

Damit ist bewiesen, dass in einem Loop die Variablen aus "tmpl_include" nicht funktionieren. Ich war da auf einem falschen Dampfer und dachte, es hätte etwas mit den Variablen im Template-Loop zu tun bzw. einem Wert in der "vlibIni.php".

Du musst wie oben erwähnt umstellen oder die paar Zeilen ins Template schreiben.

Gruß
Claus
Last Edit: Thu, 02. October 2008 - 19:42:01 by ClausVB

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
Re: tmpl_include in Loop
Reply #5 on: Thu, 02. October 2008 - 09:09:44
Okay, den Ansatz mit require_once() verstehe ich durchaus, nur wird das in meinem Fall wahrscheinlich nicht richtig funktionieren, da bei mir im Template viele verschieden DIV-Container ziemlich komplex verschachtelt sind. Eine Möglichkeit wäre, das Haupttemplate zu splitten und die immer statisch bleibenden Teile durch verschiedene PHP-Files zu laden; die dynamischen Teile könnte man dann direkt im Haupt-PHP-File durch if()-Schleifen erledigen. Das ist aber ziemlich aufwändig und reisst die "Template-Logik" auseinander. Gibt es eine Möglichkeit, die Klasse so abzuändern, dass Loop-Variablen auch innerhalb des includeten Templates verfügbar werden?

Ein weiterer Ansatz wäre wahrscheinlich auch, dass man mittels einer Zählvariable versucht, das Array als tmpl_var zu definieren. Wenn ich mein Array oben wie folgt definieren würde:

Code: [Select]
$counter = 1;

foreach($navigation_links as $key => $navigation_unterarray) {
    foreach($navigation_unterarray as $key_2 => $value) {
        $tmpl->setvar(navi_element[$counter][$key_2], $value);
    }
    $counter++;
}

Ich teste das mal und gebe hier eine Rückmeldung. Wahrscheinlich wird das aber nicht gehen, weil das auch wiederum einem Template-Ansatz widerspricht, nämlich dem der dynamischen Variablen...

Edit: Auch dieser Ansatz funktioniert nicht... man muss eine Variable fest definieren, es geht nicht mit PHP-Variablen. Ich finde das etwas schade, weil es in meinen Augen ziemlich umständlich wird, immer das selbe Template mehrmals zu verwenden, ohne dass man es mit require_once() macht. require_once() finde ich gerade bei grösseren Seiten mit viel dynamischem Content nicht so wahnsinnig berauschend.

Ich bräuchte nämlich dann mitten im HTML-Code ein PHP-Script, welches für mich entscheidet, welches Template jetzt geladen werden soll. Ich habe wirklich keinen blassen Schimmer, wie ich das machen soll, da man ja mit vlibTemplate keine php-Scripts includen kann und auch nicht soll. *confused*
Last Edit: Thu, 02. October 2008 - 10:12:26 by Christoph Geiser

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #6 on: Thu, 02. October 2008 - 10:31:43
Quote
Gibt es eine Möglichkeit, die Klasse so abzuändern, dass Loop-Variablen auch innerhalb des includeten Templates verfügbar werden?

Du kannst Dich gerne auf die Suche machen, "be my guest"  :).

Ich habe diese Grundsatzdiskussion schon X-Mal geführt und werde es nicht wieder tun. Für mich sind einzelne Module, also ein auseinandergerissenes Template ein Vorteil, weil es einzelne Module sind. Ich war damals dagegen, das Kelvin (Erfinder von vLIB) den

Code: [Select]
<tmpl_include file={var:header}>
<tmpl_include file={var:body}>

für einen einzigen Forums-User umgesetzt hat. Es verlagert Logik ins Template, die da nicht hingehört. Der nächste Wunsch ist dann FOREACH im Template zu haben und dann mit TMPL_IF im Template Variablen zu prüfen. Das wird es nicht geben!

Ich habe mit vlibTemplate auch komplexe Layouts umgesetzt, wie das YAML und das geht sehr gut mit dem oben genannten Ansatz.

Entweder Du schreibst vlibTemplate um, so das es geht, oder Du musst auf TMPL_INCLUDE in einem Loop verzichten und den Quelltext dort nicht auslagern.

Gruß
Claus
Last Edit: Thu, 02. October 2008 - 11:39:27 by ClausVB

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
Re: tmpl_include in Loop
Reply #7 on: Thu, 02. October 2008 - 10:49:32
Ich wollte mit dir keine Grundsatzdiskussion anzetteln, ich versteh deine Argumentation. Für mich macht dann einfach die Funktion <tmpl_loop ...> keinen Sinn mehr, wenn Loop-Variablen nicht automatisch auch in includeten Templates verfügbar werden. Man kann ja die IF-Prüfung mal beiseite lassen und so was machen:

Code: [Select]
<tmpl_loop name="newsmodul">
<tmpl_include file=news_template>
</tmpl_loop>

und das würde dann ja auch nicht funktionieren, oder seh ich das falsch? :)
Liebe Grüsse
Christoph

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #8 on: Thu, 02. October 2008 - 11:22:15
Richtig, aber es würde folgendes funktionieren:

Code: [Select]
<tmpl_include file=navigation_main.html>
navigation_main.html:
Code: [Select]
<tmpl_loop name="newsmodul">
  <div class="hauptkategorie">
    <a class="hauptkategorie" href="{tmpl_var name=navi_link}">{tmpl_var name=navi_text}</a>
  </div>
</tmpl_loop>

Es geht auch
Code: [Select]
<tmpl_include file={var:welches_newsmodul}>aber Du musst halt umdenken und der LOOP muss innerhalb des TMPL_INCLUDES liegen.

Gruß
Claus
Last Edit: Thu, 02. October 2008 - 11:38:01 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #9 on: Thu, 02. October 2008 - 11:45:24
Nur mal zur Info ...

Das kann nicht funktionieren:
Code: [Select]
$tmpl->setvar(navi_element[$counter][$key_2], $value);
*Augenzwinker* Vielleicht solltest Du mal Deine PHP-Grundlagen etwas aufpolieren :) und den Unterschied zwischen " und nachschlagen.

Eine Templatevariable dynamisch mit einem Wert zu belegen sollte so aber gehen:
Code: [Select]
$tmpl->setvar(navi_element[$counter][$key_2], $value);
Denn wenn ich den Ansatz richtig verstanden habe ist
navi_element[$counter][$key_2] => "ein_string_den_es_im_template_als_variable_gibt"

Gruß
Claus

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
Re: tmpl_include in Loop
Reply #10 on: Thu, 02. October 2008 - 15:53:46
Arrgh, danke ^^

Danke sehr für die Lösungsansätze...

MOD: Fullquote der Lösung gelöscht.

Manchmal sieht man vor lauter Bäumen den Wald nicht :)
Ich danke dir vielmals! *g*
Last Edit: Thu, 02. October 2008 - 19:38:01 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #11 on: Thu, 02. October 2008 - 17:07:06
Manchmal sieht man vor lauter Bäumen den Wald nicht
Ich danke dir vielmals! *g*

Du hast Deine Frage vorbildlich gepostet (danke dafür!), also helfe ich Dir auch. Wenn es mit einem anderen Ansatz geht bin ich ja froh, aber wenn Du einer dieser "Es-muss-so-gehen-wie-ich-will" Typen gewesen wärst, dann schalte ich auch auf stur :).

Du hast so redundanten Code, weil der LOOP in jedem TMPL_INCLUDE stehen muss. Aber ich würde es wie gesagt gar nicht so umsetzen, wie Du es tust und ich habe mit dem REQUIRE_ONCE-Ansatz bis jetzt alles umsetzen können. Aber mach Du mal ...  :).

Freut mich, dass meine intensive Recherche (plus drei Telefonate mit einem Mitentwickler) in der Sache jetzt doch gefruchtet haben. ;D

Gruß
Claus
Last Edit: Thu, 02. October 2008 - 17:12:20 by ClausVB

Offline Christoph Geiser

  • Newbie
  • *
  • Posts: 6
    • Binary-Five
Re: tmpl_include in Loop
Reply #12 on: Thu, 02. October 2008 - 18:48:51
Du hast Deine Frage vorbildlich gepostet (danke dafür!), also helfe ich Dir auch. Wenn es mit einem anderen Ansatz geht bin ich ja froh, aber wenn Du einer dieser "Es-muss-so-gehen-wie-ich-will" Typen gewesen wärst, dann schalte ich auch auf stur :).

[...]

Freut mich, dass meine intensive Recherche (plus drei Telefonate mit einem Mitentwickler) in der Sache jetzt doch gefruchtet haben. ;D

Ich möchte ja ein "Winner" sein, kein "Luser" ^^ Ich danke dir für die Zeit, die du für mich aufgewendet hast. Ich spendier dir ein virtuelles Bier :D (In der Schweiz werden alle solchen "Schulden" mit einem Bier beglichen).

Der Post kann glaub ich geschlossen werden, falls weitere Probleme auftauchen, melde ich mich nochmal. :)
Grüsse von jenseits des Juras
Christoph

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include in Loop
Reply #13 on: Thu, 02. October 2008 - 19:39:14
Es werden nur Threads geschlossen, die OFF-Topic sind oder von illegalen ("Ich-ignoriere-alle-Regeln!") Postern erstellt werden.

Willkommen an Bord, Winner!  ;D

Gruß
Claus