<?php 
/* 
 * This file is part of the Text_Template package. 
 * 
 * (c) Sebastian Bergmann <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
/** 
 * A simple template engine. 
 * 
 * @since Class available since Release 1.0.0 
 */ 
class Text_Template 
{ 
    /** 
     * @var string 
     */ 
    protected $template = ''; 
 
    /** 
     * @var string 
     */ 
    protected $openDelimiter = '{'; 
 
    /** 
     * @var string 
     */ 
    protected $closeDelimiter = '}'; 
 
    /** 
     * @var array 
     */ 
    protected $values = array(); 
 
    /** 
     * Constructor. 
     * 
     * @param  string                   $file 
     * @throws InvalidArgumentException 
     */ 
    public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}') 
    { 
        $this->setFile($file); 
        $this->openDelimiter  = $openDelimiter; 
        $this->closeDelimiter = $closeDelimiter; 
    } 
 
    /** 
     * Sets the template file. 
     * 
     * @param  string                   $file 
     * @throws InvalidArgumentException 
     */ 
    public function setFile($file) 
    { 
        $distFile = $file . '.dist'; 
 
        if (file_exists($file)) { 
            $this->template = file_get_contents($file); 
        } 
 
        else if (file_exists($distFile)) { 
            $this->template = file_get_contents($distFile); 
        } 
 
        else { 
            throw new InvalidArgumentException( 
              'Template file could not be loaded.' 
            ); 
        } 
    } 
 
    /** 
     * Sets one or more template variables. 
     * 
     * @param array $values 
     * @param bool  $merge 
     */ 
    public function setVar(array $values, $merge = TRUE) 
    { 
        if (!$merge || empty($this->values)) { 
            $this->values = $values; 
        } else { 
            $this->values = array_merge($this->values, $values); 
        } 
    } 
 
    /** 
     * Renders the template and returns the result. 
     * 
     * @return string 
     */ 
    public function render() 
    { 
        $keys = array(); 
 
        foreach ($this->values as $key => $value) { 
            $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; 
        } 
 
        return str_replace($keys, $this->values, $this->template); 
    } 
 
    /** 
     * Renders the template and writes the result to a file. 
     * 
     * @param string $target 
     */ 
    public function renderTo($target) 
    { 
        $fp = @fopen($target, 'wt'); 
 
        if ($fp) { 
            fwrite($fp, $this->render()); 
            fclose($fp); 
        } else { 
            $error = error_get_last(); 
 
            throw new RuntimeException( 
              sprintf( 
                'Could not write to %s: %s', 
                $target, 
                substr( 
                  $error['message'], 
                  strpos($error['message'], ':') + 2 
                ) 
              ) 
            ); 
        } 
    } 
} 
 
 
 |