Files
smarty/docs/en/appendixes/tips.xml

450 lines
13 KiB
XML
Raw Normal View History

2004-03-24 15:16:30 +00:00
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
2004-03-18 17:16:23 +00:00
<chapter id="tips">
2004-03-26 14:38:16 +00:00
<title>Tips &amp; Tricks</title>
2004-03-18 17:16:23 +00:00
<para>
</para>
<sect1 id="tips.blank.var.handling">
<title>Blank Variable Handling</title>
<para>
There may be times when you want to print a default value for an empty
2006-09-27 04:32:52 +00:00
variable instead of printing nothing, such as printing
<literal>&amp;nbsp;</literal> so that
html table backgrounds work properly. Many would use an
<link linkend="language.function.if"><varname>{if}</varname></link>
statement to handle this, but there is a shorthand way with Smarty, using
the <link linkend="language.modifier.default"><varname>default</varname>
</link> variable modifier.
<note>
<para><quote>Undefined variable</quote> errors will show if PHP
<ulink url="&url.php-manual;error_reporting">
<varname>error_reporting()</varname></ulink> is <constant>E_ALL</constant>
and a variable had not been assigned to Smarty.
</para>
</note>
2004-03-18 17:16:23 +00:00
</para>
2006-09-27 04:32:52 +00:00
2004-03-18 17:16:23 +00:00
<example>
<title>Printing &amp;nbsp; when a variable is empty</title>
2004-03-18 17:16:23 +00:00
<programlisting>
<![CDATA[
{* the long way *}
2006-02-18 13:18:16 +00:00
{if $title eq ''}
2004-03-24 17:11:28 +00:00
&nbsp;
2004-03-18 17:16:23 +00:00
{else}
{$title}
{/if}
{* the short way *}
2006-02-18 13:18:16 +00:00
{$title|default:'&nbsp;'}
2004-03-18 17:16:23 +00:00
]]>
</programlisting>
</example>
2006-09-27 04:32:52 +00:00
<para>
See also <link linkend="language.modifier.default">
<varname>default</varname></link> modifier and
<link linkend="tips.default.var.handling">default variable handling</link>.
</para>
2004-03-18 17:16:23 +00:00
</sect1>
2006-09-27 04:32:52 +00:00
2004-03-18 17:16:23 +00:00
<sect1 id="tips.default.var.handling">
<title>Default Variable Handling</title>
<para>
If a variable is used frequently throughout your templates, applying
2006-09-27 04:32:52 +00:00
the <link linkend="language.modifier.default"><varname>default</varname>
</link> modifier every time it is mentioned can get a bit ugly. You
2004-03-18 17:16:23 +00:00
can remedy this by assigning the variable its default value with the
2006-09-27 04:32:52 +00:00
<link linkend="language.function.assign"><varname>{assign}</varname></link>
function.
2004-03-18 17:16:23 +00:00
</para>
<example>
<title>Assigning a template variable its default value</title>
<programlisting>
<![CDATA[
{* do this somewhere at the top of your template *}
2006-02-18 13:18:16 +00:00
{assign var='title' value=$title|default:'no title'}
2004-03-18 17:16:23 +00:00
2006-09-27 04:32:52 +00:00
{* if $title was empty, it now contains the value "no title" when you use it *}
2004-03-18 17:16:23 +00:00
{$title}
]]>
</programlisting>
</example>
2005-05-21 12:41:15 +00:00
<para>
2006-09-27 04:32:52 +00:00
See also
<link linkend="language.modifier.default"><varname>default</varname></link>
modifier and <link linkend="tips.blank.var.handling">blank variable handling</link>.
2005-05-21 12:41:15 +00:00
</para>
2004-03-18 17:16:23 +00:00
</sect1>
2005-05-21 12:41:15 +00:00
2004-03-18 17:16:23 +00:00
<sect1 id="tips.passing.vars">
<title>Passing variable title to header template</title>
<para>
When the majority of your templates use the same headers and footers, it
is common to split those out into their own templates and
2006-09-27 04:32:52 +00:00
<link linkend="language.function.include">
<varname>{include}</varname></link> them.
2004-03-18 17:16:23 +00:00
But what if the header needs to have a different title, depending on
2006-09-27 04:32:52 +00:00
what page you are coming from? You can pass the title to the header
2006-02-18 13:18:16 +00:00
as an <link linkend="language.syntax.attributes">attribute</link> when
2004-03-18 17:16:23 +00:00
it is included.
</para>
<example>
2004-03-18 17:16:23 +00:00
<title>Passing the title variable to the header template</title>
<para>
2006-09-27 04:32:52 +00:00
<filename>mainpage.tpl</filename> - When the main page is drawn,
the title of <quote>Main Page</quote> is passed to the
2006-02-18 13:18:16 +00:00
<filename>header.tpl</filename>, and will subsequently be used as the title.
</para>
2004-03-18 17:16:23 +00:00
<programlisting>
<![CDATA[
2006-02-18 13:18:16 +00:00
{include file='header.tpl' title='Main Page'}
2004-03-18 17:16:23 +00:00
{* template body goes here *}
2006-02-18 13:18:16 +00:00
{include file='footer.tpl'}
]]>
</programlisting>
2004-03-18 17:16:23 +00:00
<para>
2006-02-18 13:18:16 +00:00
<filename>archives.tpl</filename> - When the
2006-09-27 04:32:52 +00:00
archives page is drawn, the title will be <quote>Archives</quote>.
Notice in the archive example, we are using a variable from the
2006-02-18 13:18:16 +00:00
<filename>archives_page.conf</filename>
file instead of a hard coded variable.
</para>
<programlisting>
<![CDATA[
2006-02-18 13:18:16 +00:00
{config_load file='archive_page.conf'}
2006-09-27 04:32:52 +00:00
2006-02-18 13:18:16 +00:00
{include file='header.tpl' title=#archivePageTitle#}
2004-03-18 17:16:23 +00:00
{* template body goes here *}
2006-02-18 13:18:16 +00:00
{include file='footer.tpl'}
]]>
</programlisting>
2004-03-18 17:16:23 +00:00
<para>
2006-09-27 04:32:52 +00:00
<filename>header.tpl</filename> - Notice that <quote>Smarty News</quote> is
printed if the <literal>$title</literal> variable is not set, using the
<link linkend="language.modifier.default"><varname>default</varname></link>
2006-02-18 13:18:16 +00:00
variable modifier.
</para>
<programlisting>
<![CDATA[
<html>
<head>
2006-03-27 23:56:45 +00:00
<title>{$title|default:'Smarty News'}</title>
</head>
<body>
]]>
</programlisting>
2004-03-18 17:16:23 +00:00
<para>
<filename>footer.tpl</filename>
</para>
<programlisting>
<![CDATA[
</body>
</html>
2004-03-18 17:16:23 +00:00
]]>
</programlisting>
</example>
2004-03-18 17:16:23 +00:00
</sect1>
2006-09-27 04:32:52 +00:00
2004-03-18 17:16:23 +00:00
<sect1 id="tips.dates">
<title>Dates</title>
<para>
2006-09-27 04:32:52 +00:00
As a rule of thumb, always pass dates to Smarty as
2006-02-18 13:18:16 +00:00
<ulink url="&url.php-manual;time">timestamps</ulink>. This
allows template designers to use the <link
2006-09-27 04:32:52 +00:00
linkend="language.modifier.date.format"><varname>date_format</varname>
</link> modifier for full control over date formatting, and also makes it
easy to compare dates if necessary.
2004-03-18 17:16:23 +00:00
</para>
<example>
2006-09-27 04:32:52 +00:00
<title>Using date_format</title>
2004-03-18 17:16:23 +00:00
<programlisting>
<![CDATA[
{$startDate|date_format}
2004-03-29 01:54:07 +00:00
]]>
</programlisting>
<para>
This will output:
</para>
<screen>
<![CDATA[
2006-09-27 04:32:52 +00:00
Jan 4, 2009
2004-03-29 01:54:07 +00:00
]]>
</screen>
<programlisting>
<![CDATA[
2004-03-18 17:16:23 +00:00
{$startDate|date_format:"%Y/%m/%d"}
2004-03-29 01:54:07 +00:00
]]>
</programlisting>
<para>
This will output:
</para>
<screen>
<![CDATA[
2006-09-27 04:32:52 +00:00
2009/01/04
2004-03-29 01:54:07 +00:00
]]>
</screen>
2006-09-27 04:32:52 +00:00
<para>
Dates can be compared in the template by timestamps with:
</para>
2004-03-29 01:54:07 +00:00
<programlisting>
<![CDATA[
2006-09-27 04:32:52 +00:00
{if $order_date < $invoice_date}
...do something..
2004-03-18 17:16:23 +00:00
{/if}
]]>
</programlisting>
</example>
<para>
2006-09-27 04:32:52 +00:00
When using <link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link> 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.
2004-03-18 17:16:23 +00:00
</para>
<example>
2006-09-27 04:32:52 +00:00
<title>Converting form date elements back to a timestamp</title>
2004-03-18 17:16:23 +00:00
<programlisting role="php">
<![CDATA[
<?php
2004-03-18 17:16:23 +00:00
// this assumes your form elements are named
// startDate_Day, startDate_Month, startDate_Year
2004-03-28 19:15:35 +00:00
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
2004-03-18 17:16:23 +00:00
function makeTimeStamp($year='', $month='', $day='')
2004-03-18 17:16:23 +00:00
{
2004-03-28 19:15:35 +00:00
if(empty($year)) {
2006-09-27 04:32:52 +00:00
$year = strftime('%Y');
2004-03-28 19:15:35 +00:00
}
if(empty($month)) {
2006-09-27 04:32:52 +00:00
$month = strftime('%m');
2004-03-28 19:15:35 +00:00
}
if(empty($day)) {
2006-09-27 04:32:52 +00:00
$day = strftime('%d');
2004-03-28 19:15:35 +00:00
}
2004-03-18 17:16:23 +00:00
2004-03-28 19:15:35 +00:00
return mktime(0, 0, 0, $month, $day, $year);
2004-03-18 17:16:23 +00:00
}
?>
2004-03-18 17:16:23 +00:00
]]>
</programlisting>
</example>
<para>
See also
2006-09-27 04:32:52 +00:00
<link linkend="language.function.html.select.date">
<varname>{html_select_date}</varname></link>,
<link linkend="language.function.html.select.time">
<varname>{html_select_time}</varname></link>,
<link linkend="language.modifier.date.format">
<varname>date_format</varname></link>
and <link linkend="language.variables.smarty.now">
<parameter>$smarty.now</parameter></link>,
</para>
2004-03-18 17:16:23 +00:00
</sect1>
2004-03-18 17:16:23 +00:00
<sect1 id="tips.wap">
<title>WAP/WML</title>
<para>
WAP/WML templates require a php
<ulink url="&url.php-manual;header">Content-Type header</ulink>
to be passed along
2004-03-18 17:16:23 +00:00
with the template. The easist way to do this would be to write a custom
function that prints the header. If you are using
<link linkend="caching">caching</link>, that won't
work so we'll do it using the
2006-09-27 04:32:52 +00:00
<link linkend="language.function.insert"><varname>{insert}</varname></link>
tag; remember <varname>{insert}</varname> tags are not
cached! Be sure that there is nothing output to the browser before the
2004-03-18 17:16:23 +00:00
template, or else the header may fail.
</para>
<example>
2006-09-27 04:32:52 +00:00
<title>Using {insert} to write a WML Content-Type header</title>
2004-03-18 17:16:23 +00:00
<programlisting role="php">
<![CDATA[
<?php
// be sure apache is configure for the .wml extensions!
2004-03-18 17:16:23 +00:00
// put this function somewhere in your application, or in Smarty.addons.php
function insert_header($params)
2004-03-28 19:15:35 +00:00
{
2004-03-18 17:16:23 +00:00
// this function expects $content argument
2004-03-28 19:15:35 +00:00
if (empty($params['content'])) {
2004-03-18 17:16:23 +00:00
return;
2004-03-28 19:15:35 +00:00
}
2004-03-18 17:16:23 +00:00
header($params['content']);
return;
}
?>
]]>
</programlisting>
<para>
your Smarty template <emphasis>must</emphasis> begin with the insert tag :
</para>
<programlisting>
<![CDATA[
{insert name=header content="Content-Type: text/vnd.wap.wml"}
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<!-- begin new wml deck -->
<wml>
<!-- begin first card -->
<card>
<do type="accept">
<go href="#two"/>
</do>
<p>
Welcome to WAP with Smarty!
Press OK to continue...
</p>
</card>
<!-- begin second card -->
<card id="two">
<p>
Pretty easy isn't it?
</p>
</card>
2004-03-24 17:11:28 +00:00
</wml>
2004-03-18 17:16:23 +00:00
]]>
</programlisting>
</example>
</sect1>
2006-09-27 04:32:52 +00:00
2004-03-18 17:16:23 +00:00
<sect1 id="tips.componentized.templates">
<title>Componentized Templates</title>
<para>
Traditionally, programming templates into your applications goes as
follows: First, you accumulate your variables within your PHP
application, (maybe with database queries.) Then, you instantiate your
2006-09-27 04:32:52 +00:00
Smarty object, <link linkend="api.assign"><varname>assign()</varname></link>
the variables and <link linkend="api.display"><varname>display()</varname>
</link> the template. So lets
2004-03-18 17:16:23 +00:00
say for example we have a stock ticker on our template. We would
collect the stock data in our application, then assign these variables
in the template and display it. Now wouldn't it be nice if you could
add this stock ticker to any application by merely including the
template, and not worry about fetching the data up front?
</para>
<para>
You can do this by writing a custom plugin for fetching the content and
assigning it to a template variable.
</para>
<example>
<title>componentized template</title>
<para>
<filename>function.load_ticker.php</filename> -
drop file in
2006-09-27 04:32:52 +00:00
<link linkend="variable.plugins.dir">
<parameter>$plugins directory</parameter></link>
</para>
2004-03-18 17:16:23 +00:00
<programlisting role="php">
<![CDATA[
<?php
// setup our function for fetching stock data
function fetch_ticker($symbol)
2004-03-28 19:15:35 +00:00
{
// put logic here that fetches $ticker_info
// from some ticker resource
return $ticker_info;
}
2004-03-18 17:16:23 +00:00
function smarty_function_load_ticker($params, &$smarty)
2004-03-28 19:15:35 +00:00
{
2004-03-18 17:16:23 +00:00
// call the function
$ticker_info = fetch_ticker($params['symbol']);
2004-03-18 17:16:23 +00:00
// assign template variable
2004-03-28 19:15:35 +00:00
$smarty->assign($params['assign'], $ticker_info);
2004-03-18 17:16:23 +00:00
}
?>
]]>
</programlisting>
<para>
<filename>index.tpl</filename>
</para>
2004-03-18 17:16:23 +00:00
<programlisting>
<![CDATA[
2006-03-27 23:56:45 +00:00
{load_ticker symbol='SMARTY' assign='ticker'}
2004-03-18 17:16:23 +00:00
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
]]>
</programlisting>
</example>
2005-05-21 12:41:15 +00:00
<para>
2006-09-27 04:32:52 +00:00
See also
<link linkend="language.function.include.php"><varname>{include_php}</varname></link>,
<link linkend="language.function.include"><varname>{include}</varname></link>
and
<link linkend="language.function.php"><varname>{php}</varname></link>.
2005-05-21 12:41:15 +00:00
</para>
2004-03-18 17:16:23 +00:00
</sect1>
2005-05-21 12:41:15 +00:00
2004-03-18 17:16:23 +00:00
<sect1 id="tips.obfuscating.email">
<title>Obfuscating E-mail Addresses</title>
<para>
2006-09-27 04:32:52 +00:00
Do you ever wonder how your email address gets on so many spam mailing
lists? One way spammers collect email addresses is from web pages. To
help combat this problem, you can make your email address show up in
2004-03-18 17:16:23 +00:00
scrambled javascript in the HTML source, yet it it will look and work
correctly in the browser. This is done with the
2006-09-27 04:32:52 +00:00
<link linkend="language.function.mailto">
<varname>{mailto}</varname></link> plugin.
2004-03-18 17:16:23 +00:00
</para>
<example>
2006-09-27 04:32:52 +00:00
<title>Example of template the Obfuscating an email address</title>
2004-03-18 17:16:23 +00:00
<programlisting>
<![CDATA[
2006-03-27 23:56:45 +00:00
<div id="contact">Send inquiries to
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
</div>
2004-03-18 17:16:23 +00:00
]]>
</programlisting>
</example>
<note>
<title>Technical Note</title>
<para>
This method isn't 100% foolproof. A spammer could conceivably program his
2006-09-27 04:32:52 +00:00
e-mail collector to decode these values, but not likely....
hopefully..yet ... wheres that quantum computer :-?.
2004-03-18 17:16:23 +00:00
</para>
</note>
2005-05-21 12:41:15 +00:00
<para>
2006-09-27 04:32:52 +00:00
See also
<link linkend="language.modifier.escape"><varname>escape</varname></link>
modifier and
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
2005-05-21 12:41:15 +00:00
</para>
2004-03-18 17:16:23 +00:00
</sect1>
2005-05-21 12:41:15 +00:00
</chapter>
2004-03-18 17:16:23 +00:00
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->