Eigene Templateklasse Verbesserungsvorschläge

newwarrior

Erfahrenes Mitglied
Hallo,

ich habe eine kleine Templateklasse geschrieben für meine eigene Projekte. Ja ich weiß es gibt sehr gute andere Projekte, doch sind diese mir meistens zu groß bzw. einfach nicht mein Ding und ich lerne ja auch noch dabei.

Also wie folgt sieht sie aus:

PHP:
<?php
	error_reporting(E_ALL);
	
	class template {
	
		/*
			Variables that be use in that class
			and their content
		*/
		
		private $templateDIR = 'templates/';
		private $templateName = '';
		private $templateFile = '';
		private $template = '';
		
		private $leftborderF = '{';
		private $rightborderF = '}';
		private $leftborderVAR = '{$';
		private $rightborderVAR = '$}';
		
		public function __construct($tpl_dir = '', $lang_dir = '')
		{
			if(!empty($tpl_dir))
				$this->templateDIR = $tpl_dir;
				
			if(!empty($lang_dir))
				$this->languageDIR = $lang_dir;	
		}
		
		public function load($file)
		{
			$this->templateName = $file;
			$this->templateFile = $this->templateDIR.$file;
			
	       if( !empty($this->templateFile) ) {
	            if( file_exists($this->templateFile) ) {
	                $this->template = file_get_contents($this->templateFile);
	            } else {
	                return false;
	            }
	        } else {
	           return false;
	        }
	        
	      $this->parseTemplate();
	        			
		}
		
		public function assign($replace, $replacement)
		{
			$this->template = str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template);
		}
		
	    private function parseTemplate() {
	        while( preg_match( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
	                           .$this->rightborderF ."/isUe", $this->template) )
	        {
	            $this->template = preg_replace( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
	                                            .$this->rightborderF."/isUe",
	                                            "file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
	                                            $this->template );
	        }
	    }
		
	    public function display() {
	        echo $this->template;
	    }
		
	} 

?>

Aktuell arbeite ich noch ein Cache Verfahren ein.
Was kann ich noch verbessern?

Hatte überlegt noch mit Blöcken zu arbeiten, weiß aber noch nicht so wirklich wie ich das am besten machen soll.

Danke für die Hilfe.

NW
 
Ich meinte einen Unit-Test im Sinne von PHPUnit oder etwas ähnliches.

Der Vorteil von Unit-Tests mittels Test-Klasse ist offensichtlich: "Führt meine Änderung oder mein neues Feature XYZ dazu, das meine bisherige Implementierung noch funktioniert?"

Es im Browser ausgeben zu lassen ist IMHO kein Unit-Test.

Die __set()-Methode bringt keine Verbesserung gegenüber deiner Implementierung. Außer vielleicht der Lesbarkeit. Was schön wäre, wenn deine assign-Methode eine Back-Reference auf sein eigenes Objekt zurück geben würden, denn dann könnte man so was machen:

PHP:
$o = new template('directory', 'de');
$o->assign('foo', 'bar')
  ->assign('xyz', 'abc')
  ->assign('price', PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate)
 // weitere assigns....
 
Mit dem Beispiel, verstehe ich so :
PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate)
Calculate ist eine Funktion in der Klasse PriceHelper und du übergibst die werte.
Und das Ergebnis soll dann ausgeben werden, ist doch richtig.
Müsste doch auch so funktionieren.

Habe es jetzt mal so gemacht:

PHP:
		public function assign($replace, $replacement)
		{
			$this->template = str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template);
			
			return $this->template;
		}
 
Zuletzt bearbeitet:
Das war nur ein Beispiel. Ich denke mal, das es bei dir keine Klasse PriceHelper mit einer statischen Methode Calculate gibt. Es ging mir nur um das assign(), was machen an ein assign() hängen kann.
 
Ich denke was dir Saftmeister sagen will ist folgendes:

