Tutorials

Template Parser

Een tutorial over het maken van een Template Parser

Pagina 1

Inleiding

Wat is een Template Parser?

Een template parser is een, script wat voorgemaakt ‘html bestanden’ inleest en vervolgens de content erin duwt. Of tenminste, dat is de basis ervan. Voorbeeld: {titel} wordt bijvoorbeeld: pagina naam

Verschillende soorten parsers

Er zijn al diverse parsers gemaakt. Zoals Template Power
Yapter
Smarty

je denkt natuurlijk: waarom moet ik er dan een maken, er zijn er toch genoeg, daar heb ik een simpel antwoordt op: Het is leuk.

Pagina 2

Bestand Verkrijgen en Lezen.

We beginnen met een class. Dit is om alles goed bij elkaar te houden. Ook is dit sneller. We maken een class die TemplateParser heet. Dat doen we zo:

<?php
class TemplateParser {
}
?>


als je niet veel van een class snapt kun je hier even kijken. dit is een tutorial van Sebastiaan.

We gaan eerst een constructor aan maken, hieraan krijgen we alvast informatie.. Boven de constructor's komen nog een aantal vars te staan. de code ziet er nu zo uit:

<?php
class TemplateParser {
 	var $file = 'start.tpl'; //Het standaard bestand, deze gebruikt hij als er geen bestand wordt opgegeven
 	var $errors = ''; //Hier komen de errors in
                var $getfile = false; //Komt nog...
                var $tpl = ''; //Komt nog...
                var $blockcontent = array(); //Komt nog...



	public function __construct($file = false) {
	 if($file != "" && $file != false) { //Kijken of $file niet leeg is.
	  if(!preg_match("#(.+?).tpl#si", $file)) { //Kijken of het bestand de exentie .tpl heeft
		$this->errors .= "<b>TemplateParser Error:</b> Het bestand moet de exentie .tpl hebben!<br />";
		}
		if(!file_exists($file)) { //Kijken of het bestand bestaat
		$this->errors .= "<b>TemplateParser Error:</b> het bestand ".$file." bestaat niet!<br />";
		}
	
		$this->file = $file;
		
	
		
	}
}
}
?>


de code spreekt voor zichzelf. in de code wordt de bestandsnaam verkegen.

natuurlijk moeten we het bestand ook nog kunnen lezen. hiervoor maken we de functie getfile aan. de code daarvan ziet er zo uit:

<?php
public function getfile() {
		if(file_exists($this->file)) { //Kijken of bestand bestaat
			$this->tpl = file_get_contents($this->file); //Inhoud verkrijgen
			$this->getfile = true; //Bestand is opgehaald
		}
}
?>


inplaats van file_get_contents kan ook nog fopen gebruikt worden.

De hele code ziet er nu zo uit:


<?php
class TemplateParser {
 	var $file = 'start.tpl'; //Het standaard bestand, deze gebruikt hij als er geen bestand wordt opgegeven
 	var $errors = ''; //Hier komen de errors in
                var $getfile = false; //Komt nog...
                var $tpl = ''; //Komt nog...
                var $blockcontent = array(); //Komt nog...



	public function __construct($file = false) {
	 if($file != "" && $file != false) { //Kijken of $file niet leeg is.
	  if(!preg_match("#(.+?).tpl#si", $file)) { //Kijken of het bestand de exentie .tpl heeft
		$this->errors .= "<b>TemplateParser Error:</b> Het bestand moet de exentie .tpl hebben!<br />";
		}
		if(!file_exists($file)) { //Kijken of het bestand bestaat
		$this->errors .= "<b>TemplateParser Error:</b> het bestand ".$file." bestaat niet!<br />";
		}
	
		$this->file = $file;
		
	
		
	}
}
public function getfile() {
		if(file_exists($this->file)) { //Kijken of bestand bestaat
			$this->tpl = file_get_contents($this->file); //Inhoud verkrijgen
			$this->getfile = true; //Bestand is opgehaald
		}
}
}
?>
Pagina 3

Bestand aanpassen en parsen.

We moeten natuurlijk, het bestand kunnen aanpassen. dit gaan we doen door middel van preg_replace. we gaan de functie set maken, waarmee we {iets} kunnen veranderen in bijvoorbeeld Hallo. dit gaat door middel van de volgende code:

