Author Topic: tmpl_if und variable values  (Read 1699 times)

0 Members and 1 Guest are viewing this topic.

jermyn

  • Guest
tmpl_if und variable values
on: Fri, 16. September 2005 - 17:18:29
Hallo Claus und die anderen, die mitlesen.

Ich war bis jetzt eigentlich sehr begeistert von dem vLib Template System bis
ich heute auf eine Sache gestossen bin, die ich sehr komisch finde und für die ich keine Lösung gefunden habe. Wenn möglich, dann schreibt mit bitte wenn Ihr eine Idee habt, wie ich das löse. Sonst muss ich leider auf eine andere Template Engine umsteigen.

Das Problem liegt in einem HTML Select, den ich aufbauen will. Ich habe einen DB Loop, der das select baut. Jetzt möchte ich nach der ersten Auswahl das gleiche Form wieder aufrufen und die Auswahl soll selektiert sein. Ich habe das so versucht:

Code: [Select]
select class=field name=fpid
tmpl_loop name=foerderprogramm
     option value={tmpl_var name=fpid} tmpl_if name=fpid op=== value=2selected/tmpl_if{tmpl_var name=fpname}
/option
/tmpl_loop
/select

Das Problem für den Select ist der Vergleich auf den statischen Wert. Ich brauche hier eine Variable in dem tmpl_if auf die ich vergleichen kann. Ich habe meine Variable aus dem abgesendeten Form in PHP abgefangen und auch mit setVar an vLIB übergeben.

Im Forum habe ich auch schon die negative Antwort gelesen -> dass eben nur Strings unterstützt werden. Aber ich kann mir nicht vorstellen, dass noch niemand dieses Problem hatte.

Über Antworten wäre ich sehr dankbar Da ich bis Montag dieses kleine Projekt fertig haben muss, muss ich mich bald entscheiden, welchen Weg ich gehe.

DANKE
Last Edit: Tue, 27. December 2005 - 15:52:48 by ClausVB

jermyn

  • Guest
tmpl_if und variable values
Reply #1 on: Mon, 19. September 2005 - 22:46:23
Hallo Claus,

