<?php

class BF_Template {
//
// BarelyFitz Template Class
// This is a simple class for implementing template files.
// The template files are PHP files, with access to all PHP functionality.
//
// Example usage:
// $t = new BF_Template();
// $t->set_var("firstname", "Patrick");
// $t->set_var("lastname", "Fitzgerald");
// $t->set_vars(array("addr1"=>"North Ave.", "state"=>"GA"));
// print $t->parse("templatefile.php");
//

  // Array to hold the variables used in the template files
  
var $data;

  
// Location of template files. This will be appended to the
  // front of the template filename, so be sure it ends in a slash.
  
var $basedir;

  
// Array of cached template files
  
var $cache;

  
//--------------------------------------------------
  
function BF_Template($basedir ""$data = array()) {
    
$this->basedir $basedir;
    
$this->data $data;
    
$this->cache = array();
  }

  
//--------------------------------------------------
  
function set_var($var$value) {
    
$this->data[$var] = $value;
  }
  function 
set_vars($data = array()) {
    
$this->data array_merge($this->data$data);
  }
  function 
clear_var($var) {
    unset(
$this->data[$var]);
  }
  function 
clear_vars() {
    
$this->data = array();
  }

  
//--------------------------------------------------
  
function parse($BF_Template_filename) {
  
// Retrieve the contents of a template file and parse it with PHP

    // If a basedir is defined,
    // append it to the front of the filename
    
if ($this->basedir) {
      
$BF_Template_filename $this->basedir $BF_Template_filename;
    }

    
// If the template file isn't already in the cache, fetch it
    
if (!isset($this->cache[$BF_Template_filename])) {

      
// Since we're going to eval() the template,
      // we'll turn off PHP processing at the beginning of the file,
      // then restore it after the file. This will make the eval()
      // be equivalent to include()'ing the file
      
$this->cache[$BF_Template_filename] =
        
"?" ">\n" .
        
implode("",file($BF_Template_filename)) .
        
"<" "?php\n" ;
    }

    
// Turn off errors and warnings
    //$this->e = error_reporting(E_ERROR | E_PARSE);

    // Turn on output buffering
    
ob_start();

    
// Create a local variable for each template variable
    
extract($this->data);

    
// Include and parse the template file
    
eval($this->cache[$BF_Template_filename]);

    
// Get the results of the included file
    
$string ob_get_contents();

    
// Stop output buffering and clear the buffer
    
ob_end_clean();

    
// Restore previous error reporting level
    // error_reporting($this->e);

    // Return the parsed template
    
return $string;
  }

  
//--------------------------------------------------
  
function noparse($filename) {
  
// Retrieve the contents of a template file but do not parse it with PHP.

    // If a basedir is defined,
    // append it to the front of the filename
    
if ($this->basedir) {
      
$filename $this->basedir $filename;
    }

    
// Get the file
    
$string implode('',file($filename));

    
// Return the parsed template
    
return $string;
  }
}

?>