Login   Register  
PHP Classes
elePHPant
Icontem

File: YaTemplate_class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  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: 2001-10-20 16:36
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*************************/
}
?>