[PHP]Custom tags ~ a custom system or Regex?

Status
Not open for further replies.

Adil

DevBest CEO
May 28, 2011
1,276
714
Hi. I have a question. How would I write a template engine so that %title% is parsed as $CONF['site']['title];?
I've been wondering on how to do this. One thought that popped to mind is using regex to find and replace the strings, but are there any other ways to do this?
 

brsy

nah mang
May 12, 2011
1,530
272
uberCMS has this done. Here it is:
PHP:
<?php
class uberTpl
{
    private $outputData;
    private $params = Array();
    private $includeFiles = Array();
   
    public function Init()
    {
        global $core, $users;
   
        $this->SetParam('', 'Holo');
        $this->SetParam('body_id', '');
        $this->SetParam('page_title', ' ');
        $this->SetParam('flash_build', 'flash_50_9');
        $this->SetParam('web_build', '63_1dc60c6d6ea6e089c6893ab4e0541ee0/486/');
        $this->SetParam('web_build_str', '50-BUILD66 - 06.05.2010 22:28 - Novic');
        $this->SetParam('req_path', WWW);
        $this->SetParam('www', WWW);
        $this->SetParam('hotel_status_fig', uberCore::GetSystemStatusString(true));
        $this->SetParam('hotel_status', uberCore::GetSystemStatusString(false));
        $this->SetParam('credits', '' . $users->GetUserVar(USER_ID, 'credits') . ''); 
 
        if (LOGGED_IN)
        {
            $this->SetParam('habboLoggedIn', 'true');
            $this->SetParam('habboName', USER_NAME);
            $this->SetParam('vipbalance', '<b>' . $users->GetUserVar(USER_ID, 'vip_points') . ' <img src="' . WWW . '/images/vipcoin.gif" style="vertical-align: middle;"></b>');
        }
        else
        {
            $this->SetParam('habboLoggedIn', 'false');
            $this->SetParam('habboName', 'null');
        }
    }
   
    public function AddGeneric($tplName)
    {
        $tpl = new Template($tplName);
        $this->outputData .= $tpl->GetHtml();
    }
   
    public function AddTemplate($tpl)
    {
        $this->outputData .= $tpl->GetHtml();
    }
   
    public function SetParam($param, $value)
    {
        $this->params[$param] = is_object($value) ? $value->fetch() : $value;
    }
   
    public function UnsetParam($param)
    {
        unset($this->params[$param]);
    }
   
    public function AddIncludeFile($incFile)
    {
        $this->includeFiles[] = $incFile;
    }
   
    public function WriteIncludeFiles()
    {
        foreach ($this->includeFiles as $f)
        {
            $this->Write($f->GetHtml() . LB);
        }
    }
   
    public function Write($str)
    {
        $this->outputData .= $str;
    }
   
    public function FilterParams($str)
    {
        foreach ($this->params as $param => $value)
        {
            $str = str_ireplace('%' . $param . '%', $value, $str);
        }
       
        return $str;
    }
   
    public function Output()
    {
        global $core;
   
        $this->Write(LB . LB . '<!-- uberCMS: Took ' . (microtime(true) - $core->execStart) . ' to output this page -->' . LB . LB);
       
        echo $this->FilterParams($this->outputData);
    }
}
 
class Template
{
    private $params = Array();
    private $tplName = '';
   
    public function Template($tplName)
    {
        $this->tplName = $tplName;
    }
   
    public function GetHtml()
    {
        global $users;
   
        extract($this->params);
   
        $file = CWD . 'inc/tpl/' . $this->tplName . '.tpl';
   
        if (!file_exists($file))
        {
            uberCore::SystemError('Template system error', 'Could not load template: ' . $this->tplName);
        }
       
        ob_start();
        include($file);
        $data = ob_get_contents();
        ob_end_clean();   
       
        return $this->FilterParams($data);
    }
   
    public function FilterParams($str)
    {
        foreach ($this->params as $param => $value)
        {
            if (is_object($value))
            {
                continue;
            }
       
            $str = str_ireplace('%' . $param . '%', $value, $str);
        }
       
        return $str;
    }
   
    public function SetParam($param, $value)
    {
        $this->params[$param] = $value;
    }
   
    public function UnsetParam($param)
    {
        unset($this->params[$param]);
    }       
}
 
class IncludeFile
{
    private $type;
    private $src;
    private $rel;
    private $name;
 
    public function IncludeFile($type, $src, $rel = '', $name = '')
    {
        global $tpl;
   
        $this->type = $type;
        $this->src = $src;
        $this->rel = $rel;
        $this->name = $name;
    }
   
    public function GetHtml()
    {
        switch ($this->type)
        {
            case 'application/rss+xml':
           
                return '<link rel="' . $this->rel . '" type="' . $this->type . '" title="' . $this->name . '" href="' . $this->src . '" />';
       
            case 'text/javascript':
           
                return '<script src="' . $this->src . '" type="text/javascript"></script>';
               
            case 'text/css':
            default:
           
                return '<link rel="' . $this->rel . '" href="' . $this->src . '" type="' . $this->type . '" />';
        }
    }
}
 
?>
 
Status
Not open for further replies.

Users who are viewing this thread

Top