<?php
	public function set($pattern, $replacement) {
	    if($this->getfile == false) { //Kijken of het bestand al gelezen is.
		$this->getfile(); //Zo niet, bestand inlezen.
	    }
		$this->tpl = preg_replace("#\{".$pattern."\}#si", $replacement, $this->tpl); //{iets} wordt veranderd in iets.
	}
?>


dit is een simpele code, deze spreekt voor zich. als je niks van preg_replace snapt, kun je kijken op PHP.net: preg_replace.

natuurlijk moeten we ook het bestand nog parsen. dus de inhoud echo'en. Dit gaan we doen door middel van de volgende code:

<?php
	public function parse() {
	  if($this->errors == '') { //Kijken of de errors leeg zijn
	   if($this->getfile == false) { //Als het bestand nog niet gelezen is, laten lezen.
		$this->getfile();
	    }
                return $this->tpl; //De inhoud returnen
		}else{
			return $this->errors; //Als er errors zijn, deze returnen.
		}
	}
?>


de hele code is nu als volgt:


<?php
class TemplateParser {
     var $file = 'start.tpl'; //Het standaard bestand, deze gebruikt hij als er geen bestand wordt opgegeven
     var $errors = ''; //Hier komen de errors in
                var $getfile = false; //Komt nog...
                var $tpl = ''; //Komt nog...
                var $blockcontent = array(); //Komt nog...



    public function __construct($file = false) {
     if($file != "" && $file != false) { //Kijken of $file niet leeg is.
      if(!preg_match("#(.+?).tpl#si", $file)) { //Kijken of het bestand de exentie .tpl heeft
        $this->errors .= "<b>TemplateParser Error:</b> Het bestand moet de exentie .tpl hebben!<br />";
        }
        if(!file_exists($file)) { //Kijken of het bestand bestaat
        $this->errors .= "<b>TemplateParser Error:</b> het bestand ".$file." bestaat niet!<br />";
        }
    
        $this->file = $file;
        
    
        
    }
}
public function getfile() {
        if(file_exists($this->file)) { //Kijken of bestand bestaat
            $this->tpl = file_get_contents($this->file); //Inhoud verkrijgen
            $this->getfile = true; //Bestand is opgehaald
        }
}
	public function set($pattern, $replacement) {
	    if($this->getfile == false) { //Kijken of het bestand al gelezen is.
		$this->getfile(); //Zo niet, bestand inlezen.
	    }
		$this->tpl = preg_replace("#\{".$pattern."\}#si", $replacement, $this->tpl); //{iets} wordt veranderd in iets.
	}
public function parse() {
	  if($this->errors == '') { //Kijken of de errors leeg zijn
	   if($this->getfile == false) { //Als het bestand nog niet gelezen is, laten lezen.
		$this->getfile();
	    }
                return $this->tpl; //De inhoud returnen
		}else{
			return $this->errors; //Als er errors zijn, deze returnen.
		}
	}

}
?> 


we kunnen de code nu al gebruiken. dat doen we door een bestand: index.tpl aan te maken. met de volgende inhoud:

{titel}<br />
{tekst}<br />


we parsen dit bestand met de volgende code:


<?php
require("naam_van_bestand_waar_de_class_in_staat.php");
$template = new TemplateParser("index.tpl"); //Bestand index.tpl verkrijgen
$template->set("titel", "Titel van de pagina"); //titel veranderen
$template->set("tekst", "Tekst van de pagina"); //tekst veranderen
echo $template->parse();
?>


de volgende pagina is niet belangrijk, maar wel handig. het gaat om een block functie
Pagina 4

De Block Functie

Het is ook handig om een block functie te hebben. zo hoef je niet voor elke nieuwe content een bestand te veranderen.

de block functie ziet er als volgt uit:

<?php
	public function newBlock($blockname, $content) {
		$this->blockcontent[$blockname] .= $this->getBlock($blockname); //Block inhoud ophalen
		
		foreach($content as $pattern=>$replacement){                        
$this->blockcontent[$blockname] = preg_replace("#\{".$pattern."\}#si", $replacement, $this->blockcontent[$blockname]);  //Inhoud in block veranden            
		}
		
		
	}
?>


je zeit dat we gebruimaken van de functie getBlock. want, we moeten de inhoud van het bestaan nog ophalen. de functie getBlock ziet er als volgt uit:

<?php
	public function getBlock($blockname) {
	$regex = "#\[start-block ".$blockname."\](.+?)\[end-block ".$blockname."\]#s";
    preg_match($regex, $this->tpl, $matches); //Inhoud verkrijgen
	return $matches[1]; //Inhoud returnen
}
?>


