PHP Classes

File: YaTemplate_class.php

Recommend this page to a friend!
  Classes of Dmitry Levashov  >  YaTemplate  >  YaTemplate_class.php  >  Download  
File: YaTemplate_class.php
Role: ???
Content type: text/plain
Description: class file
Class: YaTemplate
Yet another template class
Author: By
Last change:
Date: 21 years ago
Size: 10,659 bytes
 

Contents

Class file image Download
<?php /***************************************************************** File: YaTemplate_class,php Autor: Dmitry Levashov <dima@syntech.ru> <dima@glagol.ru> License: GPL version: 1.01 Last Modified: 21.10.2001 Add: CleanBlock(), GetVar(), ParseBlock() Append2Var() Change: SetBlockTree() - only one parent and no limit for tree depth Parse() - minor optimize ******************************************************************/ class YaTemplate { //yet another template :) var $mDir = array(); //paths to templates var $mFile = array(); var $mVar = array(); //array of vars to parse var $mVal = array(); //array of values of vars var $mBlock = array(); //dinamic blocks var $mLd = "{{"; // left delimiter var $mRd = "}}"; // right delimiter var $_mLast = ""; //name of the last parsed template var $_mOnError = "halt"; //what to do on error - ""(nothing), "warn", "halt" var $_mUndef = "comment";//what to do whith undefined vars in template - "", "comment", "drop" /************************************* CONSTRUCTOR *************************************/ function YaTemplate($dir = "") { if (!empty($dir)) { $this->SetDir($dir); } else { $this->mDir[] = realpath("."); } } /************************************* PUBLIC *************************************/ function setDir($dir) { if (!is_array($dir)) { if (is_dir($dir)) { $this->mDir[] = realpath($dir); } else { $this->_Error("[setDir] $dir is not dir"); } } else { foreach ($dir as $v) { if (is_dir($v)) { $this->mDir[] = realpath($v); } else { $this->_Error("[setDir] $v is not directory"); } } } return; } /*--------------------------------------*/ function SetFile($tplFile, $trailer = "") { if (!is_array($tplFile)) { if (empty($trailer)) { $this->_Error("[setFile]: for $tplFile filename is empty"); } elseif ($fileName = $this->_SetFileName($trailer)) { $this->mFile[$tplFile] = $fileName; } else { $this->_Error("[setFile]: file $trailer does not exists"); } } else { foreach ($tplFile as $k=>$v) { if (empty($v)) { $this->_Error("[setFile]: for $k filename is empty"); return; } elseif ($fileName = $this->_SetFileName($v)) { $this->mFile[$k] = $fileName; } else { $this->_Error("[setFile]: file $v does not exists"); } } } return; } /*--------------------------------------*/ function SetVar($var, $trailer = "") { if (empty($var)) { $this->_Error("[setVar]: variable without name"); return; } if (!is_array($var)) // scalar context { $this->mVar[$var] = $this->mLd . $var . $this->mRd; $this->mVal[$var] = $trailer; } else { foreach ($var as $k=>$v) { if (!empty($k)) { $this->mVar[$k] = $this->mLd . $k . $this->mRd; $this->mVal[$k] = $v; } else { $this->_Error("[setVar]: variable without name"); } } } return; } /*--------------------------------------*/ function Append2Var($varName, $appendix) { if (empty($varName)) return false; if (isset($this->mVar[$varName])) { $this->mVal[$varName] .= $appendix; } else { $this->SetVar($varName, $appendix); } return true; } /*--------------------------------------*/ function SetBlock($parent, $block) { if (empty($parent)) { $this->_Error("[setBlock] : parent for block $block undefined"); return; } elseif (empty($block)) { $this->_Error("[setBlock] : block for $parent undefined"); return; } $this->mBlock[$block][parent] = $parent; $this->_CutBlock($block); return; } /*-----------------------------------------*/ function SetBlockTree($parent, $tree) { if (!is_array($tree)) { $this->SetBlock($parent, $tree); return; } foreach ($tree as $node=>$block) { if (!is_array($block)) //one block { if ("string" == gettype($node)) //crazy trick { $this->SetBlock($parent, $node); $this->SetBlock($node, $block); } else { $this->mBlock[$block][parent] = $parent; $this->_CutBlock($block); } } else //tree { $this->mBlock[$node][parent] = $parent; $this->_CutBlock($node); //cut block from parent $this->SetBlockTree($node, $block); //process new tree } } return; } /*--------------------------------------*/ function CleanVar($varName) { if (!is_array($varName)) { unset($this->mVar[$varName], $this->mVal[$varName]); } else { foreach ($varName as $var) unset($this->mVar[$var], $this->mVal[$var]); } return; } /*----------------------------------------*/ function CleanBlock($blockName) { if (!is_array($blockName)) { unset($this->mBlock[$blockName]); } else { foreach ($blockName as $block) unset ($this->mBlock[$block]); } return; } /*------------------------------------------*/ function GetVar($varName = "") { if (empty($varName)) $varName = $this->_mLast; return $this->mVal[$varName]; } /*--------------------------------------*/ function Parse($targetVar, $tmpl, $append = false) { if (!is_array($tmpl)) //scalar context { $str = $this->_ParseTmpl($tmpl); if ($append) $str = $this->mVal[$targetVar] . $str; $this->SetVar($targetVar, $str); } else // array context { foreach ($tmpl as $v) { $this->SetVar($targetVar, $this->mVal[$targetVar] . $this->_ParseTmpl($v)); } } $this->_mLast = $targetVar; return; } /*--------------------------------------*/ function ParseBlock($blockName) //alias for Parse() парсит блок в переменную с таким же именем { $this->Parse($blockName, $blockName, true); return; } /*--------------------------------------*/ function PrintOut($tmpl = "") { if (!$tmpl) { $tmpl = $this->_mLast; } if ($this->_mUndef) { $this->_ProccessUndef($tmpl); } if (!empty($this->_mLast)) { echo $this->mVal[$tmpl]; } else { echo "You forget to parse your templates :)"; } return; } /***************************************** PRIVATE *****************************************/ function _ProccessUndef($tmpl) { $reg = "/" . $this->mLd . "([a-zA-Z0-9_]+)" . $this->mRd . "/"; if ("comment" == $this->_mUndef) { $replace = "<!-- undefined variable \\1 -->"; } elseif ("drop" == $this->_mUndef) { $replace = ""; } $str = preg_replace($reg, $replace, $this->mVal[$tmpl]); $this->mVal[$tmpl] = $str; return; } /*--------------------------------------*/ function _SetFileName($file) { foreach ($this->mDir as $v) { $fileName = "$v/$file"; if (file_exists($fileName)) { return $fileName; } } return false; } /*--------------------------------------*/ function _LoadFile($tmpl){ $str = implode("", @file($this->mFile[$tmpl])); if (!empty($str)) { $this->SetVar($tmpl, $str); } else { $this->_Error("[_LoadFile]: file for $tmpl empty"); } return; } /*--------------------------------------*/ function _ParseTmpl($tmpl) { return str_replace($this->mVar, $this->mVal, $this->_GetTmpl($tmpl)); } /*--------------------------------------*/ function _GetTmpl($tmpl) { if (!isset($this->mVar[$tmpl]) || empty($this->mVal[$tmpl])) { if (isset($this->mFile[$tmpl])) { $this->_LoadFile($tmpl); } elseif (isset($this->mBlock[$tmpl])) { if (!$this->mBlock[$tmpl][content]) { $this->_CutBlock($tmpl); } } else { $this->_Error("[_getTmpl]: template $tmpl does not exists"); } } return ($this->mBlock[$tmpl] ? $this->mBlock[$tmpl][content] : $this->mVal[$tmpl]); } /*--------------------------------------*/ function _CutBlock($block) { $parentName = $this->mBlock[$block][parent]; $parent = $this->_GetTmpl($parentName); $reg = "/<!--\\s+BEGIN BLOCK $block\\s+-->(.*)\n\s*<!--\\s+END BLOCK $block\\s+-->/sm"; if (preg_match_all($reg, $parent, $m)) { $this->mBlock[$block][content] = $m[1][0]; $parentCont = preg_replace($reg, $this->mLd.$block.$this->mRd, $parent); if (isset($this->mBlock[$parentName])) { $this->mBlock[$parentName][content] = $parentCont; } else { $this->mVar[$parentName] = $this->mLd . $parentName . $this->mRd; $this->mVal[$parentName] = $parentCont; } } else { $this->_Error("[_catchBlock]: Can't find block $block in parent $parentName"); } return; } /*--------------------------------------*/ function _Error($mes) { if ("warn" == $this->_mOnError) { echo "<br>ERROR: $mes<br>" ; } if ("halt" == $this->_mOnError) { echo "<br>HALT ON ERROR: $mes<br>" ; exit(); } return; } /***********Fin*************************/ } ?>