Eine Assign-Methode welches ein internes Array befüllt mit der magischen Setter-Methode. Welches "Method-Chaning" beinhaltet, so das du das du mehrere "Assigns" in einem Aufwasch erledigen kannst.
Ich persönlich würde es auch so machen, das parsen des Templates und ersetzen mit den Variablen aus dem internen Array dann in der Display-Methode.
 
Ok, jetzt habe ich es verstanden :D

siehe hier:
PHP:
<?php
	error_reporting(E_ALL);
	
	class template {
	
		/*
			Variables that be use in that class
			and their content
		*/
		
		private $templateDIR = 'layout/templates/white/';
		private $languageDIR = 'lang/';
		private $templateName = '';
		private $templateFile = '';
		private $template = '';
		
		private $leftborderF = '{';
		private $rightborderF = '}';
		private $leftborderVAR = '{$';
		private $rightborderVAR = '$}';
		
		public function __construct($tpl_dir = '', $lang_dir = '')
		{
			if(!empty($tpl_dir))
				$this->setTemplateDIR($tpl_dir);
				
			if(!empty($lang_dir))
				$this->setLanguageDIR($lang_dir);	
		}
		
		public function setTemplateDIR($dir)
		{
			$this->templateDIR = $dir;
			return $this;
		}
		
		public function setLanguageDIR($dir)
		{
			$this->languageDIR = $dir;
			return $this;
		}
		
		public function setTemplateName($name)
		{
			$this->templateName = $name;
			return $this;
		}
		
		public function setTemplateFile($file)
		{
			$this->templateFile = $file;
			return $this;
		}
		
		public function setTemplate($template)
		{
			$this->template = $template;
			return $this;
		}
		
		public function load($file)
		{
			$this->setTemplateName($file);
			$this->setTemplateFile($this->templateDIR.$file);
			
	       if( !empty($this->templateFile) ) {
	            if( file_exists($this->templateFile) ) {
	                $this->setTemplate(file_get_contents($this->templateFile));
	            } else {
	                return false;
	            }
	        } else {
	           return false;
	        }
	        
	      $this->parseTemplate();
	        			
		}
		
		public function assign($replace, $replacement)
		{
			$this->setTemplate(str_replace($this->leftborderVAR.$replace.$this->rightborderVAR, $replacement, $this->template));
		}
		
	    private function parseTemplate() {
	        while( preg_match( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
	                           .$this->rightborderF ."/isUe", $this->template) )
	        {
	           $this->setTemplate(preg_replace( "/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
	                                            .$this->rightborderF."/isUe",
	                                            "file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
	                                            $this->template ));
	        }
	    }
		
	    public function display() {
	        echo $this->template;
	    }
		
	} 

?>

Ähm, eine andere Frage habe ich allerdings noch, und zwar habe ich ein kleines Problem.

PHP:
	$blog_obj= new blog($dbh);
	$data_blog = $blog_obj->getAll();

	foreach($data_blog as $value)
	{
		if($value->blog_published == 1)
			$world = "<a href='operation/no_published.php?blog_id=$value->blog_id' class='ask_published_yes'><img src='img/world.png' title='published' /></a>";
		else
			$world = "<a href='operation/published.php?blog_id=$value->blog_id' class='ask_published_no'><img src='img/world_delete.png' title='not published' /></a>";		
		
		$content_var .= "
			<table class='videos'>
				<tr>
					<td style='text-align:right;font-size:9px;'>".date("h:i a || l dS F Y", $value->blog_date)."</td>
				</tr>
			</table><br />
		";
	}

Folgender Codeabschnitt ist vorhanden, wo ich jetzt gerne Code von HTML trennen würde. Doch ich sehe jetzt nur die einzige Möglichkeit darin, dass ich jetzt die Tabelle in eine tpl Datei packe und diese immer wieder in der Schleife lade. Für das IF und ELSE muss ich das gleich dann auch noch mal machen.
Kann ich so was umgehen?
Also beim Daten ausgeben?
 
Zuletzt bearbeitet:
Zurück