hotti: Template Geraffel

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

  1. 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

    1. 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

  2. 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

    --
    Viele unbezahlte Rechnungen lassen Brieftaschen oft dicker aussehen.
    1. 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.
      
      1. 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
        
        1. 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

          1. 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

            1. 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