TUTORIAL: Fully Functional Simple Template Engine (Cont'd)

  • Bogey
  • Genius
  • Genius
  • Bogey
  • Posts: 8398
  • Loc: USA

Post 3+ Months Ago

Introduction


This tutorial extends on the previous tutorial of the Fully Functional Simple Template Engine. There would be some functions edited and I would finally provide you with the caching capabilities here.

Before I start on this, let me confess... the caching class I'm about to unleash is not written by me... I found it somewhere here on OZZU and assumed it was ok for me to use... since it works just like I need it to, I didn't find any need to recode myself another one, even though I could (I promise... I really can :lol: )

This tutorial is not, by any means, the last tutorial based on this Fully Functional Simple Template Engine... when I make enough edits to the class to fill up a big page with edits and if it teaches you with something... then I'll post another one here... but it could be the last :lol:

Added


Let's start by adding some more functions here: The function is called include_file.
PHP Code: [ Select ]
<?php
function include_file($file)
{
 
}
?>
  1. <?php
  2. function include_file($file)
  3. {
  4.  
  5. }
  6. ?>

The reason for it being is that sometimes you want to put in a filename to be set to a variable, but you don't want to actually include the contents of it into the template... so I made a simple solution here... for every file that you DON'T want to include into the file, just add a '*' in front of it... the '*' is perfect because it isn't allowed in the filename to be set when you create a file and it lets us create this functionality :)
PHP Code: [ Select ]
<?php
function include_file($file)
{
    // Taking the first character from the filename
    $find = substr($file, 0, 1);
   
    // Checking if * exists in $filename
    if($find != '*')
    {
        return true;
    }
    return false;
}
?>
  1. <?php
  2. function include_file($file)
  3. {
  4.     // Taking the first character from the filename
  5.     $find = substr($file, 0, 1);
  6.    
  7.     // Checking if * exists in $filename
  8.     if($find != '*')
  9.     {
  10.         return true;
  11.     }
  12.     return false;
  13. }
  14. ?>
What this function does is check the very first character of the filename provided for '*'. If you don't like this method, you can substitute the function with the following.
PHP Code: [ Select ]
<?php
function include_file($file)
{
    // Checking if * exists in $filename
    if(strpos($file, '*') != false)
    {
        return true;
    }
    return false;
}
?>
  1. <?php
  2. function include_file($file)
  3. {
  4.     // Checking if * exists in $filename
  5.     if(strpos($file, '*') != false)
  6.     {
  7.         return true;
  8.     }
  9.     return false;
  10. }
  11. ?>
That way is using a smaller amount of code, but this time, you can put the asterisk '*' anywhere in the filename... it's not limited to being at the front.

The next function is what I named to be unclude_file. It generally does what the above function does, but it also removes the asterisk for sanitation.
PHP Code: [ Select ]
<?php
function unclude_file($file, $perform = false)
{
    // Checking if the file was passed as an un-includeable
    if($this->include_file($file) === false)
    {
        // Checking if we should actually remove the first character (It being the '*')
        if($perform == true)
        {
            // Counting the number of letters $file consists of
            $ltrs = strlen($file);
           
            // Returning the trimmed $file
            return substr($file, 1, $ltrs);
        }
        return true;
    }
    return false;
}
?>
  1. <?php
  2. function unclude_file($file, $perform = false)
  3. {
  4.     // Checking if the file was passed as an un-includeable
  5.     if($this->include_file($file) === false)
  6.     {
  7.         // Checking if we should actually remove the first character (It being the '*')
  8.         if($perform == true)
  9.         {
  10.             // Counting the number of letters $file consists of
  11.             $ltrs = strlen($file);
  12.            
  13.             // Returning the trimmed $file
  14.             return substr($file, 1, $ltrs);
  15.         }
  16.         return true;
  17.     }
  18.     return false;
  19. }
  20. ?>
I guess you could put all of this into one function if I really think about it, but I'll break it up into to... why? Because I'm too lazy to edit this tutorial to accommodate the change :roll: :lol:

Also, I add a variable to the whole class called include_files. It holds true if you want the files that are passed into the variable def. to be included into the template (As in their contents) or not included into the templates (Only the file names would be included... not the source).

PHP Code: [ Select ]
<?php
class tpl {
 
    // Various variables used throughout the class
    public $vari, $template, $page, [color=#0000FF]$vstart, $vend, $include_files;
 
}
?>
  1. <?php
  2. class tpl {
  3.  
  4.     // Various variables used throughout the class
  5.     public $vari, $template, $page, [color=#0000FF]$vstart, $vend, $include_files;
  6.  
  7. }
  8. ?>
The variables in blue is what I just put into there to make it more correct (?). I set them in the function start and use them in a few functions... in the class

Edited


Right, I said I edited some functions, so let's get on it :)

The first function I edited was the svariable to accommodate the include_file() function and the unclude_file() function. Here it is in it's full glory :D

PHP Code: [ Select ]
<?php
function svariable($return = false)
{
    // Converting set variables to the text defined in the parent PHP file
    foreach($this->vari as $key => $value)
    {
        // Checking if the value is a file and if it exists if it is a file
        if(is_file($value) && file_exists($value))
        {
            if($this->include_files === true  && ($this->include_file($value) === true))
            {
                // Getting the contents of the file
                $value = file_get_contents($value);
               
                // Replacing the KEY variable with the contents of the file
                $this->text = str_replace($this->vstart . $key . $this->vend, $value, $this->text);
            }
            else
            {
                // Replacing the KEY variable with the value
                $this->text = str_replace($this->vstart . $key . $this->vend, $value,$this->text);
            }
        }
        else
        {
            if($this->unclude_file($value) === true)
            {
                $value = $this->unclude_file($value, true);
            }
           
            // Replacing the KEY variable with the value
            $this->text = str_replace($this->vstart . $key . $this->vend, $value,$this->text);
        }
    }
   
    // Checking if we need to return the result
    if($return)
    {
        return $this->text;
    }
}
?>
  1. <?php
  2. function svariable($return = false)
  3. {
  4.     // Converting set variables to the text defined in the parent PHP file
  5.     foreach($this->vari as $key => $value)
  6.     {
  7.         // Checking if the value is a file and if it exists if it is a file
  8.         if(is_file($value) && file_exists($value))
  9.         {
  10.             if($this->include_files === true  && ($this->include_file($value) === true))
  11.             {
  12.                 // Getting the contents of the file
  13.                 $value = file_get_contents($value);
  14.                
  15.                 // Replacing the KEY variable with the contents of the file
  16.                 $this->text = str_replace($this->vstart . $key . $this->vend, $value, $this->text);
  17.             }
  18.             else
  19.             {
  20.                 // Replacing the KEY variable with the value
  21.                 $this->text = str_replace($this->vstart . $key . $this->vend, $value,$this->text);
  22.             }
  23.         }
  24.         else
  25.         {
  26.             if($this->unclude_file($value) === true)
  27.             {
  28.                 $value = $this->unclude_file($value, true);
  29.             }
  30.            
  31.             // Replacing the KEY variable with the value
  32.             $this->text = str_replace($this->vstart . $key . $this->vend, $value,$this->text);
  33.         }
  34.     }
  35.    
  36.     // Checking if we need to return the result
  37.     if($return)
  38.     {
  39.         return $this->text;
  40.     }
  41. }
  42. ?>
That is it for this one :)

The cache


Alright, since I took this class from someone on this forum, I'll just post the whole entire class here (Without coloring it red... I have to color every line separately... ).

What it does though, is creates a file with the variables NOT replaced... it includes all the files first and then caches it. The id (or the name it would be saved on) is the file name... so if you are using a template more then once on different PHP files... don't cache it :D Otherwise it will mess you up.
PHP Code: [ Select ]
<?php
class fcache {
    var $name = NULL; // private members only >= PHP 5
    var $value = array();
    var $ttl;
 
    function __construct($name, $ttl = 3600) { // Default $ttl is 3600 (60 minutes until expiry)
        $this->name = $name;
        $this->ttl = $ttl;
    }
 
    function check() {
        $cached = false;
        $file_name = './cache/' . $this->name . ".cache";
        if(file_exists($file_name))
        {
            $modified = filemtime($file_name);
            if(time() - $this->ttl < $modified)
            {
                $fp = fopen($file_name, "rt");
                if($fp)
                {
                    $temp_value = fread($fp, filesize($file_name));
                    fclose($fp);
                    $this->value = unserialize($temp_value);
                    $cached = true;
                }
            }
            else
            {
                $this->del_value($this->name);
                $this->set_value($this->name, $this->value);
                $this->save();
            }
        }
        return $cached;
    }
 
    function save() {
        $file_name = './cache/' . $this->name . ".cache";
        $fp = fopen($file_name, "wt");
        if($fp)
        {
            fwrite($fp, serialize($this->value));
            fclose($fp);
        }
    }
 
    function set_value($key, $value) {
        $this->value[$key] = $value;
    }
 
    function get_value($key) {
        if(isset($this->value[$key]))
        {
            return $this->value[$key];
        }
        else
        {
            return null;
        }
    }
 
    function del_value($key)
    {
        $file_name = './cache/' . $this->name . ".cache";
        if(file_exists($file_name))
        {
            unset($this->value[$key]);
            return unlink($file_name);
        }
        return false;
    }
}
?>
  1. <?php
  2. class fcache {
  3.     var $name = NULL; // private members only >= PHP 5
  4.     var $value = array();
  5.     var $ttl;
  6.  
  7.     function __construct($name, $ttl = 3600) { // Default $ttl is 3600 (60 minutes until expiry)
  8.         $this->name = $name;
  9.         $this->ttl = $ttl;
  10.     }
  11.  
  12.     function check() {
  13.         $cached = false;
  14.         $file_name = './cache/' . $this->name . ".cache";
  15.         if(file_exists($file_name))
  16.         {
  17.             $modified = filemtime($file_name);
  18.             if(time() - $this->ttl < $modified)
  19.             {
  20.                 $fp = fopen($file_name, "rt");
  21.                 if($fp)
  22.                 {
  23.                     $temp_value = fread($fp, filesize($file_name));
  24.                     fclose($fp);
  25.                     $this->value = unserialize($temp_value);
  26.                     $cached = true;
  27.                 }
  28.             }
  29.             else
  30.             {
  31.                 $this->del_value($this->name);
  32.                 $this->set_value($this->name, $this->value);
  33.                 $this->save();
  34.             }
  35.         }
  36.         return $cached;
  37.     }
  38.  
  39.     function save() {
  40.         $file_name = './cache/' . $this->name . ".cache";
  41.         $fp = fopen($file_name, "wt");
  42.         if($fp)
  43.         {
  44.             fwrite($fp, serialize($this->value));
  45.             fclose($fp);
  46.         }
  47.     }
  48.  
  49.     function set_value($key, $value) {
  50.         $this->value[$key] = $value;
  51.     }
  52.  
  53.     function get_value($key) {
  54.         if(isset($this->value[$key]))
  55.         {
  56.             return $this->value[$key];
  57.         }
  58.         else
  59.         {
  60.             return null;
  61.         }
  62.     }
  63.  
  64.     function del_value($key)
  65.     {
  66.         $file_name = './cache/' . $this->name . ".cache";
  67.         if(file_exists($file_name))
  68.         {
  69.             unset($this->value[$key]);
  70.             return unlink($file_name);
  71.         }
  72.         return false;
  73.     }
  74. }
  75. ?>

Now we have to put that into our gentemp.
PHP Code: [ Select ]
<?php
function gentemp($cache = false, $return = false)
{
    // Converting simple function variables to function
    $this->sfvariable();
 
    // Checking if the page needs to be cached... if so, cache it.
    if($cache)
    {
        // Setting the cache class object
        $cache = new fcache($this->page);
       
        // Checking if the cache is available for the current page
        if($cache->check())
        {
            // Retrieving the cached contents of the page
            $this->text = $cache->get_value($this->page);
        }
        else
        {
            // Setting the cache with the contents of the current page
            $cache->set_value($cache->name, $this->text);
           
            // Saving the cache
            $cache->save();
           
            // Retrieving the cached contents of the page
            $this->text = $cache->get_value($this->page);
        }
    }
 
    // Converting simple variables to variables
    $this->svariable();
   
    // Checking if we need to echo or return the page
    if($return)
    {
        // Returning the page
        return $this->text;
    }
    else
    {
        // Echoing the page
        echo $this->text;
    }
}
?>
  1. <?php
  2. function gentemp($cache = false, $return = false)
  3. {
  4.     // Converting simple function variables to function
  5.     $this->sfvariable();
  6.  
  7.     // Checking if the page needs to be cached... if so, cache it.
  8.     if($cache)
  9.     {
  10.         // Setting the cache class object
  11.         $cache = new fcache($this->page);
  12.        
  13.         // Checking if the cache is available for the current page
  14.         if($cache->check())
  15.         {
  16.             // Retrieving the cached contents of the page
  17.             $this->text = $cache->get_value($this->page);
  18.         }
  19.         else
  20.         {
  21.             // Setting the cache with the contents of the current page
  22.             $cache->set_value($cache->name, $this->text);
  23.            
  24.             // Saving the cache
  25.             $cache->save();
  26.            
  27.             // Retrieving the cached contents of the page
  28.             $this->text = $cache->get_value($this->page);
  29.         }
  30.     }
  31.  
  32.     // Converting simple variables to variables
  33.     $this->svariable();
  34.    
  35.     // Checking if we need to echo or return the page
  36.     if($return)
  37.     {
  38.         // Returning the page
  39.         return $this->text;
  40.     }
  41.     else
  42.     {
  43.         // Echoing the page
  44.         echo $this->text;
  45.     }
  46. }
  47. ?>


Example usage


Now, an example use of this whole thing would be on the first part of this tutorial (???) or below :P

process.php
PHP Code: [ Select ]
<?php
require('includes/globals.php');
 
$db->connect();
$db->last_sql = $db->build_query(array('*', 'forum_a'));
$result = $db->last_sql_data(false, 'SQL Results Data', true);
$db->close();
 
$tpl->template = 'default';
$tpl->page = 'index';
$tpl->start();
 
include('includes/global_vars.php');
 
$tpl->vari = array_merge($tpl->vari, array(
    'SQL_QUERY' => $result,
    'MEMBER_STUFF' => ((isset($_SESSION['uid'])) ? 'members.html' : 'non_members.html'),
    'USERNAME' => $username,
    'LAST_VISIT' => date(MM/DD/YYYY hh:mm:ss, $last_visit)
    'NOW_DATE' => date(MM/DD/YYYY hh:mm:ss)
));
 
$tpl->gentemp(true);
?>
  1. <?php
  2. require('includes/globals.php');
  3.  
  4. $db->connect();
  5. $db->last_sql = $db->build_query(array('*', 'forum_a'));
  6. $result = $db->last_sql_data(false, 'SQL Results Data', true);
  7. $db->close();
  8.  
  9. $tpl->template = 'default';
  10. $tpl->page = 'index';
  11. $tpl->start();
  12.  
  13. include('includes/global_vars.php');
  14.  
  15. $tpl->vari = array_merge($tpl->vari, array(
  16.     'SQL_QUERY' => $result,
  17.     'MEMBER_STUFF' => ((isset($_SESSION['uid'])) ? 'members.html' : 'non_members.html'),
  18.     'USERNAME' => $username,
  19.     'LAST_VISIT' => date(MM/DD/YYYY hh:mm:ss, $last_visit)
  20.     'NOW_DATE' => date(MM/DD/YYYY hh:mm:ss)
  21. ));
  22.  
  23. $tpl->gentemp(true);
  24. ?>

That true in the gentemp( in the piece of code above tells the code to cache it as well.

And the template file could look like
HTML Code: [ Select ]
<!-- INCLUDE header.html -->
<div id="content">
     <h6 id="header">Welcome {USERNAME} your last visit was {LAST_VISIT} from today ({NOW)DATE})</h6>
     <p>{MEMBER_STUFF}</p>
     <p>{SQL_QUERY}</p>
</div>
<!-- INCLUDE footer.html -->
  1. <!-- INCLUDE header.html -->
  2. <div id="content">
  3.      <h6 id="header">Welcome {USERNAME} your last visit was {LAST_VISIT} from today ({NOW)DATE})</h6>
  4.      <p>{MEMBER_STUFF}</p>
  5.      <p>{SQL_QUERY}</p>
  6. </div>
  7. <!-- INCLUDE footer.html -->

Hope that made sense :D

Conclusion


Well, this is it for now. Hope you enjoyed it and would find a good use for it :D

Attachments:
template.zip

(2.89 KiB) Downloaded 542 times

The Template Engine Source Code

  • Anonymous
  • Bot
  • No Avatar
  • Posts: ?
  • Loc: Ozzuland
  • Status: Online

Post 3+ Months Ago

  • Bogey
  • Genius
  • Genius
  • Bogey
  • Posts: 8398
  • Loc: USA

Post 3+ Months Ago

The usage tutorial has being Created. Check it out to find out the usability of the class. I hope I was descriptive in it... if I wasn't, feel free to reply to the usage tutorial with any questions you may have.
  • Bogey
  • Genius
  • Genius
  • Bogey
  • Posts: 8398
  • Loc: USA

Post 3+ Months Ago

An even simpler template class was created by Rabid Dog with a little less capabilities, and same functionality arrived at a different way.

Post Information

  • Total Posts in this topic: 3 posts
  • Moderator: Tutorial Writers
  • Users browsing this forum: No registered users and 1 guest
  • You cannot post new topics in this forum
  • You cannot reply to topics in this forum
  • You cannot edit your posts in this forum
  • You cannot delete your posts in this forum
  • You cannot post attachments in this forum
 
 

© 1998-2014. Ozzu® is a registered trademark of Unmelted, LLC.