Author Topic: tmpl_include innerhalb von loops  (Read 1486 times)

0 Members and 1 Guest are viewing this topic.

BlueBook

  • Guest
tmpl_include innerhalb von loops
on: Sat, 12. May 2007 - 16:14:24
Hallo,

ich hab für ein projekt das templatesystem eingesetzt, finde es soweit auch sehr schick!

allerdings bin ich eben fast verzweifelt, bis ich erst einmal begriffen hab was passiert.

ich hab einen loop und innerhalb des loops rufe ich ein tmpl_include auf.
hire ein bissel beispiel code:

Code: [Select]
   <tmpl_loop name=Datei>
      tirTraTrullalla

      <tmpl_include file=KategorieEigenschaften.htm>
   </tmpl_loop>

innerhalb von KategorieEigenschaften.htm versuche ich nun wieder auf Variablen zuzugreifen.
da ich mich aber innerhalb eines loops befinde, natürlich auf jene, welche die aktuellen innerhalb des loops sind.

geht aber nicht, da ich nun "aufeinmal" wieder quasi ganz am anfang stehe und über datei loopen kann.

ist das wirklich so gewollt?
finde das etwas unpraktisch.

Gruß
BB
Last Edit: Sat, 12. May 2007 - 16:21:17 by ClausVB

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include innerhalb von loops
Reply #1 on: Sat, 12. May 2007 - 16:47:41
Quote
ist das wirklich so gewollt?

Man kann sicherlich darüber streiten, aber ja, das ist so gewollt. Eigentlich müsste sogar eine Fehlermeldung erscheinen, dass so etwas gar nicht geht. Du verlegst Programmierlogik ins Template, das sollte man nicht machen.

Der TMPL_INCLUDE ist für einfache, möglichst statische Dateien gedacht. Man kann damit auch noch Navigation aufbauen und steuern, jedoch nicht LOOPs mehrdimensional verschachteln. Dazu ist PHP da.

Die Schlussfolgerung wäre nämlich, dass vlibTemplate auch einen TMPL_INCLUDE in der sechsten LOOP-Ebene zulässt oder vielleicht Rekursionen programmiert werden können, nein, dazu ist vlibTemplate nicht da.

Du solltest Dir
Modulares Programmieren mit REQUIRE_ONCE
ansehen. Dort wird sämtliche Logik mit PHP gemacht und nur noch die Ausgabe erfolgt mit vlibTemplate.

Das was Du möchtest könnte aber mit Smarty gehen, weil Smarty IMHO schon eine eigene (leicht abgespeckte) Programmiersprache ist.

Gruß
Claus

BlueBook

  • Guest
Re: tmpl_include innerhalb von loops
Reply #2 on: Sat, 12. May 2007 - 19:46:18
Also erst Mal verleg ich hier keine Programmlogik ins Template,
sondern kapsle viel ehr nur Templates in sich noch einmal, um diese an andere Stelle wiederverwenden zu können.

Also ähnlich Deiner Beschreibung unter: Modulares Programmieren mit REQUIRE_ONCE.
Wenn man dabei von einer gradlinigen Struktur ausgeht ist das natürlich alles ganz schön rein im PHP machbar, wie Du ja gut dargestellt hast.
Kommt man allerdings mit der Anforderung um die Ecke den Code in Abhängigkeit wiederverwenden zu wollen, geht es wohl kaum anders.

Auch ist die von Dir beschriebene mehrdimensionale Verschachtelung von Loops genau die gleiche wie ohne include, nämlich immer straight forward.
Aber eignetlich benötige ich dies (was übrigens auch schon funktioniert) gar nicht, sondern möchte jediglich auf die "richtigen" "Umgebungsvariablen" im TMPL_INCLUDE zugreifen.
Das Problem mit den Rekursionen dürftet Ihr aber bzgl. TMPL_INCLUDE jetzt auch schon haben. (a includiert b, b wiederum a), falls ein include im include möglich ist.
Allerdings seh ich auch nix schlimmes an einem TMPL_INCLUDE in der x´ten Loopebene...

Mein konkreter Fall wäre etwas komplex für ein Beispiel, aber hier mal ein rekonstruierter Fall, vielleicht siehst Du ja noch eine andere Alternative?

Man hat eine Tabelle mit Daten und möchte im letzten Feld einen Button mit Link anzeigen (der aber dafür Daten aus dem Loop benötigt).
Da man diesen Button an x-Stellen in der Anwendung benötigt soll er in ein eigenes Template ausgelagert werden.


Gruß
Marc

smarty kann das übrigens, aber smarty war mir persönlich einfach zu klobig...
ggf. solltest Du die Beschreibung Modulares Programmieren mit REQUIRE_ONCE um eine warunung oder so erweitern im Bezug auf das include in loops.

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include innerhalb von loops
Reply #3 on: Sat, 12. May 2007 - 22:22:07
Ich glaube, ich weiß, worauf Du hinaus willst. Der Button könnte zum Beispiel eine Grafik sein, der unterschiedlich lang sein muss, je nach Konstellation der Daten des Loops, richtig?

Die Abhängigkeiten müssen mit in den LOOP gepackt werden ungefähr so:
http://lamp.clausvb.de/vlib_examples/forum/sister_sourcecode.php

Wenn der Button oder die Grafik auch noch viel HTML enthält und CSS-Eigenschaften dafür seperat gesetzt werden müssen, wirst Du wohl oder übel ein Feld in den LOOP integrieren müssen, der diesen Code enthält. Woher der Code dann kommt (DB, Include-Datei) ist völlig egal.

