Template Geraffel
hotti
- php
hi,
die Engine Twig kriegt z.B. {{map}} als Array. Derzeit benutze ich jedoch native PHP als Engine, da sieht das so aus
$this->STASH['map'];
// oder, bei mir mit Einheitsgetter
$this->stash('map');
was viel Tipparbeit bedeutet und daran liegt, dass eine T-Engine wie Twig zum rendern direkt den STASH kriegen würde, was bei allen anderen T-Engines, wie auch in Perl der Fall ist.
Möglicherweise möchte ich später mal anstelle native PHP eine TE wie Twig einsetzen und müsste dazu alle meine Templates umschreiben. Um solche Ausssichten etwas erträglicher zu machen habe ich mir folgendes überlegt, im Template oder in meiner Klasse, welche das Template includert:
// create a template object
$to = (object) $this->STASH;
// or use dynamic vars
foreach($this->STASH as $k => $v){
$$k = $v; // nachdem z.B. $k = 'descr' ist, gibt es nun eine Variable $descr
}
// benutze weiter unten dann entweder
// $to->map;
// oder gleich so
// $map
Schwere Entscheidung, mir fehlen noch Erfahrungen, was würdet Ihr machen?
Horst, Schablonenmaschinist
Moin Horscht,
ich benutze Viewer. Dei sehen dann so aus:
class cViewSpecial extends cView
{
public function set2Template( $obj )
{
$this->getTemplate()->setVariable( "irgendwas", $obj->get() );
$this->getTemplate()->setVariable( "irgendwas2", $obj->get2() );
}
}
Im Constructer würde man das Template Objekt übergeben.
Anstelle eines Objektes könnte man auch eine Methode schreiben die ein Array ins Template setzt. Zudem kann man Methoden implementieren, die bestimmte Formate einheitlich ins Template setzt z.B. setDatum() etc...
Ansonsten gibt es pro ObjektTyp einen Viewer. Der kann in den Controllern einfach aufgerufen werden.
Weiß nicht ob dir das was hilft.
Gruß
T(emplate)-Rex
hi,
Weiß nicht ob dir das was hilft.
Ja, das geht in Richtung meiner Überlegungen, danke Dir!
In meiner ModelClass habe ich alles, was ins Template soll, in $this->STASH;
Im Falle Twig sieht der Aufruf so aus
return $twig->render($template, $this->STASH); // BODY
Assign by Reference && Rendering.
Native PHP:
ob_start();
include $this->FILEPATH."/templates/".$file;
return ob_get_clean();
wo dann im Template direkt mit dem STASH bzw. einem Getter operiert wird. Evntl. bringt eine Viewer Klasse mehr Stil (Struktur), ich sehs aber nicht...
Horst Rathlos
hi again,
Schwere Entscheidung, mir fehlen noch Erfahrungen, was würdet Ihr machen?
Für meinen Fall ist die praktische Lösung jetzt diese hier:
foreach($this->STASH as $k => $v){
$$k = & $this->STASH[$k]; // by Reference!
}
Damit sind Vars (Strings oder arrays) im Template direkt namentlich ansprechbar:
<?php echo $descr ?>
und die Valüsen liegen nur einmal im RAM.
@T-Rex
Ja, eine View-Klasse gibt mehr Stil, habs auch kapiert, könnte ich machen, PHP Voodo++
Viele Grüße,
Horst Sparstrumpf
Tach!
foreach($this->STASH as $k => $v){
$$k = & $this->STASH[$k]; // by Reference!
}
> und die Valüsen liegen nur einmal im RAM.
Die Funktion [extract()](http://de2.php.net/manual/en/function.extract.php) existiert bereits. Und die Referenz kannst du dir sparen, die bringt keine Punkte. PHP arbeitet mit copy-on-write. Eine Kopie wird nach einer Zuweisung erst dann angelegt, wenn sich der Wert einer der beiden Variablen ändert. Das wird im Template sicher nicht vorkommen. Also hast du bereits eine Art Referenz. - Verwende Referenzen nur dann, wenn es technisch notwendig ist.
dedlfix.
hi,
foreach($this->STASH as $k => $v){
$$k = & $this->STASH[$k]; // by Reference!
}
> > und die Valüsen liegen nur einmal im RAM.
>
> Die Funktion [extract()](http://de2.php.net/manual/en/function.extract.php) existiert bereits. Und die Referenz kannst du dir sparen, die bringt keine Punkte. PHP arbeitet mit copy-on-write. Eine Kopie wird nach einer Zuweisung erst dann angelegt, wenn sich der Wert einer der beiden Variablen ändert. Das wird im Template sicher nicht vorkommen. Also hast du bereits eine Art Referenz. - Verwende Referenzen nur dann, wenn es technisch notwendig ist.
Vielen Dank!!!
Das sieht gut aus, morgen gehts life.
Horst Leif
s. Thema,
noch ne Frage bez. EXTR_OVERWRITE
mein Template wird includert in einer Methode meiner ModelClass. $this->STASH hat keys wie z.B. 'descr', extract schießt somit eine Variable $descr in die Symboltabelle, was meine Templates wundervoll vereinfacht. Da habe ich doch Collisions überhaupt nicht zu befürchten oder???
Viele Grüße,
Horst Hackethäler
Moin!
s. Thema,
noch ne Frage bez. EXTR_OVERWRITE
mein Template wird includert in einer Methode meiner ModelClass. $this->STASH hat keys wie z.B. 'descr', extract schießt somit eine Variable $descr in die Symboltabelle, was meine Templates wundervoll vereinfacht. Da habe ich doch Collisions überhaupt nicht zu befürchten oder???
Natürlich nicht. Niemand würde auf die Idee kommen, "$this->this" als Templatevariable zu benutzen. Man würde sich nicht wundern, warum $this plötzlich nicht mehr $this ist, sondern $this.
Insbesondere muss man auch keine Angst haben, dass wichtige globale Variablen überschrieben werden. Niemand würde z.B. $this->_POST ins Template schicken.
- Sven Rautenberg
Moin Sven!
Natürlich nicht. Niemand würde auf die Idee kommen, "$this->this" als Templatevariable zu benutzen. Man würde sich nicht wundern, warum $this plötzlich nicht mehr $this ist, sondern $this.
Ich bin begeistert. Der krönende Abschluss eines sonnigen Frühlingstages!
Viele Grüße,
Rolf