I am trying to write a simple template parsing object and my code works great. The problem is any echo commands in the main page or erors should get buffered by ob_start. Trigger the error handling routing on destruct and die on line 52. However this does not run ever. any ideas?
<?php
define('ERROR_FOLDER', 'includes/error/');
define('HTML_FOLDER', 'includes/pages/');
class HTML{
/*
Takes a template file and replaces all instances of <!--VARNAME--> with the value inputed.
All values should be strings.
*/
private $template;
private $vars; //array of user defined variables
function __construct($filePath=''){
//stop writing anything to the page-html-output
ob_start();
//read contents of template
$this->template=file_get_contents(HTML_FOLDER.$filePath);
}
function __destruct() {
echo $this->execute();
}
function getCode() {
return $this->execute();
}
public function get($var) {
return $this->vars[$var];
}
public function set($var,$value) {
$this->vars[$var]=$value;
}
public function append($var,$value) {
$this->vars[$var].=$value;
}
/* ********************************************************************************************************
* Private Functions *
******************************************************************************************************** */
private function execute() {
//handel any errors
$errors=ob_get_contents();
if (strlen($errors>0)) {
echo $errors;die();
//create error file
//name: date_time_random_pageName
$fileName=DateTime::format("Y-m-d_H-i-s-u").'_'.rand(10000,99999).'_'.strtok($_SERVER["REQUEST_URI"],'?').'.txt';
$errorMessage='Error For: ' . $_SERVER[REQUEST_URI] . "\r\n" . $errors;
file_put_contents(ERROR_FOLDER.$fileName, $errorMessage);
}
//erase any error messages
ob_end_clean();
//get template
$html=$this->template;
//create search arrays
$from=array();
$to=array();
foreach ($this->vars as $key=>$value) {
$from[]='<!!--'.$key.'--!!>';
$to[]=$value;
}
//replace any vars added
$html=str_replace($from,$to,$html);
//minimize html text adapted from http://stackoverflow.com/questions/6225351/how-to-minify-php-page-html-output
$from = array(
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s)+/s', // shorten multiple whitespace sequences
'/<!--.*?-->|\t|(?:\r?\n[ \t]*)+/s', // removes comments
'/<!!--.*?--!!>|\t|(?:\r?\n[ \t]*)+/s' // removes unused vars
);
$to = array(
'>',
'<',
'\\1',
'',
''
);
$html = preg_replace($from, $to, $html);
return $html;
}
}
?>
here is a test script
<?php
require_once "includes/HTML.php";
$page=new HTML('template-main.html');
$page->set('list','Hello World');
echo "should get saved to file and never show up on screen.";
?>
template-main.html should have
<!!--list--!!>
What I expect to see is: should get saved to file and never show up on screen. since this should be stored in $errors after line 51 of object.
What I get is: Hello World