mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-04 08:10:55 +02:00
2532 lines
80 KiB
Plaintext
2532 lines
80 KiB
Plaintext
<!dOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
|
|
<book>
|
|
<bookinfo>
|
|
<title>Smarty - the compiling PHP template engine</title>
|
|
<author>
|
|
<firstname>Monte</firstname><surname>Ohrt</surname>
|
|
<affiliation>
|
|
<address><email>monte@ispi.net</email></address>
|
|
</affiliation>
|
|
</author>
|
|
<author>
|
|
<firstname>Andrei</firstname><surname>Zmievski</surname>
|
|
<affiliation>
|
|
<address><email>andrei@ispi.net</email></address>
|
|
</affiliation>
|
|
</author>
|
|
<edition>Version 1.2.3</edition>
|
|
<copyright><year>2001</year><holder>ispi of Lincoln, Inc.</holder></copyright>
|
|
</bookinfo>
|
|
<chapter>
|
|
<title>Overview</title>
|
|
<para>
|
|
It is undoubtedly one of the most asked questions on the PHP mailing
|
|
lists: how do I make my PHP scripts independent of the layout? While
|
|
PHP is billed as "HTML embedded scripting language", after writing a
|
|
couple of projects that mixed PHP and HTML freely one comes up with the
|
|
idea that separation of form and content is a Good Thing [TM]. In
|
|
addition, in many companies the roles of layout designer and programmer
|
|
are separate. Consequently, the search for a templating solution
|
|
ensues.
|
|
</para>
|
|
<para>
|
|
In our company for example, the development of an application goes on
|
|
as follows: After the requirements docs are done, the interface
|
|
designer makes mockups of the interface and gives them to the
|
|
programmer. The programmer implements business logic in PHP and uses
|
|
interface mockups to create skeleton templates. The project is then
|
|
handed off to the HTML designer/web page layout person who brings the
|
|
templates up to their full glory. The project may go back and forth
|
|
between programming/HTML a couple of times. Thus, it's important to
|
|
have good template support because programmers don't want anything to
|
|
do with HTML and don't want HTML designers mucking around with PHP
|
|
code. Designers need support for config files, dynamic blocks and other
|
|
stuff, but they don't want to have to deal with intricacies of the PHP
|
|
programming language.
|
|
</para>
|
|
<para>
|
|
Looking at many templating solutions available for PHP today, most of
|
|
them provide a rudimentary way of substituting variables into templates
|
|
and do a limited form of dynamic block functionality. But our needs
|
|
required a bit more than that. We didn't want programmers to be dealing
|
|
with HTML layout at ALL, but this was almost inevitable. For instance,
|
|
if a designer wanted background colors to alternate on dynamic blocks,
|
|
this had to be worked out with the programmer in advance. We also
|
|
needed designers to be able to use their own configuration files, and
|
|
pull variables from them into the templates. The list goes on.
|
|
</para>
|
|
<para>
|
|
We started out writing out a spec for a template engine about a year
|
|
ago. After finishing the spec, we began to work on a template engine
|
|
written in C that would hopefully be accepted for inclusion with PHP.
|
|
Not only did we run into many complicated technical barriers, but there
|
|
was also much heated debate about exactly what a template engine should
|
|
and should not do. From this experience, we decided that the template
|
|
engine should be written in PHP as a class, for anyone to use as they
|
|
see fit. So we wrote an engine that did just that and
|
|
<emphasis>SmartTemplate</emphasis> came into existence (note: this
|
|
class was never submitted to the public). It was a class that did
|
|
almost everything we wanted: regular variable substitution, supported
|
|
including other templates, integration with config files, embedding PHP
|
|
code, limited 'if' statement functionality and much more robust dynamic
|
|
blocks which could be multiply nested. It did all this with regular
|
|
expressions and the code turned out to be rather, shall we say,
|
|
impenetrable. It was also noticably slow in large applications from all
|
|
the parsing and regular expression work it had to do on each
|
|
invocation. The biggest problem from a programmer's point of view was
|
|
all the necessary work in the PHP script to setup and process templates
|
|
and dynamic blocks. How do we make this easier?
|
|
</para>
|
|
<para>
|
|
Then came the vision of what ultimately became Smarty. We know how fast
|
|
PHP code is without the overhead of template parsing. We also know how
|
|
meticulous and overbearing the PHP language may look to the average
|
|
designer, and this could be masked with a much simpler templating
|
|
syntax. So what if we combined the two strengths? Thus, Smarty was
|
|
born...
|
|
</para>
|
|
<sect1><title>What is Smarty?</title>
|
|
<para>
|
|
Smarty is a template engine for PHP. One of the unique aspects about
|
|
Smarty that sets it apart from other templating solutions is that it
|
|
compiles the templates into native PHP scripts upon the first
|
|
invocation. After that, it merely executes the compiled PHP scripts.
|
|
Therefore, there is no costly template file parsing for each request.
|
|
</para>
|
|
<para>
|
|
Some of Smarty's features:
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem><para>It is extremely fast.</para></listitem>
|
|
<listitem><para>It is efficient since the PHP parser does the
|
|
dirty work.</para></listitem>
|
|
<listitem><para>No template parsing overhead, only compiles once.</para></listitem>
|
|
<listitem><para>It is smart about recompiling only the template
|
|
files that have changed.</para></listitem>
|
|
<listitem><para>You can make <link linkend="custom.functions">custom
|
|
functions</link> and custom <link linkend="variable.modifiers">variable
|
|
modifiers</link>, so the template language is extremely extensible.</para></listitem>
|
|
<listitem><para>Configurable template delimiter tag syntax, so you can use
|
|
{}, {{}}, <!--{}-->, or whatever you like.</para></listitem>
|
|
<listitem><para>The if/elseif/else/endif constructs are passed to the
|
|
PHP parser, so the if expression syntax can be as simple or as complex
|
|
as you like.</para></listitem>
|
|
<listitem><para>Unlimited nesting of sections, ifs, etc. allowed.</para></listitem>
|
|
<listitem><para>It is possible to embed PHP code right in your template files,
|
|
although this may not be needed (nor recommended)
|
|
since the engine is so customizable.</para></listitem>
|
|
<listitem><para>Built-in caching support (new in 1.3.0)</para></listitem>
|
|
</itemizedlist>
|
|
</sect1>
|
|
<sect1>
|
|
<title>How Smarty works</title>
|
|
<sect2><title>Compiling</title>
|
|
<para>
|
|
Smarty compiles the templates into native PHP code on-the-fly. The actual
|
|
PHP scripts that are generated are created implicitly, so theoretically you
|
|
should never have to worry about touching these files, or even know of their
|
|
existence. The exception to this is debugging Smarty template syntax errors,
|
|
discussed later in this document.
|
|
</para>
|
|
</sect2>
|
|
<sect2><title>Caching</title>
|
|
<para>
|
|
Smarty can cache the output of your generated templates. By default
|
|
this is disabled. If you enable caching, Smarty will store a copy
|
|
of the generated template output, and use this until the copy
|
|
expires, regenerating a new one. If your templates generate the
|
|
same content over and over, using the cache will result in huge
|
|
performance gains. The default cache expire time is one hour, and
|
|
can be configured from the class. The exception to the rule is the
|
|
<link linkend="function.insert">insert</link> tag. Anything
|
|
generated by the insert tag is not cached, but run dynamically on
|
|
every invocation, even within cached content.
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter>
|
|
<title>Installation</title>
|
|
<sect1>
|
|
<title>Requirements</title>
|
|
<para>
|
|
Smarty requires PHP 4.0.4pl1 or later. See the
|
|
<link linkend="bugs">BUGS</link> section for caveats.
|
|
</para>
|
|
</sect1>
|
|
<sect1>
|
|
<title>Installing Smarty</title>
|
|
<para>
|
|
Installing Smarty is fairly straightforward, there is just one thing
|
|
you must be aware of. Remember that Smarty creates compiled versions of
|
|
the template code. This usually means allowing user "nobody" (or
|
|
whomever the web server runs as) to have permission to write the files.
|
|
Each installation of a Smarty application minimally needs a templates
|
|
directory and a compiled templates directory. If you use configuration
|
|
files you will also need a directory for those. By default these are
|
|
named "templates", and "templates_c" and "configs" respectively. If you
|
|
plan on using caching, you will need to create a "cache" directory, also
|
|
with permission to write files.
|
|
</para>
|
|
<para>
|
|
Copy the Smarty.class.php, Smarty.addons.php and Config_File.class.php
|
|
scripts to a directory that is in your PHP include_path. NOTE: PHP will
|
|
try to create a directory alongside the executing script called
|
|
"templates_c". Be sure that directory permissions allow this to happen.
|
|
You will see PHP error messages if this fails. You can also create the
|
|
directory yourself before hand, and change the file ownership
|
|
accordingly. See below.
|
|
</para>
|
|
<example>
|
|
<title>Example of installing Smarty</title>
|
|
<programlisting>
|
|
|
|
# be sure you are in the web server document tree
|
|
# this assumes your web server runs as user "nobody"
|
|
# and you are in a un*x environment
|
|
gtar -zxvf Smarty-1.0.tar.gz
|
|
mkdir templates_c
|
|
chown nobody:nobody templates_c
|
|
chmod 700 templates_c
|
|
mkdir cache
|
|
chown nobody:nobody cache
|
|
chmod 700 cache
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Next, try running the index.php script from your web browser.
|
|
</para>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter>
|
|
<title>Setting up Smarty</title>
|
|
<para>
|
|
There are several variables that are at the top of the Smarty.class.php
|
|
file. You can usually get away with leaving these at their default
|
|
settings. This is a list of them and what each one does.
|
|
</para>
|
|
<sect1>
|
|
<title>Configuration variables</title>
|
|
<para></para>
|
|
<sect2>
|
|
<title>$compile_check</title>
|
|
<para>
|
|
Upon each invocation of the PHP application, Smarty recursively
|
|
traverses the template directory and its subdirectories and
|
|
searches for templates that have changed (later time stamp)
|
|
since the last time they were compiled. For each one that has
|
|
changed, it recompiles that template. By default this variable
|
|
is set to true. Once an application is put into production and
|
|
it is initially compiled, the compile_check step is no longer
|
|
needed. Be sure to set $compile_check to "false" to improve
|
|
performance! Note that if you change this to "false" and a
|
|
template file is changed, you will *not* see the change since
|
|
the template will not get recompiled. See <link
|
|
linkend="setting.force.compile">$force_compile</link>
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="setting.force.compile">
|
|
<title>$force_compile</title>
|
|
<para>
|
|
This forces Smarty to compile all templates on every
|
|
invocation. This setting overrides $compile_check. By default
|
|
this is disabled. This is handy for development and debugging.
|
|
It should never be used in a production environment.
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="setting.caching">
|
|
<title>$caching</title>
|
|
<para>
|
|
This tells Smarty whether or not to cache the output of the
|
|
templates. By default this is set to false. If your templates
|
|
generate the same content over and over, it is advisable to
|
|
turn on caching. This will result significant performance
|
|
gains. Smarty uses a combination of the template being called
|
|
and the URL ($PHP_SELF) for the cache indentification. This way
|
|
you can have multiple caches for the same template. NOTE: If
|
|
you ever turn caching off after templates are compiled, be sure
|
|
to recompile all of your templates once. Otherwise you may get
|
|
undesireable results. This was added to Smarty 1.3.0.
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="setting.cache.lifetime">
|
|
<title>$cache_lifetime</title>
|
|
<para>
|
|
This is the length of time in seconds that a template cache is
|
|
valid. Once this time has expired, the cache will be
|
|
regenerated. $caching must be set to "true" for this setting to
|
|
work. You can also force the cache to expire with <link
|
|
linkend="api.clear.all.cache">clear_all_cache</link>. This was
|
|
added to Smarty 1.3.0.
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="template.dir">
|
|
<title>$template_dir</title>
|
|
<para>
|
|
This is the name of the directory where template files are located.
|
|
By default this is "./templates".
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$compile_dir</title>
|
|
<para>
|
|
This is the name of the directory where compiled templates are
|
|
located. By default this is "./templates_c". This was
|
|
added to Smarty version 1.2.1.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$cache_dir</title>
|
|
<para>
|
|
This is the name of the directory where template caches are
|
|
located. By default this is "./cache". This was
|
|
added to Smarty version 1.3.0.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$compile_dir_ext</title>
|
|
<para>
|
|
This is the extension used for the name of the directory where
|
|
compiled templates are located. By default this is "_c".
|
|
Therefore if your template directory is named "templates", then
|
|
the compiled templates directory will be named "templates_c".
|
|
NOTE: this was removed from Smarty version 1.2.1.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$tpl_file_ext</title>
|
|
<para>
|
|
This is the extention used for template files. By default this
|
|
is ".tpl". All other files in the template directory are
|
|
ignored.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$allow_php</title>
|
|
<para>
|
|
Whether or not to allow PHP code in the templates. If set to
|
|
false, PHP code is escaped and not interpreted. Embedding PHP
|
|
code into templates is highly discouraged. Use <link
|
|
linkend="custom.functions">custom functions</link> or <link
|
|
linkend="variable.modifiers">modifiers</link> instead. Default
|
|
is "false".
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$left_delimiter</title>
|
|
<para>
|
|
This is the left delimiter used by the template language. Default is "{".
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$right_delimiter</title>
|
|
<para>
|
|
This is the right delimiter used by the template language. Default is "}".
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$config_dir</title>
|
|
<para>
|
|
This is the directory used to store config files used in the templates.
|
|
Default is "configs".
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$custom_funcs</title>
|
|
<para>
|
|
This is a mapping of the names of <link
|
|
linkend="custom.functions">custom functions</link> in the template to
|
|
the names of functions in PHP. These are usually kept in Smarty.addons.php.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$custom_mods</title>
|
|
<para>
|
|
This is a mapping of the names of variable
|
|
<link linkend="variable.modifiers">modifiers</link> in the template to
|
|
the names of functions in PHP. These are usually kept in Smarty.addons.php.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>$global_assign</title>
|
|
<para>
|
|
This is a list of variables that are always implicitly assigned to the
|
|
template engine. This is usually handy for making global variables or server
|
|
variables available to the template without having to manually assign them to
|
|
the template every time.
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter>
|
|
<title>Smarty API</title>
|
|
<para>
|
|
These functions are used in the PHP portion of your application.
|
|
</para>
|
|
<sect1>
|
|
<title>Smarty API Functions</title>
|
|
<sect2>
|
|
<title>assign</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>assign</function></funcdef>
|
|
<paramdef>mixed <parameter>var</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>assign</function></funcdef>
|
|
<paramdef>string <parameter>varname</parameter></paramdef>
|
|
<paramdef>mixed <parameter>var</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This is used to assign values to the templates. This is usually
|
|
data gathered from database queries or other sources of data.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>append</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>append</function></funcdef>
|
|
<paramdef>mixed <parameter>var</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>append</function></funcdef>
|
|
<paramdef>string <parameter>varname</parameter></paramdef>
|
|
<paramdef>mixed <parameter>var</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This is used to append data to existing variables in the template.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>clear_assign</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>clear_assign</function></funcdef>
|
|
<paramdef>string <parameter>var</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This clears the value of an assigned variable.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>clear_all_assign</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>clear_all_assign</function></funcdef>
|
|
<paramdef><parameter></parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This clears the values of all assigned variables.
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="api.clear.all.cache">
|
|
<title>clear_all_cache</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>clear_all_cache</function></funcdef>
|
|
<paramdef><parameter></parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This clears the entire template cache. This was added to Smarty
|
|
1.3.0.
|
|
</para>
|
|
</sect2>
|
|
<sect2 id="api.is.cached">
|
|
<title>is_cached</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>is_cached</function></funcdef>
|
|
<paramdef>string<parameter>template</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This returns true if there is a valid cache for this template.
|
|
Use this to skip process-intensive tasks that aren't necessary
|
|
when a cached version of the template is available. This was
|
|
added to Smarty 1.3.0.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>get_template_vars</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>array <function>get_template_vars</function></funcdef>
|
|
<paramdef><parameter></parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This gets an array of the currently assigned template vars.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>display</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>void <function>display</function></funcdef>
|
|
<paramdef>string <parameter>template</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This displays the template. Supply a path relative to the
|
|
<link linkend="template.dir">template directory</link>
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>fetch</title>
|
|
<funcsynopsis>
|
|
<funcprototype>
|
|
<funcdef>string <function>fetch</function></funcdef>
|
|
<paramdef>string <parameter>template</parameter></paramdef>
|
|
</funcprototype>
|
|
</funcsynopsis>
|
|
<para>
|
|
This returns the template output. Supply a path relative to the
|
|
<link linkend="template.dir">template directory</link>
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Using Smarty API</title>
|
|
<example>
|
|
<title>Example use of Smarty API</title>
|
|
<programlisting>
|
|
|
|
include("Smarty.class.php");
|
|
$smarty = new Smarty;
|
|
|
|
|
|
// only do db calls if cache doesn't exist
|
|
if(!$smarty->is_cached("index.tpl"))
|
|
{
|
|
|
|
// dummy up some data
|
|
$address = "245 N 50th";
|
|
$db_data = array(
|
|
"City" => "Lincoln",
|
|
"State" => "Nebraska",
|
|
"Zip" = > "68502"
|
|
);
|
|
|
|
$smarty->assign("Name","Fred");
|
|
$smarty->assign("Address",$address);
|
|
$smarty->assign($db_data);
|
|
|
|
}
|
|
|
|
// display the output
|
|
$smarty->display("index.tpl");
|
|
|
|
// alternatively capture the output
|
|
// $output = $smarty->fetch("index.tpl");
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter>
|
|
<title>Smarty Templates</title>
|
|
<para>
|
|
The templates are the heart of Smarty. These are the files that the designers
|
|
work with. They're basically pages made up of static content interspersed with
|
|
template markup tags. These tags are placeholders for variables or blocks of logic.
|
|
</para>
|
|
<sect1>
|
|
<title>Syntax</title>
|
|
<para>
|
|
For these examples, we will assume that you are using the default
|
|
template tag delimiters, which are "{" and "}". In Smarty, all content
|
|
outside of delimiter tags is displayed as static content, or unchanged.
|
|
When Smarty encounters template tags {}, it attempts to interpret what is
|
|
between the tags, and displays the appropriate output in place of them.
|
|
</para>
|
|
<sect2>
|
|
<title>Variables</title>
|
|
<para>
|
|
There are three basic types of variables in Smarty, each with their
|
|
own unique syntax.
|
|
</para>
|
|
<sect3>
|
|
<title>Variables assigned from PHP</title>
|
|
<para>
|
|
Variables that are assigned from PHP are displayed by preceeding
|
|
them with a dollar sign ($) and enclosing the variable in delimiters
|
|
like so: {$varname}
|
|
</para>
|
|
<example>
|
|
|
|
<title>displaying assigned variables</title>
|
|
<programlisting>
|
|
|
|
Hello {$firstname}, glad to see you could make it.
|
|
<p>
|
|
Your last login was on {$lastLoginDate}.
|
|
|
|
OUTPUT:
|
|
|
|
Hello Doug, glad to see you could make it.
|
|
<p>
|
|
Your last login was on January 11th, 2001.
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
|
|
<sect3>
|
|
<title>Associative arrays</title>
|
|
<para>
|
|
You can also print variables that are assigned as associative
|
|
arrays from PHP by supplying the key value with the array name.
|
|
</para>
|
|
<example>
|
|
<title>displaying assigned associative array variables</title>
|
|
<programlisting>
|
|
|
|
{$Contacts.fax}<br>
|
|
{$Contacts.email}<br>
|
|
{* you can print arrays of arrays as well *}
|
|
{$Contacts.phone.home}<br>
|
|
{$Contacts.phone.cell}<br>
|
|
|
|
OUTPUT:
|
|
|
|
555-222-9876<br>
|
|
zaphod@slartibartfast.com<br>
|
|
555-444-3333<br>
|
|
555-111-1234<br>
|
|
|
|
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
|
|
|
|
<sect3>
|
|
<title>Variables passed from config files</title>
|
|
<para>
|
|
Variables that are passed in from config files are displayed by enclosing
|
|
them with hash marks (#) and enclosing the variable in delimiters
|
|
like so: {#varname#}
|
|
</para>
|
|
<example>
|
|
|
|
|
|
<title>displaying config variables</title>
|
|
<programlisting>
|
|
|
|
<html>
|
|
<title>{#pageTitle#}</title>
|
|
<body bgcolor="{#bodyBgColor#}">
|
|
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
|
<tr bgcolor="{#rowBgColor#}">
|
|
<td>First</td>
|
|
<td>Last</td>
|
|
<td>Address</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Config file variables cannot be displayed until
|
|
after they are loaded in from a config file. This procedure is
|
|
explained later in this document under
|
|
<link linkend="builtin.functions.configload">config_load</link>.
|
|
</para>
|
|
</sect3>
|
|
<sect3>
|
|
<title>Variables internal to template</title>
|
|
<para>
|
|
Variables that are internal to the templates are displayed by enclosing
|
|
them with percent signs (%) and enclosing the variable in delimiters
|
|
like so: {%varname%} So far, section properties are the only internal
|
|
variables used in Smarty, which can be found later in this document under
|
|
<link linkend="builtin.functions.section">section</link>.
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Functions</title>
|
|
<para>
|
|
Functions are processed and displayed by enclosing the function and its
|
|
attributes into delimiters like so: {funcname attr1="val" attr2="val"}
|
|
</para>
|
|
<example>
|
|
<title>function syntax</title>
|
|
<programlisting>
|
|
|
|
{config_load file="colors.conf"}
|
|
|
|
{include file="header.tpl"}
|
|
|
|
{if $name eq "Fred"}
|
|
You are not allowed here
|
|
{else}
|
|
Welcome, <font color="{#fontColor#}">{$name}!</font>
|
|
{/if}
|
|
|
|
{include file="footer.tpl"}
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Both built-in functions and custom functions have the same syntax
|
|
in the templates. Built-in functions are the inner workings of
|
|
Smarty, such as {if}, {section} and {strip}. They cannot be
|
|
modified. Custom functions are located in the Smarty.addons.class
|
|
file. They can be modified to your liking, or add new ones.
|
|
{html_options} and {html_select_date} are examples of custom
|
|
functions.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Attributes</title>
|
|
<para>
|
|
Attributes to functions are much like HTML attributes. Static
|
|
values don't have to be enclosed in quotes, but it is recommended
|
|
for literal strings. If not quoted, you may use a syntax that Smarty may confuse
|
|
with another function, such as a boolean value. Variables may
|
|
also be used, and should not be in quotes.
|
|
</para>
|
|
<example>
|
|
<title>function attribute syntax</title>
|
|
<programlisting>
|
|
|
|
{include file="header.tpl"}
|
|
|
|
{include file=$includeFile}
|
|
|
|
{include file=#includeFile#}
|
|
|
|
<SELECT name=company>
|
|
{html_options values=$vals selected=$selected output=$output}
|
|
</SELECT>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Comments</title>
|
|
<para>
|
|
Template comments are surrounded by asterisks, and that is surrounded
|
|
by the delimiter tags like so: {* this is a comment *}
|
|
Smarty comments are not displayed in the final output of the template.
|
|
They are used mainly for making the templates more understandable.
|
|
</para>
|
|
<example>
|
|
<title>Comments</title>
|
|
<programlisting>
|
|
|
|
{* Smarty *}
|
|
|
|
{* include the header file here *}
|
|
{include file="header.tpl"}
|
|
|
|
{include file=$includeFile}
|
|
|
|
{include file=#includeFile#}
|
|
|
|
{* display dropdown lists *}
|
|
<SELECT name=company>
|
|
{html_options values=$vals selected=$selected output=$output}
|
|
</SELECT>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="configfiles">
|
|
<title>Config Files</title>
|
|
<para>
|
|
Config files are handy for designers to manage global
|
|
template variables from one file. One example is template colors.
|
|
Normally if you wanted to change the color scheme of an application,
|
|
you would have to go through each and every template file
|
|
and change the colors. With a config file, the colors can
|
|
be kept in one place, and only one file needs to be updated.
|
|
Note that to use config files, you must include the Config_File.class.php
|
|
In your PHP include path. Config_File.class.php comes bundled with
|
|
Smarty. Smarty will implicitly include the file if you
|
|
don't already include it in your application.
|
|
</para>
|
|
<example>
|
|
<title>Example of config file syntax</title>
|
|
<programlisting>
|
|
|
|
# global variables
|
|
pageTitle = "Main Menu"
|
|
bodyBgColor = #000000
|
|
tableBgColor = #000000
|
|
rowBgColor = #00ff00
|
|
|
|
[Customer]
|
|
pageTitle = "Customer Info"
|
|
|
|
[Login]
|
|
pageTitle = "Login"
|
|
focus = "username"
|
|
Intro = """This is a value that spans more
|
|
than one line. you must enclose
|
|
it in triple quotes."""
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Values of config file variables can be in quotes, but not necessary.
|
|
You can use either single or double quotes. If you have a value that
|
|
spans more than one line, enclose the entire value with triple quotes
|
|
("""). You can put comments into config files by any syntax that is
|
|
not a valid config file syntax. We recommend using a hashmark (#) at the
|
|
beginning of the line.
|
|
</para>
|
|
<para>
|
|
This config file example has two sections. Section names are enclosed
|
|
in brackets []. The four variables at the top are global
|
|
variables, or variables not within a section. These variables are
|
|
always loaded from the config file.
|
|
If a particular section is loaded, then the global variables and the
|
|
variables from that section are loaded. If a variable exists both as
|
|
a global and in a section, the section variable is used. If you name two
|
|
variables the same within a section, the last one will be used.
|
|
</para>
|
|
<para>
|
|
Config files are loaded into templates with the built-in function
|
|
called <link linkend="builtin.functions.configload">config_load</link>.
|
|
</para>
|
|
</sect1>
|
|
<sect1 id="builtin.functions">
|
|
<title>Built-in Functions</title>
|
|
<para>
|
|
Smarty comes with several built-in functions. Built-in functions
|
|
are integral to the template language. You cannot create custom
|
|
functions with the same names, nor can you modify built-in functions.
|
|
</para>
|
|
<sect2 id="builtin.functions.configload">
|
|
<title>config_load</title>
|
|
<para>
|
|
This function is used for loading in variables from a
|
|
configuration file into the template. You must have the Config_file.class.php
|
|
file somewhere in your PHP include path for config_load to work properly.
|
|
See <link linkend="configfiles">Config Files</link> for more info.
|
|
</para>
|
|
<example>
|
|
<title>function config_load</title>
|
|
<programlisting>
|
|
|
|
{config_load file="colors.conf"}
|
|
|
|
<html>
|
|
<title>{#pageTitle#}</title>
|
|
<body bgcolor="{#bodyBgColor#}">
|
|
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
|
<tr bgcolor="{#rowBgColor#}">
|
|
<td>First</td>
|
|
<td>Last</td>
|
|
<td>Address</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Config files may also contain sections. You can load
|
|
variables from within a section with the added attribute
|
|
"section".
|
|
</para>
|
|
<example>
|
|
<title>function config_load with section</title>
|
|
<programlisting>
|
|
|
|
{config_load file="colors.conf" section="Customer"}
|
|
|
|
<html>
|
|
<title>{#pageTitle#}</title>
|
|
<body bgcolor="{#bodyBgColor#}">
|
|
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
|
<tr bgcolor="{#rowBgColor#}">
|
|
<td>First</td>
|
|
<td>Last</td>
|
|
<td>Address</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>include</title>
|
|
<para>
|
|
Include tags are used for including other templates into
|
|
the current template. When a template is included, it
|
|
inherits all the variables available to the current template.
|
|
The include tag must have the attribute "file", which
|
|
contains the path to the included template file relative
|
|
to the template directory.
|
|
</para>
|
|
<example>
|
|
<title>function include</title>
|
|
<programlisting>
|
|
|
|
{include file="header.tpl"}
|
|
|
|
{* body of template goes here *}
|
|
|
|
{include file="footer.tpl"}
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
You can also pass variables to included templates as attributes.
|
|
These will be passed to the template along with the current
|
|
template variables. Attribute variables override template
|
|
variables, in the case they are named alike. You can
|
|
pass either static values or variables to included templates
|
|
(although it doesn't make much sense to pass anything other than
|
|
static values since variables are inherited anyways).
|
|
</para>
|
|
<example>
|
|
<title>function include passing variables</title>
|
|
<programlisting>
|
|
|
|
{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"}
|
|
|
|
{* body of template goes here *}
|
|
|
|
{include file="footer.tpl" logo="http://my.domain.com/logo.gif"}
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2 id="function.insert">
|
|
<title>insert</title>
|
|
<para>
|
|
The insert tag in Smarty serves a special purpose. You may
|
|
run into the situation where it is impossible to pass data to a template
|
|
before the template is executed because there is info in the template
|
|
needed to aquire the data, kind of a catch 22. The insert tag is a way
|
|
to callback a function in PHP during runtime of the template.
|
|
</para>
|
|
<para>
|
|
Let's say you have a template with a banner slot at the top of the page. The
|
|
banner can contain any mixture of HTML, images, flash, etc. so we can't just
|
|
use a static link here. In comes the insert tag: the template
|
|
knows #banner_location_id# and #site_id# values (gathered from a config file),
|
|
and needs to call a function to get the banner's contents.
|
|
</para>
|
|
<example>
|
|
<title>function insert</title>
|
|
<programlisting>
|
|
|
|
{* example of fetching a banner *}
|
|
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
|
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
In this example, we are using the name "getBanner" and passing the
|
|
parameters #banner_location_id# and #site_id#. Smarty will look
|
|
for a function named insert_getBanner() in your PHP application, passing
|
|
the values of #banner_location_id# and #site_id# as the first argument
|
|
in an associative array. All insert function names in
|
|
your application must be prepended with "insert_" to remedy possible
|
|
function name-space conflicts. Your insert_getBanner() function should
|
|
do something with the passed values and return the results. These results
|
|
are then displayed in the template in place of the insert tag.
|
|
In this example, Smarty would call this function:
|
|
insert_getBanner(array("banner_id" => "12345","page_id" => "67890"));
|
|
and display the returned results in place of the insert tag.
|
|
</para>
|
|
<para>
|
|
A note on caching: If you have <link
|
|
linkend="setting.caching">caching</link> turned on, insert tags
|
|
will not be cached. They will run dynamically every time the page
|
|
is created, even within cached pages. This works good for things
|
|
like banners, polls, live weather, search results, user feedback
|
|
areas, etc.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>if,elseif,else</title>
|
|
<para>
|
|
if statements in Smarty have much the same flexibility as php if
|
|
statements, with a few added features for the template engine.
|
|
Every <emphasis>if</emphasis> must be paired with an
|
|
<emphasis>/if</emphasis>. <emphasis>else</emphasis> and
|
|
<emphasis>elseif</emphasis> are also permitted. "eq", "ne","neq",
|
|
"gt", "lt", "lte", "le", "gte" "ge","is even","is odd", "is not
|
|
even","is not odd","not","mod","div by","even by","odd
|
|
by","==","!=",">", "<","<=",">=" are all valid conditional
|
|
qualifiers.
|
|
</para>
|
|
<example>
|
|
<title>if statements</title>
|
|
<programlisting>
|
|
|
|
{if $name eq "Fred"}
|
|
Welcome Sir.
|
|
{elseif $name eq "Wilma"}
|
|
Welcome Ma'am.
|
|
{else}
|
|
Welcome, whatever you are.
|
|
{/if}
|
|
|
|
{* an example with "or" logic *}
|
|
{if $name eq "Fred" or $name eq "Wilma"}
|
|
...
|
|
{/if}
|
|
|
|
{* same as above *}
|
|
{if $name == "Fred" || $name == "Wilma"}
|
|
...
|
|
{/if}
|
|
|
|
|
|
{* parenthesis are allowed *}
|
|
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
|
...
|
|
{/if}
|
|
|
|
{* you can also imbed php function calls *}
|
|
{if count($var) gt 0}
|
|
...
|
|
{/if}
|
|
|
|
{* test if values are even or odd *}
|
|
{if $var is even}
|
|
...
|
|
{/if}
|
|
{if $var is odd}
|
|
...
|
|
{/if}
|
|
{if $var is not odd}
|
|
...
|
|
{/if}
|
|
|
|
{* test if var is divisible by 4 *}
|
|
{if $var is div by 4}
|
|
...
|
|
{/if}
|
|
|
|
{* test if var is even, grouped by two. i.e.,
|
|
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc. *}
|
|
{if $var is even by 2}
|
|
...
|
|
{/if}
|
|
|
|
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
|
|
{if $var is even by 3}
|
|
...
|
|
{/if}
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>ldelim,rdelim</title>
|
|
<para>
|
|
ldelim and rdelim are used for displaying the literal delimiter, in
|
|
our case "{" or "}". The template engine always tries to interpret
|
|
delimiters, so this is the way around that.
|
|
</para>
|
|
<example>
|
|
<title>ldelim, rdelim</title>
|
|
<programlisting>
|
|
|
|
{* this will print literal delimiters out of the template *}
|
|
|
|
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
|
|
|
|
|
OUTPUT:
|
|
|
|
{funcname} is how functions look in Smarty!
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>literal</title>
|
|
<para>
|
|
Literal tags allow a block of data to be taken literally,
|
|
not being interpreted by the Smarty engine. This is handy
|
|
for things like javascript sections, where there maybe
|
|
curly braces and such things that would confuse the template
|
|
parser. Anything within {literal}{/literal} tags is not
|
|
interpreted, but displayed as-is.
|
|
</para>
|
|
<example>
|
|
<title>literal tags</title>
|
|
<programlisting>
|
|
|
|
{literal}
|
|
<script language=javascript>
|
|
|
|
<!--
|
|
function isblank(field) {
|
|
if (field.value == '')
|
|
{ return false; }
|
|
else
|
|
{
|
|
document.loginform.submit();
|
|
return true;
|
|
}
|
|
}
|
|
// -->
|
|
|
|
</script>
|
|
{/literal}
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2 id="builtin.functions.section">
|
|
<title>section,sectionelse</title>
|
|
<para>
|
|
Template sections are used for looping over arrays of data.
|
|
All section tags must be paired with /section tags.
|
|
Required parameters are "name" and "loop". The name of the
|
|
section can be anything you like, made up of letters, numbers
|
|
and underscores. Sections can be nested, and the nested
|
|
section names must be unique from each other. The loop variable
|
|
determines the number of times the section will loop.
|
|
When printing a variable within a section, the section name
|
|
must be prepended to the variable name, separated by a slash (/).
|
|
sectionelse is executed when there are no values in the loop
|
|
variable.
|
|
</para>
|
|
<example>
|
|
<title>section</title>
|
|
<programlisting>
|
|
|
|
|
|
{* this example will print out all the values of the $custid array *}
|
|
{section name=customer loop=$custid}
|
|
id: {$customer/custid}<br>
|
|
{/section}
|
|
|
|
OUTPUT:
|
|
|
|
id: 1000<br>
|
|
id: 1001<br>
|
|
id: 1002<br>
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>section loop variable</title>
|
|
<programlisting>
|
|
|
|
{* the loop variable only determines the number of times to loop.
|
|
you can access any variable from the template within the section.
|
|
This example assumes that $custid, $name and $address are all
|
|
arrays containing the same number of values *}
|
|
{section name=customer loop=$custid}
|
|
id: {$customer/custid}<br>
|
|
name: {$customer/name}<br>
|
|
address: {$customer/address}<br>
|
|
<p>
|
|
{/section}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
id: 1000<br>
|
|
name: John Smith<br>
|
|
address: 253 N 45th
|
|
<p>
|
|
id: 1001<br>
|
|
name: Jack Jones<br>
|
|
address: 417 Mulberry ln
|
|
<p>
|
|
id: 1002<br>
|
|
name: Jane Munson
|
|
address: 5605 apple st
|
|
<p>
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>section names</title>
|
|
<programlisting>
|
|
|
|
{* the name of the section can be anything you like,
|
|
and it is used to reference the data within the section *}
|
|
{section name=mydata loop=$custid}
|
|
id: {$mydata/custid}<br>
|
|
name: {$mydata/name}<br>
|
|
address: {$mydata/address}<br>
|
|
<p>
|
|
{/section}
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>nested sections</title>
|
|
<programlisting>
|
|
|
|
{* sections can be nested as deep as you like. With nested sections,
|
|
you can access complex data structures, such as multi-dimensional
|
|
arrays. In this example, $customer/contact_type is an array of
|
|
contact types for the current customer. *}
|
|
{section name=customer loop=$custid}
|
|
id: {$customer/custid}<br>
|
|
name: {$customer/name}<br>
|
|
address: {$customer/address}<br>
|
|
{section name=contact loop=$customer/contact_type}
|
|
{$customer/contact/contact_type}: {$customer/contact/contact_info}<br>
|
|
{/section}
|
|
<p>
|
|
{/section}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
id: 1000<br>
|
|
name: John Smith<br>
|
|
address: 253 N 45th
|
|
home phone: 555-555-5555
|
|
cell phone: 555-555-5555
|
|
e-mail: john@mydomain.com
|
|
<p>
|
|
id: 1001<br>
|
|
name: Jack Jones<br>
|
|
address: 417 Mulberry ln
|
|
home phone: 555-555-5555
|
|
cell phone: 555-555-5555
|
|
e-mail: jack@mydomain.com
|
|
<p>
|
|
id: 1002<br>
|
|
name: Jane Munson
|
|
address: 5605 apple st
|
|
home phone: 555-555-5555
|
|
cell phone: 555-555-5555
|
|
e-mail: jane@mydomain.com
|
|
<p>
|
|
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>sections and associative arrays</title>
|
|
<programlisting>
|
|
|
|
{* This is an example of printing an associative array
|
|
of data within a section *}
|
|
{section name=customer loop=$contacts}
|
|
name: {$customer/contacts.name}<br>
|
|
home: {$customer/contacts.home}<br>
|
|
cell: {$customer/contacts.cell}<br>
|
|
e-mail: {$customer/contacts.email}<p>
|
|
{/section}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
name: John Smith<br>
|
|
home: 555-555-5555<br>
|
|
cell: 555-555-5555<br>
|
|
e-mail: john@mydomain.com<p>
|
|
name: Jack Jones<br>
|
|
home phone: 555-555-5555<br>
|
|
cell phone: 555-555-5555<br>
|
|
e-mail: jack@mydomain.com<p>
|
|
name: Jane Munson<br>
|
|
home phone: 555-555-5555<br>
|
|
cell phone: 555-555-5555<br>
|
|
e-mail: jane@mydomain.com<p>
|
|
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
|
|
|
|
<example>
|
|
<title>sectionelse</title>
|
|
<programlisting>
|
|
|
|
{* sectionelse will execute in the case there are no $custid values *}
|
|
{section name=customer loop=$custid}
|
|
id: {$customer/custid}<br>
|
|
{sectionelse}
|
|
there are no values in $custid.
|
|
{/section}
|
|
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Sections also have their own variables that handle section properties.
|
|
These are indicated by percent signs around the variable name, like so:
|
|
%sectionname.varname%
|
|
</para>
|
|
<sect3>
|
|
<title>index</title>
|
|
<para>
|
|
index is used to display the current loop iteration,
|
|
starting with zero.
|
|
</para>
|
|
<example>
|
|
<title>section property index</title>
|
|
<programlisting>
|
|
{section name=customer loop=$custid}
|
|
{%customer.index%} id: {$customer/custid}<br>
|
|
{/section}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
0 id: 1000<br>
|
|
1 id: 1001<br>
|
|
2 id: 1002<br>
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
<sect3>
|
|
<title>rownum</title>
|
|
<para>
|
|
rownum is used to display the current loop iteration,
|
|
starting with one.
|
|
</para>
|
|
<example>
|
|
<title>section property rownum</title>
|
|
<programlisting>
|
|
{section name=customer loop=$custid}
|
|
{%customer.rownum%} id: {$customer/custid}<br>
|
|
{/section}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
1 id: 1000<br>
|
|
2 id: 1001<br>
|
|
3 id: 1002<br>
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
<sect3>
|
|
<title>loop</title>
|
|
<para>
|
|
loop is used to display the total number
|
|
of iterations this section is looped. This can be used
|
|
inside or after the section.
|
|
</para>
|
|
<example>
|
|
<title>section property index</title>
|
|
<programlisting>
|
|
{section name=customer loop=$custid}
|
|
{%customer.index%} id: {$customer/custid}<br>
|
|
{/section}
|
|
|
|
There were {%customer.loop%} customers shown above.
|
|
|
|
OUTPUT:
|
|
|
|
0 id: 1000<br>
|
|
1 id: 1001<br>
|
|
2 id: 1002<br>
|
|
|
|
There were 3 customers shown above.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
<sect3>
|
|
<title>show</title>
|
|
<para>
|
|
show is used both as a parameter to section,
|
|
as well as displaying its value. show is a
|
|
boolean value, true or false. If false, the
|
|
section will not be displayed. If there is a
|
|
sectionelse present, that will be alternately
|
|
displayed.
|
|
</para>
|
|
<example>
|
|
<title>section property rownum</title>
|
|
<programlisting>
|
|
{* $show_customer_info may have been passed from the PHP
|
|
application, to regulate whether or not this section shows *}
|
|
{section name=customer loop=$custid show=$show_customer_info}
|
|
{%customer.rownum%} id: {$customer/custid}<br>
|
|
{/section}
|
|
|
|
{if %customer.show%}
|
|
the section was shown.
|
|
{else}
|
|
the section was not shown.
|
|
{/if}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
1 id: 1000<br>
|
|
2 id: 1001<br>
|
|
3 id: 1002<br>
|
|
|
|
the section was shown.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect3>
|
|
</sect2>
|
|
<sect2>
|
|
<title>strip</title>
|
|
<para>
|
|
Many times web designers
|
|
run into the issue where white space and carriage returns
|
|
affect the output of the rendered HTML (browser "features"), so you
|
|
must run all your tags together in the template to get the
|
|
desired results. This usually ends up in unreadable or
|
|
unmanagable templates.
|
|
</para>
|
|
<para>
|
|
Anything within {strip}{/strip} tags in Smarty are stripped of
|
|
the extra spaces or carriage returns at the beginnings and
|
|
ends of the lines before they are displayed.
|
|
This way you can keep your templates readable, and not worry
|
|
about extra white space causing problems.
|
|
</para>
|
|
<example>
|
|
<title>strip tags</title>
|
|
<programlisting>
|
|
|
|
{* the following will be all run into one line upon output *}
|
|
{strip}
|
|
<table border=0>
|
|
<tr>
|
|
<td>
|
|
<A HREF="{$url}">
|
|
<font color="red">This is a test</font>
|
|
</A>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
{/strip}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
<table border=0><tr><td><A HREF="http://my.domain.com"><font color="red">This is a test</font></A></td></tr></table>
|
|
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Notice that in the above example, all the lines begin and end
|
|
with HTML tags. Be aware that all the lines are run together.
|
|
If you have plain text at the beginning or end of any line,
|
|
they will be run together, and may not be desired results.
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="custom.functions">
|
|
<title>Custom Functions</title>
|
|
<para>
|
|
Custom functions in Smarty work much the same as the built-in functions
|
|
syntactically. Two custom functions come bundled with Smarty. You can
|
|
also write your own.
|
|
</para>
|
|
<sect2>
|
|
<title>html_options</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Attribute Name</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>values</entry>
|
|
<entry>array</entry>
|
|
<entry>No, if using options attribute</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>an array of values for dropdown</entry>
|
|
</row>
|
|
<row>
|
|
<entry>output</entry>
|
|
<entry>array</entry>
|
|
<entry>No, if using options attribute</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>an array of output for dropdown</entry>
|
|
</row>
|
|
<row>
|
|
<entry>selected</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry><emphasis>empty</emphasis></entry>
|
|
<entry>the selected array element</entry>
|
|
</row>
|
|
<row>
|
|
<entry>options</entry>
|
|
<entry>associative array</entry>
|
|
<entry>No, if using values and output</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>an associative array of values and output</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
html_options is a custom function that creates html option
|
|
lists with provided data. It takes care of which item is
|
|
selected by default as well. Required attributes are values
|
|
and output, unless you use options instead.
|
|
</para>
|
|
<example>
|
|
<title>html_options</title>
|
|
<programlisting>
|
|
|
|
{* assume that $cust_ids, and $cust_names are arrays of values,
|
|
and $customer_id may or may not be set to a value *}
|
|
|
|
<select name=customer_id>
|
|
{html_options values=$cust_ids selected=$customer_id output=$cust_names}
|
|
</select>
|
|
|
|
|
|
{* an alternative method is to pass the values & output as an associative array into
|
|
options. $customer_options is an associative array in this example. This
|
|
functionality was added to Smarty 1.3.0 *}
|
|
|
|
<select name=customer_id>
|
|
{html_options options=$customer_options selected=$customer_id}
|
|
</select>
|
|
|
|
|
|
OUTPUT:
|
|
|
|
<select name=customer_id>
|
|
<option value="1000">Joe Schmoe<option>
|
|
<option value="1001" selected>Jack Smith<option>
|
|
<option value="1002">Jane Johnson<option>
|
|
<option value="1003">Charlie Brown<option>
|
|
</select>
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>html_select_date</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Attribute Name</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>prefix</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>Date_</entry>
|
|
<entry>what to prefix the var name with</entry>
|
|
</row>
|
|
<row>
|
|
<entry>time</entry>
|
|
<entry>timestamp</entry>
|
|
<entry>No</entry>
|
|
<entry>current time</entry>
|
|
<entry>what date/time to use</entry>
|
|
</row>
|
|
<row>
|
|
<entry>start_year</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>current year</entry>
|
|
<entry>the first year in the dropdown</entry>
|
|
</row>
|
|
<row>
|
|
<entry>end_year</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>same as start_year</entry>
|
|
<entry>the last year in the dropdown</entry>
|
|
</row>
|
|
<row>
|
|
<entry>display_days</entry>
|
|
<entry>boolean</entry>
|
|
<entry>No</entry>
|
|
<entry>true</entry>
|
|
<entry>whether to display days or not</entry>
|
|
</row>
|
|
<row>
|
|
<entry>display_months</entry>
|
|
<entry>boolean</entry>
|
|
<entry>No</entry>
|
|
<entry>true</entry>
|
|
<entry>whether to display months or not</entry>
|
|
</row>
|
|
<row>
|
|
<entry>display_years</entry>
|
|
<entry>boolean</entry>
|
|
<entry>No</entry>
|
|
<entry>true</entry>
|
|
<entry>whether to display years or not</entry>
|
|
</row>
|
|
<row>
|
|
<entry>month_format</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>%B</entry>
|
|
<entry>what format the month should be in (strftime)</entry>
|
|
</row>
|
|
<row>
|
|
<entry>day_format</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>%02d</entry>
|
|
<entry>what format the day should be in (sprintf)</entry>
|
|
</row>
|
|
<row>
|
|
<entry>year_as_text</entry>
|
|
<entry>boolean</entry>
|
|
<entry>No</entry>
|
|
<entry>false</entry>
|
|
<entry>whether or not to display the year as text</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
html_select_date is a custom function that creates date dropdowns
|
|
for you. It can display any or all of year, month, and day.
|
|
</para>
|
|
<example>
|
|
<title>html_select_date</title>
|
|
<programlisting>
|
|
|
|
{html_select_date}
|
|
|
|
|
|
OUTPUT:
|
|
|
|
<select name="Date_Month">
|
|
<option value="1">January</option>
|
|
<option value="2">February</option>
|
|
<option value="3">March</option>
|
|
<option value="4">April</option>
|
|
<option value="5">May</option>
|
|
<option value="6">June</option>
|
|
<option value="7">July</option>
|
|
<option value="8">August</option>
|
|
<option value="9">September</option>
|
|
<option value="10">October</option>
|
|
<option value="11">November</option>
|
|
<option value="12" selected>December</option>
|
|
</select>
|
|
<select name="Date_Day">
|
|
<option value="1">01</option>
|
|
<option value="2">02</option>
|
|
<option value="3">03</option>
|
|
<option value="4">04</option>
|
|
<option value="5">05</option>
|
|
<option value="6">06</option>
|
|
<option value="7">07</option>
|
|
<option value="8">08</option>
|
|
<option value="9">09</option>
|
|
<option value="10">10</option>
|
|
<option value="11">11</option>
|
|
<option value="12">12</option>
|
|
<option value="13" selected>13</option>
|
|
<option value="14">14</option>
|
|
<option value="15">15</option>
|
|
<option value="16">16</option>
|
|
<option value="17">17</option>
|
|
<option value="18">18</option>
|
|
<option value="19">19</option>
|
|
<option value="20">20</option>
|
|
<option value="21">21</option>
|
|
<option value="22">22</option>
|
|
<option value="23">23</option>
|
|
<option value="24">24</option>
|
|
<option value="25">25</option>
|
|
<option value="26">26</option>
|
|
<option value="27">27</option>
|
|
<option value="28">28</option>
|
|
<option value="29">29</option>
|
|
<option value="30">30</option>
|
|
<option value="31">31</option>
|
|
</select>
|
|
<select name="Date_Year">
|
|
<option value="2001" selected>2001</option>
|
|
</select>
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
|
|
<example>
|
|
<title>html_select_date</title>
|
|
<programlisting>
|
|
|
|
|
|
{html_select_date prefix="StartDate" time=$time start_year=1995 end_year=2001 display_days=false}
|
|
|
|
OUTPUT:
|
|
|
|
<select name="StartDateMonth">
|
|
<option value="1">January</option>
|
|
<option value="2">February</option>
|
|
<option value="3">March</option>
|
|
<option value="4">April</option>
|
|
<option value="5">May</option>
|
|
<option value="6">June</option>
|
|
<option value="7">July</option>
|
|
<option value="8">August</option>
|
|
<option value="9">September</option>
|
|
<option value="10">October</option>
|
|
<option value="11">November</option>
|
|
<option value="12" selected>December</option>
|
|
</select>
|
|
<select name="StartDateYear">
|
|
<option value="1999">1995</option>
|
|
<option value="1999">1996</option>
|
|
<option value="1999">1997</option>
|
|
<option value="1999">1998</option>
|
|
<option value="1999">1999</option>
|
|
<option value="2000" selected>2000</option>
|
|
<option value="2001">2001</option>
|
|
</select>
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Creating your own Custom Functions</title>
|
|
<para>
|
|
Creating your own functions is a fairly straight forward process.
|
|
The best way is to look at the ones that come with Smarty as
|
|
examples. The function names begin with smarty_func_ and they are
|
|
located in the Smarty.addons.php file.
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem><para>add your function to the Smarty.addons.php file.
|
|
It is recommended that you prepend your function name
|
|
with smarty_func_</para></listitem>
|
|
<listitem><para>map a template function name to your PHP function.
|
|
This is done at the top of the Smarty.class.php file
|
|
in the $custom_funcs array.</para></listitem>
|
|
<listitem><para>Thats it! you can now call that function
|
|
from within Smarty.</para></listitem>
|
|
</itemizedlist>
|
|
<para>
|
|
All attributes passed to custom functions are passed into the
|
|
first argument as an associative array. One way to get to those
|
|
values is to call extract(func_get_arg(0)); at the top of your
|
|
function. Anything that the function returns gets displayed
|
|
in place of the tag in the template.
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="variable.modifiers">
|
|
<title>Variable Modifiers</title>
|
|
<para>
|
|
Variable modifiers are a bit different than
|
|
<link linkend="custom.functions">custom functions</link>.
|
|
Variable modifiers alter variable contents before they are displayed to
|
|
the template. All modifiers will get the value of the variable as the
|
|
first argument, and must return a single value. Modifier parameters are
|
|
separated by colons. Any additional parameters passed to a modifier are
|
|
passed as-is positionally, much like calling a PHP function. You can
|
|
also use native PHP functions as modifiers, but only if they expect the
|
|
correct arguments. If they do not, you can always write a wrapper
|
|
function in Smarty to get what you want (date_format is a wrapper
|
|
function to strftime() for example.) You can chain as many modifiers
|
|
together on a variable as you like, separating each with a vertical
|
|
pipe "|".
|
|
</para>
|
|
<para>
|
|
NOTE: if you apply a modifier to an array instead of a single value
|
|
variable, the modifier will be applied to every value in that array. If
|
|
you really want the entire array passed to the modifier, you must
|
|
prepend it with an "@" sign like so: {$articleTitle|@count} (this will
|
|
print out the number of elements in the $articleTitle array.)
|
|
</para>
|
|
<sect2>
|
|
<title>capitalize</title>
|
|
<para>
|
|
This is used to capitalize the first letter of all words in a variable.
|
|
</para>
|
|
<example>
|
|
<title>capitalize</title>
|
|
<programlisting>
|
|
|
|
{* this displays a variable, unmodified *}
|
|
{$articleTitle|capitalize}
|
|
|
|
OUTPUT:
|
|
|
|
POLICE BEGIN CAMPAIGN TO RUNDOWN JAYWALKERS
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2 id="date.format">
|
|
<title>date_format</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>%b %e, %Y</entry>
|
|
<entry>This is the format for the outputted date.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
This formats a date and time into the given strftime() format. All
|
|
dates should be passed to Smarty as a timestamp so that the
|
|
template designer has full control of how this date is formatted.
|
|
</para>
|
|
<example>
|
|
<title>date_format</title>
|
|
<programlisting>
|
|
|
|
{$currentDate|date_format}
|
|
{$currentDate|date_format:"%A, %B %e, %Y"}
|
|
{$currentDate|date_format:"%H:%M:%S"}
|
|
|
|
OUTPUT:
|
|
|
|
Feb 6,2001
|
|
Tuesday, February 6, 2001
|
|
14:33:00
|
|
|
|
</programlisting>
|
|
</example>
|
|
<example>
|
|
<title>date_format conversion specifiers</title>
|
|
<programlisting>
|
|
%a - abbreviated weekday name according to the current locale
|
|
|
|
%A - full weekday name according to the current locale
|
|
|
|
%b - abbreviated month name according to the current locale
|
|
|
|
%B - full month name according to the current locale
|
|
|
|
%c - preferred date and time representation for the current locale
|
|
|
|
%C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
|
|
|
|
%d - day of the month as a decimal number (range 00 to 31)
|
|
|
|
%D - same as %m/%d/%y
|
|
|
|
%e - day of the month as a decimal number, a single digit is preceded by a
|
|
space (range 1 to 31)
|
|
|
|
%g - Week-based year within century [00,99]
|
|
|
|
%G - Week-based year, including the century [0000,9999]
|
|
|
|
%h - same as %b
|
|
|
|
%H - hour as a decimal number using a 24-hour clock (range 00 to 23)
|
|
|
|
%I - hour as a decimal number using a 12-hour clock (range 01 to 12)
|
|
|
|
%j - day of the year as a decimal number (range 001 to 366)
|
|
|
|
%k - Hour (24-hour clock) single digits are preceded by a blank. (range 0 to 23)
|
|
|
|
%l - hour as a decimal number using a 12-hour clock, single digits preceeded by
|
|
a space (range 1 to 12)
|
|
|
|
%m - month as a decimal number (range 01 to 12)
|
|
|
|
%M - minute as a decimal number
|
|
|
|
%n - newline character
|
|
|
|
%p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
|
|
|
|
%r - time in a.m. and p.m. notation
|
|
|
|
%R - time in 24 hour notation
|
|
|
|
%S - second as a decimal number
|
|
|
|
%t - tab character
|
|
|
|
%T - current time, equal to %H:%M:%S
|
|
|
|
%u - weekday as a decimal number [1,7], with 1 representing Monday
|
|
|
|
%U - week number of the current year as a decimal number, starting with the first Sunday as the first day of the first week
|
|
|
|
%V - The ISO 8601:1988 week number of the current year as a decimal number, range 01 to 53, where week 1
|
|
is the first week that has at least 4 days in the current year, and with Monday as the first day of the week.
|
|
|
|
%w - day of the week as a decimal, Sunday being 0
|
|
|
|
%W - week number of the current year as a decimal number, starting with the first Monday as the first day of the first week
|
|
|
|
%x - preferred date representation for the current locale without the time
|
|
|
|
%X - preferred time representation for the current locale without the date
|
|
|
|
%y - year as a decimal number without a century (range 00 to 99)
|
|
|
|
%Y - year as a decimal number including the century
|
|
|
|
%Z - time zone or name or abbreviation
|
|
|
|
%% - a literal `%' character
|
|
|
|
|
|
PROGRAMMERS NOTE: date_format is a wrapper to PHP's strftime() function. You
|
|
may have more or less conversion specifiers available depending on your
|
|
system's strftime() function where PHP was compiled. Check your system's manpage
|
|
for a full list of valid specifiers.
|
|
</programlisting>
|
|
</example>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>default</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry><emphasis>empty</emphasis></entry>
|
|
<entry>This is the default value to output if the
|
|
variable is empty.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
This is used to set a default value for a variable. If the variable
|
|
is empty or unset, the given default value is printed instead.
|
|
Default takes one argument.
|
|
</para>
|
|
<example>
|
|
<title>default</title>
|
|
<programlisting>
|
|
|
|
{* this will display "no title" (without the qoutes) if $articleTitle is empty *}
|
|
{$articleTitle|default:"no title"}
|
|
|
|
OUTPUT:
|
|
|
|
no title
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>escape</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=posvals>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Possible Values</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>html,url</entry>
|
|
<entry>html</entry>
|
|
<entry>This is the escape format to use.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
This is used to html or url escape a variable. By default,
|
|
the variable is html escaped.
|
|
</para>
|
|
<example>
|
|
<title>escape</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|escape}
|
|
{$articleTitle|escape:"html"}
|
|
{$articleTitle|escape:"url"}
|
|
|
|
OUTPUT:
|
|
|
|
Stiff Opposition Expected to Casketless Funeral Plan
|
|
Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan
|
|
Stiff%20Opposition%20Expected%20to%20Casketless%20Funeral%20Plan
|
|
Stiff+Opposition+Expected+to+Casketless+Funeral+Plan
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>lower</title>
|
|
<para>
|
|
This is used to lowercase a variable.
|
|
</para>
|
|
<example>
|
|
<title>lower</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|lower}
|
|
|
|
OUTPUT:
|
|
|
|
Two Convicts Evade Noose, Jury Hung.
|
|
two convicts evade noose, jury hung.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>replace</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>Yes</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>This is the string of text to be replaced.</entry>
|
|
</row>
|
|
<row>
|
|
<entry>2</entry>
|
|
<entry>string</entry>
|
|
<entry>Yes</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>This is the string of text to replace with.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
A simple search and replace on a variable.
|
|
</para>
|
|
<example>
|
|
<title>replace</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|replace:"Garden":"Vineyard"}
|
|
{$articleTitle|replace:" ":" "}
|
|
|
|
OUTPUT:
|
|
|
|
Child's Stool Great for Use in Garden.
|
|
Child's Stool Great for Use in Vineyard.
|
|
Child's Stool Great for Use in Garden.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>spacify</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry><emphasis>one space</emphasis></entry>
|
|
<entry>This what gets inserted between each character of
|
|
the variable.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
spacify is a way to insert a space between every character of a variable.
|
|
You can optionally pass a different character (or string) to insert.
|
|
</para>
|
|
<example>
|
|
<title>spacify</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|spacify}
|
|
{$articleTitle|spacify:"^^"}
|
|
|
|
OUTPUT:
|
|
|
|
Something Went Wrong in Jet Crash, Experts Say.
|
|
S o m e t h i n g W e n t W r o n g i n J e t C r a s h , E x p e r t s S a y .
|
|
S^^o^^m^^e^^t^^h^^i^^n^^g^^ ^^W^^e^^n^^t^^ ^^W^^r^^o^^n^^g^^ ^^i^^n^^ ^^J^^e^^t^^ ^^C^^r^^a^^s^^h^^,^^ ^^E^^x^^p^^e^^r^^t^^s^^ ^^S^^a^^y^^.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>string_format</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>string</entry>
|
|
<entry>Yes</entry>
|
|
<entry><emphasis>n/a</emphasis></entry>
|
|
<entry>This is what format to use. (sprintf)</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
This is a way to format strings, such as decimal numbers and such.
|
|
Use the syntax for sprintf for the formatting.
|
|
</para>
|
|
<example>
|
|
<title>string_format</title>
|
|
<programlisting>
|
|
|
|
{$number}
|
|
{$number|string_format:"%.2f"}
|
|
{$number|string_format:"%d"}
|
|
|
|
OUTPUT:
|
|
|
|
23.5787446
|
|
23.58
|
|
24
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>strip_tags</title>
|
|
<para>
|
|
This strips out markup tags, basically anything between < and >.
|
|
</para>
|
|
<example>
|
|
<title>strip_tags</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|strip_tags}
|
|
|
|
OUTPUT:
|
|
|
|
Blind Woman Gets <font face="helvetica">New Kidney</font> from Dad she Hasn't Seen in <b>years</b>.
|
|
Blind Woman Gets New Kidney from Dad she Hasn't Seen in years.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>truncate</title>
|
|
<informaltable frame=all>
|
|
<tgroup cols=3>
|
|
<colspec colname=param>
|
|
<colspec colname=type>
|
|
<colspec colname=required>
|
|
<colspec colname=default>
|
|
<colspec colname=desc>
|
|
<thead>
|
|
<row>
|
|
<entry>Parameter Position</entry>
|
|
<entry>Type</entry>
|
|
<entry>Required</entry>
|
|
<entry>Default</entry>
|
|
<entry>Description</entry>
|
|
</row>
|
|
</thead>
|
|
<tbody>
|
|
<row>
|
|
<entry>1</entry>
|
|
<entry>integer</entry>
|
|
<entry>No</entry>
|
|
<entry>80</entry>
|
|
<entry>This determines how many characters to truncate
|
|
to.</entry>
|
|
</row>
|
|
<row>
|
|
<entry>2</entry>
|
|
<entry>string</entry>
|
|
<entry>No</entry>
|
|
<entry>...</entry>
|
|
<entry>This is the text to append if truncation occurs.</entry>
|
|
</row>
|
|
<row>
|
|
<entry>3</entry>
|
|
<entry>boolean</entry>
|
|
<entry>No</entry>
|
|
<entry>false</entry>
|
|
<entry>This determines whether or not to truncate at a
|
|
word boundary (false), or at the exact character (true).</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>
|
|
This truncates a variable to a character length, default is 80. As
|
|
an optional second parameter, you can specify a string of text
|
|
to display at the end if the variable was truncated. The
|
|
characters in the string are included with the original truncation length.
|
|
By default, truncate will attempt to cut off at a word boundary. If
|
|
you want to cut off at the exact character length, pass the optional
|
|
third parameter of true.
|
|
</para>
|
|
<example>
|
|
<title>truncate</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|truncate}
|
|
{$articleTitle|truncate:30}
|
|
{$articleTitle|truncate:30:""}
|
|
{$articleTitle|truncate:30:"---"}
|
|
{$articleTitle|truncate:30:"":true}
|
|
{$articleTitle|truncate:30:"...":true}
|
|
|
|
OUTPUT:
|
|
|
|
Two Sisters Reunite after Eighteen Years at Checkout Counter.
|
|
Two Sisters Reunite after Eighteen Years at Checkout Counter.
|
|
Two Sisters Reunite after...
|
|
Two Sisters Reunite after
|
|
Two Sisters Reunite after---
|
|
Two Sisters Reunite after Eigh
|
|
Two Sisters Reunite after E...
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>upper</title>
|
|
<para>
|
|
This is used to uppercase a variable.
|
|
</para>
|
|
<example>
|
|
<title>upper</title>
|
|
<programlisting>
|
|
|
|
{$articleTitle}
|
|
{$articleTitle|upper}
|
|
|
|
OUTPUT:
|
|
|
|
If Strike isn't Settled Quickly it may Last a While.
|
|
IF STRIKE ISN'T SETTLED QUICKLY IT MAY LAST A WHILE.
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Creating your own Variable Modifiers</title>
|
|
<para>
|
|
Creating your own modifiers is a fairly straight forward process.
|
|
The best way is to look at the ones that come with Smarty as
|
|
examples. The function names begin with smarty_mod_ and they are
|
|
located in the Smarty.addons.php file.
|
|
</para>
|
|
<itemizedlist>
|
|
<listitem><para>add your modifier to the Smarty.addons.php file.
|
|
It is recommended that you prepend your function name
|
|
with smarty_mod_</para></listitem>
|
|
<listitem><para>map a template modifier name to your PHP function.
|
|
This is done at the top of the Smarty.class.php file
|
|
in the $custom_mods array.</para></listitem>
|
|
<listitem><para>Thats it! you can now use that modifier
|
|
from within Smarty.</para></listitem>
|
|
</itemizedlist>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter>
|
|
<title>Troubleshooting</title>
|
|
<para></para>
|
|
<sect1>
|
|
<title>Smarty/PHP errors</title>
|
|
<para>
|
|
Smarty can catch many errors such as missing tag attributes
|
|
or malformed variable names. If this happens, you will see an error
|
|
similar to the following:
|
|
</para>
|
|
|
|
<example>
|
|
<title>Smarty errors</title>
|
|
<programlisting>
|
|
|
|
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
|
in /path/to/smarty/Smarty.class.php on line 1041
|
|
|
|
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
|
in /path/to/smarty/Smarty.class.php on line 1041
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<para>
|
|
Smarty shows you the template name, the line number and the error.
|
|
Everything beyond that is PHP error messages which you can ignore.
|
|
</para>
|
|
|
|
<para>
|
|
There are certain errors that Smarty cannot catch, such as missing
|
|
close tags. These types of errors can end up in PHP compile-time
|
|
errors.
|
|
</para>
|
|
|
|
<example>
|
|
<title>PHP errors</title>
|
|
<programlisting>
|
|
|
|
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
|
|
|
|
</programlisting>
|
|
</example>
|
|
|
|
<para>
|
|
When you encounter a PHP error when attempting to display the
|
|
template in a browser, the error line number will correspond to the
|
|
compiled PHP script, not the template itself. This may be a bit
|
|
confusing. Usually you can look at the template and spot the syntax
|
|
error. Here are some common things to look for: missing close tags for
|
|
{if}{/if} or {section}{/section}, or syntax of logic within an {if}
|
|
tag. If you can't find the error, you must open the compiled PHP file
|
|
and go to the line number to figure out where the corresponding error
|
|
is in the template.
|
|
</para>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter id="tips">
|
|
<title>Tips & Tricks</title>
|
|
<para>
|
|
</para>
|
|
<sect1>
|
|
<title>Dates</title>
|
|
<para>
|
|
As a rule of thumb, always pass dates to Smarty as timestamps.
|
|
This allows template designers to use <link
|
|
linkend="date.format">date_format</link> for full control over date
|
|
formatting, and also makes it easy to compare dates if necessary.
|
|
</para>
|
|
<example>
|
|
<title>using date_format</title>
|
|
<programlisting>
|
|
|
|
{$startDate|date_format}
|
|
|
|
OUTPUT:
|
|
|
|
Jan 4, 2001
|
|
|
|
|
|
{$startDate|date_format:"%Y/%m/%d"}
|
|
|
|
OUTPUT:
|
|
|
|
2001/01/04
|
|
|
|
|
|
{if $date1 < $date2}
|
|
...
|
|
{/if}
|
|
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
{html_select_date}, an included custom function with Smarty, also
|
|
expects a timestamp as the default value. When using {html_select_date}
|
|
in a template, The programmer will most likely want to convert the
|
|
output from the form back into timestamp format. Here is a function to
|
|
help you with that.
|
|
</para>
|
|
<example>
|
|
<title>converting form date elements back to a timestamp</title>
|
|
<programlisting>
|
|
|
|
// this assumes your form elements are named
|
|
// startDate_Day, startDate_Month, startDate_Year
|
|
|
|
$startDate = makeTimestamp($startDate_Year,$startDate_Month,$startDate_day);
|
|
|
|
function makeTimeStamp($year="",$month="",$day="")
|
|
{
|
|
if(empty($year))
|
|
$year = strftime("%Y");
|
|
if(empty($month))
|
|
$month = strftime("%m");
|
|
if(empty($day))
|
|
$day = strftime("%d");
|
|
|
|
return mktime(0,0,0,$month,$day,$year);
|
|
}
|
|
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter id="resources">
|
|
<title>Resources</title>
|
|
<para>
|
|
Smarty's homepage is located at http://www.phpinsider.com/php/code/Smarty/.
|
|
You can join the mailing list by sending an e-mail to
|
|
subscribe-smarty@lists.ispi.net. An archive of the mailing list can be
|
|
viewed at http://marc.theaimsgroup.com/ under www/smarty.
|
|
</para>
|
|
</chapter>
|
|
<chapter id="bugs">
|
|
<title>BUGS</title>
|
|
<para>
|
|
Check the BUGS file that comes with the latest distribution of Smarty, or
|
|
check the website.
|
|
</para>
|
|
</chapter>
|
|
<chapter id="pear">
|
|
<title>PEAR</title>
|
|
<para>
|
|
Smarty uses the PEAR libraries for some of its error handling routines.
|
|
PEAR libraries come with the distribution of PHP. Be sure that the path to
|
|
these libraries is included in your php include_path. un*x users check
|
|
/usr/local/lib/php. Windows users check C:/php/pear.
|
|
</para>
|
|
</chapter>
|
|
<chapter id="credits">
|
|
<title>CREDITS</title>
|
|
<para>
|
|
Monte Ohrt <monte@ispi.net>: Idea of compiling into PHP scripts,
|
|
initial implementation, documentation.
|
|
</para>
|
|
<para>
|
|
Andrei Zmievski <andrei@ispi.net>: Rewrote parser from scratch, added
|
|
custom modifier functionality, and much more.
|
|
</para>
|
|
<para>
|
|
Anne Holz <anne@ispi.net>: Contributed several ideas for formatting features.
|
|
</para>
|
|
<para>
|
|
Frank Kromann <fmk@php.net>: Idea of custom function ability.
|
|
</para>
|
|
<para>
|
|
A special thanks goes to all the people that have contributed other
|
|
templating solutions to the PHP community which we learned a lot from.
|
|
</para>
|
|
<para>
|
|
A special thanks goes to all the members of the php-template mailing list,
|
|
who shared and brought many ideas to the table.
|
|
</para>
|
|
<para>
|
|
Rasmus Lerdorf <rasmus@php.net>: For starting what eventually became
|
|
the coolest programming language ever.
|
|
</para>
|
|
</chapter>
|
|
</book>
|