als je dit toe zal voegen werkt het niet. we moeten de blockinhoud nog toevoegen aan de pagina. dit moeten we doen in de functie parse. hier komt nu wat bij:

<?php
 foreach($this->blockcontent as $blockname=>$block) {
			$regex = "#\[start-block ".$blockname."\](.+?)\[end-block ".$blockname."\]#s";
			$this->tpl = preg_replace($regex, $block, $this->tpl); //De inhoud aan de pagina toevoegen.
		}
?>


de hele code ziet er als volgt uit:

<?php
class TemplateParser {
     var $file = 'start.tpl'; //Het standaard bestand, deze gebruikt hij als er geen bestand wordt opgegeven
     var $errors = ''; //Hier komen de errors in
                var $getfile = false; //Komt nog...
                var $tpl = ''; //Komt nog...
                var $blockcontent = array(); //Komt nog...



    public function __construct($file = false) {
     if($file != "" && $file != false) { //Kijken of $file niet leeg is.
      if(!preg_match("#(.+?).tpl#si", $file)) { //Kijken of het bestand de exentie .tpl heeft
        $this->errors .= "<b>TemplateParser Error:</b> Het bestand moet de exentie .tpl hebben!<br />";
        }
        if(!file_exists($file)) { //Kijken of het bestand bestaat
        $this->errors .= "<b>TemplateParser Error:</b> het bestand ".$file." bestaat niet!<br />";
        }
    
        $this->file = $file;
        
    
        
    }
}
public function getfile() {
        if(file_exists($this->file)) { //Kijken of bestand bestaat
            $this->tpl = file_get_contents($this->file); //Inhoud verkrijgen
            $this->getfile = true; //Bestand is opgehaald
        }
}
     public function getBlock($blockname) {
	$regex = "#\[start-block ".$blockname."\](.+?)\[end-block ".$blockname."\]#s";
    preg_match($regex, $this->tpl, $matches); //Inhoud verkrijgen
	return $matches[1]; //Inhoud returnen
}
	public function newBlock($blockname, $content) {
		$this->blockcontent[$blockname] .= $this->getBlock($blockname); //Block inhoud ophalen
		
		foreach($content as $pattern=>$replacement){                        
$this->blockcontent[$blockname] = preg_replace("#\{".$pattern."\}#si", $replacement, $this->blockcontent[$blockname]);  //Inhoud in block veranden            
		}
		
		
	}
    public function set($pattern, $replacement) {
        if($this->getfile == false) { //Kijken of het bestand al gelezen is.
        $this->getfile(); //Zo niet, bestand inlezen.
        }
        $this->tpl = preg_replace("#\{".$pattern."\}#si", $replacement, $this->tpl); //{iets} wordt veranderd in iets.
    }
public function parse() {
      if($this->errors == '') { //Kijken of de errors leeg zijn
       if($this->getfile == false) { //Als het bestand nog niet gelezen is, laten lezen.
        $this->getfile();
        } 
                  foreach($this->blockcontent as $blockname=>$block) {
			$regex = "#\[start-block ".$blockname."\](.+?)\[end-block ".$blockname."\]#s";
			$this->tpl = preg_replace($regex, $block, $this->tpl); //De inhoud aan de pagina toevoegen.
		}
                return $this->tpl; //De inhoud returnen
        }else{
            return $this->errors; //Als er errors zijn, deze returnen.
        }
    }

}
?> 



we kunnen het gebruik van de block al gebruiken.
in index.tpl zetten we:

{titel}<br />
{tekst}<br /> 
[start-block test]
{blockname} {blockid}<br />
[end-block test]

dan parsen we hem als volgt:

<?php
require("naam_van_bestand_waar_de_class_in_staat.php");
$template = new TemplateParser("index.tpl"); //Bestand index.tpl verkrijgen
$template->set("titel", "Titel van de pagina"); //titel veranderen
$template->set("tekst", "Tekst van de pagina"); //tekst veranderen
$template->newBlock("test", array('blockname'=>'Block', 'blockid'=>'1'));  
//Zal opleveren: Block 1
$template->newBlock("test", array('blockname'=>'Block', 'blockid'=>'2'));
//Zal oplevereb: Block 2
echo $template->parse();
?>

Reacties

0
Nog geen reacties.