template.class.php

<?php
class templateParser {
  /* @desc   In deze variabele wordt de hele file tijdelijk opgeslagen */
  public $code;
  /*  @desc   In deze variabele wordt alle data opgeslagen die te maken heeft met het vervangen van html
  Blocks:
  $_replacedata['block']['<naamvanblock>']['contentblock']; Hierin wordt opgeslagen wat tussen de [begin-block: <naamvanblock>] en [end-block: <naamvanblock>] staat.
  $_replacedata['block']['<naamvanblock>'][<oplopend nummer>]['var']; hierin wordt de data opgeslagen.
  Files:
  $_replacedata['include'][] = <naamvanbestand>; hierin wordt de naam van de bestanden opgeslagen.
  Vars:
  $_replacedata['var']['<varnaam>']; Hierin worden de vars opgeslagen
  */
  public $_replacedata;

  /**
  * @desc           Deze functie laad de template in.
  * @param string   De link naar de template.
  **/
  public function loadTemplate($tFile) {
    if(file_exists($tFile)) {
      $this->code = serialize(file_get_contents($tFile));    
    } else {
      echo 'Couldn\'t load the template file.';
    }
  }

  /*
  * @desc   Met deze functie kun je blocks toevoegen.
  * @param  string    De naam van het block
  * @param  array     De data die erin geplaatst moet worden
  * Structuur:
  * array(
  *   array('var' => 'waarde', 'anderevar' => 'waardes'),
  *   array('var' => 'iets', 'anderevar' => 'ook iets')
  *    );
  **/  
  public function assignBlock($blockname,$array_met_values) {
    $block_content = $this->getContentInBlock($blockname);
    $this->_replacedata['block'][$blockname] = $array_met_values;
    $this->_replacedata['block'][$blockname]['contentblock'] = $block_content;
  }
  
  /**
  * @desc   Met deze functie kun je één enkele replacement toevoegen
  * @param  string    De tekst in de content
  * @param  string    Waarmee het vervangen moet worden
  **/        
  public function assignVar($var,$value) {
    $this->_replacedata['var'][$var] = $value;
  }
  
  /**
  * @desc   Met deze functie kun je meerdere replacements toevoegen dmv een array mee te geven
  * @param  array   een array met vars
  * @param  array   een array met replacements
  **/        
  public function assignVars($vars,$replacements) {
    if(!is_array($vars) || !is_array($replacements)) {
      $this->assignVar($vars,$replacements);
    } else {
      for($i=0; $i < count($vars); $i++) {
        $this->_replacedata['var'][$vars[$i]] = $replacements[$i];
      }
    }
  }
  
  /**
  * @desc   Met deze functie kun je een include toevoegen
  * @param  string    het bestand dat je wilt includen
  **/      
  public function assignIncludeContent($filename) {
    if(file_exists($filename)) {
      $this->_replacedata['include'][] = $filename;
    }
  }
  
  /**
  * @desc   Met deze functie parse je de content
  * @param  boolean   moet de content gelijk worden ge-echod of niet
  * @return string    optioneel: de content teruggeven
  **/      
  public function parse($display = FALSE) {
    $code = unserialize($this->code);
    //de blocks verwerken
    if(is_array($this->_replacedata['block'])) {
      foreach($this->_replacedata['block'] as $blockname => $values) {
        $contentblock = $values['contentblock'];
        $block_output = '';
        for($i = 0; $i < (count($values) - 1);$i++) {
          $rij = $contentblock;
          foreach($values[$i] as $var => $replacement) {
            $rij = str_replace('{'.$var.'}',$replacement,$rij);
          }
          $block_output .= $rij;
        }
        $code = $this->replaceBlock($blockname,$block_output,$code);
      }
    }
    //de vars verwerken
    if(is_array($this->_replacedata['var'])) {
      foreach($this->_replacedata['var'] as $key => $value) {
        $code = str_replace('{'.$key.'}',$value,$code);
      }
    }
    if(is_array($this->_replacedata['include'])) {
      foreach($this->_replacedata['include'] as $file) {
        $contents_file = file_get_contents($file);
        $regex = "(\[file: ".$file."\])";
        $code = ereg_replace($regex,$contents_file,$code);
      }
    }
    if($display) {
      echo $code;
    } else {
      return $code;
    }
  }
  
  /**
  * @desc   Deze functie haalt de content tussen de [begin-block: ][end-block: ] vandaan
  * @param  string    Naam van het block
  * @return string    De content uit het block
  **/        
  public function getContentInBlock($blockname) {
    $regex = "(.*)(\[begin-block: ".$blockname."\])(.*)(\[end-block: ".$blockname."\])(.*)";
    return ereg_replace($regex,"\\3",unserialize($this->code));
  }
  
  /**
  * @desc Deze functie vervangt de het block door de content die erin moet
  * @param  string    de naam van het block
  * @param  string    de content die erin moet
  * @param  string    de hele content waarin het vervangen moet worden
  * @return string    de nieuwe content
  **/            
  public function replaceBlock($blockname,$output,$code) {
    $regex = "(\[begin-block: ".$blockname."\])(.*)(\[end-block: ".$blockname."\])";
    return ereg_replace($regex,$output,$code);
  }
  
  /**
  * @desc  Deze functie roept de __destruct functie aan
  **/  
  public function clearSettings() {
    $this->__destruct();
  }
  
  /**
  * @desc   Deze functie maakt de variabelen leeg
  **/    
  public function __destruct() {
    $this->_replacedata = '';
    $this->code = '';
  }

}
?>


template.tpl

<html>
  <head>
  <title>{titel}</title>
  </head>
  <body>
  <h1>{kop}</h1>
  <table>
    <tr>
      <td>ID:</td>
      <td>Naam:</td>
      <td>Email:</td>
    </tr>
  [begin-block: leden]
    <tr>
      <td>{id}</td>
      <td>{naam}</td>
      <td>{email}</td>
    </tr>
  [end-block: leden]
  </table><br />
  
  [file: footer.php]
  </body>
</html>


footer.php

Dit is de footer die op iedere pagina getoont wordt.


voorbeeld.php

<?php
include('tp.class.php');
$tp = new templateParser();
$tp->loadTemplate('template.tpl');
$array_data = array();
$array_data[] = array('id' => 1, 'naam' => 'jan', 'email' => 'jan@info.nl');
$array_data[] = array('id' => 2, 'naam' => 'karel', 'email' => 'geenemail@nomail.org');
$array_data[] = array('id' => 3, 'naam' => 'piet', 'email' => 'piet@onzin.nl');
$tp->assignBlock('leden',$array_data);
//$tp->assignVar('kop','Dit is de kop');
//$tp->assignVar('titel','Titel van de pagina');
//of:
$tp->assignVars(array('kop','titel'),array('Dit is de kop','Titel van de pagina'));
$tp->assignIncludeContent('footer.php');
$tp->parse(TRUE);
?>