ich hab mir die vLIB Template Engine angepasst. Jetzt kann ich in den TMPL_IF auch gegen TMPL_VARS`s vergleichen.

Ich hab eben gelesen, dass du dich im Urlaub befindest. Wäre nett, wenn du dich kurz melden würdest (natürlich nach deiner Rückkehr) und wir kurz die Änderung besprechen können. Vielleicht war meine Aktion ja unnötig, da du eine viel bessere Lösung kennst....

Gruß Werner

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
tmpl_if und variable values
Reply #2 on: Tue, 20. September 2005 - 11:05:51
Quote
Ich hab eben gelesen, dass du dich im Urlaub befindest. Wäre nett, wenn du dich kurz melden würdest (natürlich nach deiner Rückkehr) und wir kurz die Änderung besprechen können. Vielleicht war meine Aktion ja unnötig, da du eine viel bessere Lösung kennst....
Ich kenne eine bessere Lösung, bin aber nicht sicher ob sie Dir gefällt. Ich mache alle Vergleiche soweit es irgendwie geht in PHP. Natürlich ist es manchmal einfach praktischer mit TMPL_IF zu prüfen, aber es widerspricht dem Gedanken von Templating, aufwendige
- SWITCH-CASE Strukturen
- IF Strukturen
mit Templating umzusetzen.

Ich mache also die meisten IF-Strukturen PHP-seitig und übergebe dann dem Template nur noch Werte.

Beispiel:
Es gibt verschiedene Eskalations- oder Prioritätslevel in einer DB (sagen wir 4 Stück). Diese 4 Stück können in der DB als Name stehen:
- Blau
- Grün
- Gelb
- Rot
oder als Zahlen
- 1, 2, 3, 4

Ich verwende meistens Zahlen (Primary Key) in solchen Fällen. Es gibt jetzt 2 Varianten das zu lösen:

Code: [Select]
switch priority
{
    case 1
        prio_gif = blue.gif;
    break;
    case 2
        prio_gif = green.gif;
    break;
    case 3
        prio_gif = yellow.gif;
    break;
    case 4
        prio_gif = red.gif;
    break;
    default
        error_messageNO_PRIORITY;
}

und dann übergibt man das GIF (den Text, das PDF, etc.) mit der Methode "setVar".

oder Du machst eine TMPL_IF, TMPL_ELSEIF Struktur

Code: [Select]
tmpl_if name=prio op=== value=1
  blau
tmpl_elseif name=prio op=== value=2
  grün
...
tmpl_else
   Fehlermeldung Keine Prio gesetzt
/tmpl_if

Das INCLUDE-Prinzip: Wenn das oben genannte noch nicht ausreicht, kann man auch völlig modular mit
- include header.php (benutzt das Template header.htm)
- include prio_blue.php (benutzt das Template prio_blue.htm)
usw. arbeiten. Damit teilt man nicht nur seine Seite in mehrere logische Bereiche auf, sondern man ist komplett unabhängig von der angesprochenen TMPL_IF Problematik, da alles völlig wahlweise und modular zusammengestellt werden kann.

Ich verwende das INCLUDE-Prinzip auf meiner Homepage, um "Header", Navigation und "Footer" immer einzubinden, die verschiedenen Inhalte aber dynamisch aus ein DB. Der User bestimmt durch seinen Klick auf verschiedene Navigationspunkte, welche Datei inkludiert werden muss.

So kann ich mit vLIB sehr modular arbeiten. Kein Skript hat mehr als 20 Zeilen und jedes Skript bildet eine logische Einheit. Ich persönlich könnte sogar auf die Vergleichsmöglichkeiten von TMPL_IF verzichten, weil ich alle "komplizierten" IF-Strukturen in PHP mache.

Fazit: Du solltest Dein Problem also mit PHP und nicht mit TMPL_IF lösen.

Ich hoffe, dass hilft Dir etwas.

Gruß
Claus
Last Edit: Tue, 20. September 2005 - 11:15:26 by ClausVB

jermyn

  • Guest
tmpl_if und variable values
Reply #3 on: Tue, 20. September 2005 - 13:59:02
Hallo Claus,

ich sehe das ja genau so wie du.

Aber - ich versuche natürlich Code zu sparen - wie jeder. Deine Lösung erfordert ja eine Case Condition in PHP. Wenn ich jedoch eine Auswahlliste(select/option) eines Forms aus einer DB Tabelle mit Einträgen versorge, benutze ich natürlich sehr gerne die setDBLoop Funktion. Quasi perfekt. Nur das einzige Problem ist eben die selected Option zu setzen. Auf PHP Seite komme ich ja nicht mehr an die Daten ran, bzw. würde ja die schöne Funktion des setDBLoop ausser Kraft setzen, wenn ich von Hand den Loop aufbauen würde.

Siehst du meinen Punkt?

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
tmpl_if und variable values
Reply #4 on: Wed, 21. September 2005 - 11:25:00
Quote
Siehst du meinen Punkt?
Ich verstehe das sehr gut. Ich habe mich schon oft darüber geärgert, dass man mit "setdbloop" nicht ohne weiteres Datumsanzeigen (Unix-Timestamp => "Mittwoch, 21.09.2005") oder Konvertierungen machen kann. Aber das ist eben so. Man muss in solchen Fällen mit "array_push" arbeiten und das ist auch richtig so, weil wir sonst bei Smarty landen, wo man im Template
- FOREACH
- SUBSTRING
- reguläre Ausdrücke
und vieles mehr unterstützt.

Immer wenn man in vLIB etwas aufbereiten möchte, Daten verändern möchte, sollte man das mit PHP machen. Trotzdem habe ich vielleicht eine Lösung für Dich.

Hier in dem Forum gibt es zu jedem Post einen "author_name". Den möchte ich jetzt in einem Template in Checkboxen umwandeln. Immer wenn der Autor gleich "ClausVB" ist, soll die Checkbox gesetzt sein:
Code: [Select]
SELECT author_name, IFauthor_name = ClausVB, 1, 0 AS boolean
FROM vlib_posts
Das gibt zurück:
Quote
paulfontfreide 0
vv 0
releasedj 0
ClausVB 1
releasedj 0
releasedj 0
ClausVB 1
releasedj 0
ClausVB 1
ClausVB 1
releasedj 0
Damit kann ich die Templatevariable "boolean" auf "checked" (oder "selected") setzen, wenn "boolean" == 1 ist.

Fazit (meine Meinung): Alles was SQL nicht kann, darf vom Template oder "setdbloop" nicht unterstützt werden. Solche Fälle müssen mit PHP und "array_push" gelöst werden.

Gruß
Claus
Last Edit: Wed, 19. July 2006 - 11:12:14 by ClausVB

jermyn

  • Guest
tmpl_if und variable values
Reply #5 on: Wed, 21. September 2005 - 11:31:52
Clevere Idee

Hatte wohl mal wieder ein Brett vorm Kopf. Die Programmierung ins SQL zu velegen ist ja wirklich nicht blöd. Ich denk mal drüber nach und werde das bei Gelegenheit mal austesten.

Werde jetzt aber wohl das schon abgegebene Projekt nicht mehr ändern ;-)

Gruß Werner

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
tmpl_if und variable values
Reply #6 on: Wed, 21. September 2005 - 11:44:43
Quote
(...) Die Programmierung ins SQL zu velegen ist ja wirklich nicht blöd. Ich denk mal drüber nach und werde das bei Gelegenheit mal austesten.
Dem stimme ich zu. Allerdings kann das gerade bei Datumskonvertierungen sehr aufwendig werden, wie folgender Post von Yaslaw Kowalejeff beweist.

Da arbeite ich lieber mit "vlibDate" und "array_push". Ich bleibe dabei ... Alles was SQL nicht kann, darf vom Template oder "setdbloop" nicht unterstützt werden. Solche Fälle müssen mit PHP und "array_push" gelöst werden.

Eine Template Engine wie Smarty will ich für vLIB nicht. Wenn Du aber solche IF-Strukturen haben willst und auch Datum im Template umwandeln möchtest, dann solltet Du Dir TinyButStrong (Beispiele) ansehen.

Ich setze das für mein GPL Produkt "dl_stats 2.0" ein. Ich finde es allerdings 1.000 mal komplizierter als vLIB.

Gruß
Claus

Offline ClausVB

  • Administrator
  • Hero Member
  • *****
  • Posts: 566
    • Homepage: clausvb.de
tmpl_if und variable values
Reply #7 on: Tue, 27. December 2005 - 15:51:33
Nachtrag: Man kann eine Menge mit SQL lösen und SETDBLOOP verwenden.

Code: [Select]
select_files = SELECT l_name, REPLACELEFTl_text, 400, a, <a AS substr_text FROM dl_licences ORDER BY l_name;Bei meiner Applikation sollen alle HTML-Tags auch umgewandelt werden. Aus irgendwelchen Gründen haben
- Firefox
- und IE
aber Probleme mit einem geöffneten A-Tag (<a>), der dann auf einen </td> trifft. Also lasse ich mit MySQL die eröffnenden A-Tags ersetzen.

Gruß
Claus