Categories


Loading feed
Loading feed
Loading feed

Smarty: A closer look


Intended Audience
Overview
How it works
Extending Smarty with Wrapper Classes
Template Caching with Smarty
Securing Smarty
Template Configuration Files
Data Manipulation within Templates
Summary
About the Author

Intended Audience

This article is intended for PHP programmers and HTML designers wishing to utilize the more advanced features of the Smarty templating engine. A working knowledge of PHP, PHP's OOP structure, and HTML is assumed. This article also assumes the reader has read Cezar Floroiu's introductory article PHP Templating with Smarty and has a working Smarty setup.

Overview

At its most basic, Smarty allows programmers to unchain themselves from the design process, a long standing dream of many. However, Smarty also has many advanced features that you may have been missing out on.

This article will demonstrate some of the more complex features in Smarty such as security features, template caching, and extending Smarty with wrapper classes. This article will show HTML designers how to extend their templates with configuration files and built-in data manipulation functions.

How it works

Extending Smarty with Wrapper Classes

By default Smarty looks for templates in the directory in which it is called. Often this isn't feasible within your site's directory structure since, for security reasons, templates should not be placed in a web accessible directory. In order to change Smarty's default behavior you need to create a wrapper class (that is actually a child class of the Smarty class).

<?php

// Define our template directories
define('TEMPLATE_DIR','/usr/share/templates');
define('COMPILE_DIR','/usr/share/templates/templates_c');
define('CONFIG_DIR','/usr/share/templates/configs');
define('CACHE_DIR','/usr/share/templates/cache');

// Create a wrapper class extended from Smarty
class Page extends Smarty 
{
  
// $cache and $cache_lifetime are the two main variables
  // that control caching within Smarty
  
function Page($cache true$cache_lifetime 300)
  {
    
// Run Smarty's constructor
    
$this->Smarty();

    
// Change the default template directories
    
$this->template_dir TEMPLATE_DIR;
    
$this->compile_dir COMPILE_DIR;
    
$this->config_dir CONFIG_DIR;
    
$this->cache_dir CACHE_DIR;

    
// Change default caching behavior
    
$this->caching $cache;
    
$this->cache_lifetime $cache_lifetime;
  }
}

$page = new Page();
$page->assign('foo','bar');
$page->display('foo.tpl');

?>

Template Caching with Smarty

In the above code you'll notice Smarty::caching and Smarty::cache_lifetime are set with default values. Smarty does not enable caching by default, but by turning it on you increase the speed with which Smarty is able to process requests for templates.

By default our Page class sets the lifetime of our cache to 5 minutes. It is important to note this while doing development on your code. If you tweak the output or your designer makes changes to the template Smarty will not reflect those changes for 5 minutes unless you do one of two things: set Smarty::cache_lifetime to 0 or set Smarty::force_compile to TRUE. (Setting Smarty::force_compile to TRUE makes Smarty regenerate the template each time the script is called. The Smarty documentation says this should only be used for development and debugging and should not be used in a production environment.)

Securing Smarty

By default Smarty allows PHP code to be run within templates using {php}{/php} tags. This may, or may not, be a good idea. In my experience it is better to limit the control given to designers. Random PHP code inserted into your page could interfere with the desired effects of the application or even break the application altogether.

To disable the use of PHP within your Smarty templates, set Smarty::php_handling to SMARTY_PHP_REMOVE in your wrapper class constructor.

Enabling Smarty's security feature, which by default is set to FALSE, makes Smarty run in a sort of safe mode. This is desirable if you have untrusted parties editing the templates, such as those accessing the templates via FTP. To enable this feature set Smarty::security to TRUE in your wrapper class' constructor.

Template Configuration Files

Configuration files are a great way for template designers to set global variables, such as common colors, to be used across many templates.

# Sample configuration file
# Pound signs are used for comments
colorA #cccccc
colorB #eeeeee
title "My Homepage"

[Login]
title "Login to My Account"
titleColor #000000

In the above example you'll notice the top part does not include a section, this is because these are global variables. These variables will be loaded every time the configuration file is loaded. (In the event of a section's variable name conflicting with a global variable name, the section's variable is used.)

To use your newly created configuration file you will need to use the {config_load} function.

{config_load file="config.conf"}
<
html>
<
title>{#title#}</title>
<body bgcolor="{#colorA#}">
  
Your template stuff goes here.
</
body>
</
html>

You can alternatively load just a section of the configuration file by using the section parameter.

{config_load file="config.conf" section="Login"}
<
html>
<
title>{#title#}</title>
<body bgcolor="{#colorA#}">
  
Your template stuff goes here.
</
body>
</
html>

In the above example the {#title#} variable would output "Login to My Account" while {#colorA} would remain #cccccc.

Data Manipulation within Templates

Smarty includes a decent array of variable modifiers, including various string manipulations and date formatting. For a complete listing of the variable modifiers you will want to check out http://smarty.php.net/manual/en/language.modifiers.php. Developers might be interested in creating their own modifiers, and Smarty supports this. For more information on creating your own modifiers, filters, and plugins, check out http://smarty.php.net/manual/en/plugins.php.

Let's first take a look at date formatting. Many programmers store dates in nonreadable formats, such as UNIX timestamps. Smarty's built in date_format function accepts any time format parsable by PHP's strftime() function.

{$smarty.now|date_format:"%m-%d-%Y"}
{
$smarty.now|date_format:"%A %B, %e %Y"}

The above would output "02-10-2003" and "Monday February, 10 2003" respectively.

Other modifiers of note include upper, capitalize, and truncate. Upper is equivalent to PHP's strtoupper() function, capitalize is similar to PHP's ucwords(), while truncate simply takes the variable and limits it to a given number of characters.

Summary

Smarty has many advanced features that allow programmers to increase the efficiency of their applications. Smarty also has many complex template features to give designers more refined control over the formatting of the template data.

Maybe Smarty is the answer to the long running standoff between programmers wanting to keep control of their applications and designers needing refined control over the output of those applications.

About the Author

Joe Stump is currently in his last semester at Eastern Michigan University. He has worked on many large PHP driven sites and does freelance web development in his free time. He recently started a consulting company called Jerum (http://www.jerum.com), which takes up much of his free time. You can contact him directly at joe@joestump.net.

Comments