Ich habe solche Probleme bis jetzt immer über CSS-Klassen gelöst, die dann wie im Beispiel oben mitgeliefert wurden und damit kann man schon eine ganze Menge machen.

Letztendlich wirst Du aber selbst dann redundanten Code haben:

Code: [Select]
<img src="{tmpl_var name=pfad_und_bild}" class="{tmpl_var name=css_klasse}" />
An solchen Stellen ist Smarty dann einfach leistungsstärker bzw. kann individueller genutzt werden, aber es gibt einfach noch nichts, was ich mit vlibTemplate nicht realisieren konnte.

Gruß
Claus

BlueBook

  • Guest
Re: tmpl_include innerhalb von loops
Reply #4 on: Sat, 12. May 2007 - 23:38:11
okay, ich glaub das wird jetzt schwierig aber ich versuche es...

Quote
Wenn der Button oder die Grafik auch noch viel HTML enthält ... wirst Du wohl oder übel ein Feld in den LOOP integrieren müssen, der diesen Code enthält. Woher der Code dann kommt (DB, Include-Datei) ist völlig egal.

Genau daran liegt es, es ist so viel HTML, dass man dieses halt wiederum gerne durch ein Template darstellen möchte.
Und das geht halt z.Z. nicht wirklich:
Das Ergebnis des Templates kann ich nicht als "fertiges" HTML in eine Variable für den LOOP stellen, weil pparse() ja immer direkt ausgibt.
Und es später über Inculde erst mit dem anderen auszugeben funktioniert ja auch nicht, weil das Template auf die Umgebungsvariablen angewiesen ist und daher über include in einem LOOP stehen müsste.

Ich hoffe es war halbwegs verständlich.

Ansonstne konkret zu den Beispielen:

Also das Beispiel mit der Grafik und der Länge... könnte man wohl über css lösen, wird jetzt schwierig es daran zu erklären.
Bei dem Link zu der Datei, wäre die Doppelung bei dem : <tmpl_if name=farbe>style="background-color: red;"</tmpl_if>>

Ich versuch es noch mal an einem anderen Beispiel:

Nehmen wir eine Tabelle A, welche pro Zelle wiederum eine Tabelle B beinhaltet.
Dies liese sich ja über eine Arraystruktur und zwei verschachtelte LOOPs ganz leicht abbilden.
Möchte man nun aber den HTML-Code der Tabelle B in ein eigenes Template extrahieren und an anderer Stelle wiederverwenden, geht das nicht, weil ja includes innerhalb von LOOP nicht gestatet wären und man damit obigen Sachverhalt gar nicht darstellen könnte.

Okay, mir geht es eigentlich ja auch nur darum, dass includes innerhalb von LOOPs sinnvoll sind und vielleicht zukünftig von vlib offizell und richtig unterstützt werden sollten.

Ich meine natürlich kam man immer irgendwie alles hinbekommen, aber ob das dann immer noch so geschickt und schön aussieht bleibt zu bezweifeln.

Ihr habt mit der vlib-engine wirklich was sehr tolles auf die beine gestellt, das war auch bisher das einzige Manko was mir aufgefallen ist und ich fände es schade, wenn die Engine auch zukünftig so eine "grundlegende" Funktion nicht unterstützen würde. (zumal es ja eigentlich auch schon fast funktioniert, nur die variablen im includierten Template müssen noch richtig gesetzt werden)

Gruß
Marc

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
Re: tmpl_include innerhalb von loops
Reply #5 on: Sun, 13. May 2007 - 14:49:39
Engine auch zukünftig so eine "grundlegende" Funktion nicht unterstützen würde. (zumal es ja eigentlich auch schon fast funktioniert, nur die variablen im includierten Template müssen noch richtig gesetzt werden)
Wenn Du möchtest, kannst Du das gerne programmieren, aber ich werde es nicht machen. vlibMimeMail hat noch ein paar Bugs, die als erstes bereinigt werden müssen.

Entweder verstehe ich Dein Beispiel nicht, oder es stimmt etwas an Deinen Strukturen nicht.

"Nehmen wir eine Tabelle A, welche pro Zelle wiederum eine Tabelle B beinhaltet."
=> hört sich nach Tabellen-Layout an und das ist nicht mehr state-of-the-art.

Aber das würde sich wieder gut mit den oben erwähnten modularen Strukturen erreichen lassen, indem "tabelle_b.php" plus Template den Aufbau macht.

Das phpBB setzt komplett auf Tabellen-Layout und hat sogar einzelne "td" in Funktionen ausgelagert, die dann verschachtelt aufgerufen werden. Das würde mit vLIB auch gehen.

Fazit: Der Ansatz, den Du verfolgst verstößt gegen die Philosophie von vlibTemplate, weil es einen Großteil der Programmierung ins Template verlagert. Es wird genauso wenig FOREACH-Strukturen fürs Template geben, obwohl ich schon die Diskussion hatte, dass Navigationsstrukturen zum Design gehören und deswegen im Template verarbeitet werden müssen.

Diesen Ansatz verfolgt Smarty, aber dann kann man IMHO auch direkt eine Template Engine nur mit PHP verwenden, weil man dann keine Beschränkungen mehr hat.

Du kannst Dein Vorhaben sicherlich mit vlibTemplate umsetzen, aber nicht so, wie Du es geplant hast.

Gruß
Claus