333 lines
8.8 KiB
Markdown
333 lines
8.8 KiB
Markdown
Tips & Tricks {#tips}
|
|
=============
|
|
|
|
Blank Variable Handling {#tips.blank.var.handling}
|
|
=======================
|
|
|
|
There may be times when you want to print a default value for an empty
|
|
variable instead of printing nothing, such as printing ` ` so that
|
|
html table backgrounds work properly. Many would use an
|
|
[`{if}`](#language.function.if) statement to handle this, but there is a
|
|
shorthand way with Smarty, using the
|
|
[`default`](#language.modifier.default) variable modifier.
|
|
|
|
> **Note**
|
|
>
|
|
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
|
> PHP\'s [`error_reporting()`](&url.php-manual;error_reporting) level or
|
|
> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
|
|
> a variable had not been assigned to Smarty.
|
|
|
|
|
|
{* the long way *}
|
|
{if $title eq ''}
|
|
|
|
{else}
|
|
{$title}
|
|
{/if}
|
|
|
|
{* the short way *}
|
|
{$title|default:' '}
|
|
|
|
|
|
|
|
See also [`default`](#language.modifier.default) modifier and [default
|
|
variable handling](#tips.default.var.handling).
|
|
|
|
Default Variable Handling {#tips.default.var.handling}
|
|
=========================
|
|
|
|
If a variable is used frequently throughout your templates, applying the
|
|
[`default`](#language.modifier.default) modifier every time it is
|
|
mentioned can get a bit ugly. You can remedy this by assigning the
|
|
variable its default value with the
|
|
[`{assign}`](#language.function.assign) function.
|
|
|
|
|
|
{* do this somewhere at the top of your template *}
|
|
{assign var='title' value=$title|default:'no title'}
|
|
|
|
{* if $title was empty, it now contains the value "no title" when you use it *}
|
|
{$title}
|
|
|
|
|
|
|
|
See also [`default`](#language.modifier.default) modifier and [blank
|
|
variable handling](#tips.blank.var.handling).
|
|
|
|
Passing variable title to header template {#tips.passing.vars}
|
|
=========================================
|
|
|
|
When the majority of your templates use the same headers and footers, it
|
|
is common to split those out into their own templates and
|
|
[`{include}`](#language.function.include) them. But what if the header
|
|
needs to have a different title, depending on what page you are coming
|
|
from? You can pass the title to the header as an
|
|
[attribute](#language.syntax.attributes) when it is included.
|
|
|
|
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
|
|
is passed to the `header.tpl`, and will subsequently be used as the
|
|
title.
|
|
|
|
|
|
{include file='header.tpl' title='Main Page'}
|
|
{* template body goes here *}
|
|
{include file='footer.tpl'}
|
|
|
|
|
|
|
|
`archives.tpl` - When the archives page is drawn, the title will be
|
|
"Archives". Notice in the archive example, we are using a variable from
|
|
the `archives_page.conf` file instead of a hard coded variable.
|
|
|
|
|
|
{config_load file='archive_page.conf'}
|
|
|
|
{include file='header.tpl' title=#archivePageTitle#}
|
|
{* template body goes here *}
|
|
{include file='footer.tpl'}
|
|
|
|
|
|
|
|
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
|
|
variable is not set, using the [`default`](#language.modifier.default)
|
|
variable modifier.
|
|
|
|
|
|
<html>
|
|
<head>
|
|
<title>{$title|default:'Smarty News'}</title>
|
|
</head>
|
|
<body>
|
|
|
|
|
|
|
|
`footer.tpl`
|
|
|
|
|
|
</body>
|
|
</html>
|
|
|
|
|
|
|
|
Dates {#tips.dates}
|
|
=====
|
|
|
|
As a rule of thumb, always pass dates to Smarty as
|
|
[timestamps](&url.php-manual;time). This allows template designers to
|
|
use the [`date_format`](#language.modifier.date.format) modifier for
|
|
full control over date formatting, and also makes it easy to compare
|
|
dates if necessary.
|
|
|
|
|
|
{$startDate|date_format}
|
|
|
|
|
|
|
|
This will output:
|
|
|
|
|
|
Jan 4, 2009
|
|
|
|
|
|
|
|
|
|
{$startDate|date_format:"%Y/%m/%d"}
|
|
|
|
|
|
|
|
This will output:
|
|
|
|
|
|
2009/01/04
|
|
|
|
|
|
|
|
Dates can be compared in the template by timestamps with:
|
|
|
|
|
|
{if $order_date < $invoice_date}
|
|
...do something..
|
|
{/if}
|
|
|
|
|
|
|
|
When using [`{html_select_date}`](#language.function.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.
|
|
|
|
|
|
<?php
|
|
|
|
// 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);
|
|
}
|
|
?>
|
|
|
|
|
|
|
|
See also [`{html_select_date}`](#language.function.html.select.date),
|
|
[`{html_select_time}`](#language.function.html.select.time),
|
|
[`date_format`](#language.modifier.date.format) and
|
|
[`$smarty.now`](#language.variables.smarty.now),
|
|
|
|
WAP/WML {#tips.wap}
|
|
=======
|
|
|
|
WAP/WML templates require a php [Content-Type
|
|
header](&url.php-manual;header) to be passed along with the template.
|
|
The easist way to do this would be to write a custom function that
|
|
prints the header. If you are using [caching](#caching), that won\'t
|
|
work so we\'ll do it using the [`{insert}`](#language.function.insert)
|
|
tag; remember `{insert}` tags are not cached! Be sure that there is
|
|
nothing output to the browser before the template, or else the header
|
|
may fail.
|
|
|
|
|
|
<?php
|
|
|
|
// be sure apache is configure for the .wml extensions!
|
|
// put this function somewhere in your application, or in Smarty.addons.php
|
|
function insert_header($params)
|
|
{
|
|
// this function expects $content argument
|
|
if (empty($params['content'])) {
|
|
return;
|
|
}
|
|
header($params['content']);
|
|
return;
|
|
}
|
|
|
|
?>
|
|
|
|
|
|
|
|
your Smarty template *must* begin with the insert tag :
|
|
|
|
|
|
{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>
|
|
</wml>
|
|
|
|
|
|
|
|
Componentized Templates {#tips.componentized.templates}
|
|
=======================
|
|
|
|
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
|
|
Smarty object, [`assign()`](#api.assign) the variables and
|
|
[`display()`](#api.display) the template. So lets 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?
|
|
|
|
You can do this by writing a custom plugin for fetching the content and
|
|
assigning it to a template variable.
|
|
|
|
`function.load_ticker.php` - drop file in
|
|
[`$plugins directory`](#variable.plugins.dir)
|
|
|
|
|
|
<?php
|
|
|
|
// setup our function for fetching stock data
|
|
function fetch_ticker($symbol)
|
|
{
|
|
// put logic here that fetches $ticker_info
|
|
// from some ticker resource
|
|
return $ticker_info;
|
|
}
|
|
|
|
function smarty_function_load_ticker($params, $smarty)
|
|
{
|
|
// call the function
|
|
$ticker_info = fetch_ticker($params['symbol']);
|
|
|
|
// assign template variable
|
|
$smarty->assign($params['assign'], $ticker_info);
|
|
}
|
|
?>
|
|
|
|
|
|
|
|
`index.tpl`
|
|
|
|
|
|
{load_ticker symbol='SMARTY' assign='ticker'}
|
|
|
|
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
|
|
|
|
|
|
|
See also [`{include_php}`](#language.function.include.php),
|
|
[`{include}`](#language.function.include) and
|
|
[`{php}`](#language.function.php).
|
|
|
|
Obfuscating E-mail Addresses {#tips.obfuscating.email}
|
|
============================
|
|
|
|
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
|
|
scrambled javascript in the HTML source, yet it it will look and work
|
|
correctly in the browser. This is done with the
|
|
[`{mailto}`](#language.function.mailto) plugin.
|
|
|
|
|
|
<div id="contact">Send inquiries to
|
|
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
|
</div>
|
|
|
|
|
|
|
|
> **Note**
|
|
>
|
|
> This method isn\'t 100% foolproof. A spammer could conceivably program
|
|
> his e-mail collector to decode these values, but not likely\....
|
|
> hopefully..yet \... wheres that quantum computer :-?.
|
|
|
|
See also [`escape`](#language.modifier.escape) modifier and
|
|
[`{mailto}`](#language.function.mailto).
|