技巧与窍门
空变量处理
可能有时候你希望为一个空变量打印一个默认值,而不是什么都不打印,比如打印 以使得 html 表格背景能正确工作。许多人会用 {if} 语句来处理这个问题,但是在 Smarty 中,你可以使用 default 变量修饰符来简化这个操作。
注意
如果一个变量没有被赋值给 Smarty,那么 "未定义的变量" 错误将会在 PHP 的
error_reporting()级别或 Smarty 的$error_reporting属性没有被禁用的情况下显示一个 E_NOTICE。
{* 长的方式 *}
{if $title eq ''}
{else}
{$title}
{/if}
{* 短的方式 *}
{$title|default:' '}
默认变量处理
如果一个变量在你的模板中频繁地被使用,每次提及它时都应用 default 修饰符可能会让代码看起来有点乱。你可以通过使用 {assign} 函数为变量赋予其默认值来解决这个问题。
{* 在你的模板的顶部的某个地方做这个 *}
{assign var='title' value=$title|default:'no title'}
{* 如果 $title 是空的,那么当你使用它时,它现在包含 "no title" 这个值 *}
{$title}
将变量标题传递给头部模板
当你的大部分模板都使用相同的头部和底部时,将这些分离出来成为它们自己的模板并使用 {include} 包含它们是很常见的。但是如果头部需要根据你来自哪个页面而有不同的标题怎么办?你可以在包含它时将标题作为 属性 传递给头部。
mainpage.tpl - 当主页面被绘制时,标题 "Main Page" 被传递给 header.tpl,并将随后被用作标题。
{include file='header.tpl' title='Main Page'}
{* 模板主体放在这里 *}
{include file='footer.tpl'}
archives.tpl - 当存档页面被绘制时,标题将会是 "Archives"。注意在存档示例中,我们使用的是来自 archives_page.conf 文件的变量,而不是硬编码的变量。
{config_load file='archive_page.conf'}
{include file='header.tpl' title=#archivePageTitle#}
{* 模板主体放在这里 *}
{include file='footer.tpl'}
header.tpl - 注意如果 $title 变量没有被设置,那么 "Smarty News" 将会被打印出来,这是通过使用 default 变量修饰符来实现的。
<html>
<head>
<title>{$title|default:'Smarty News'}</title>
</head>
<body>
footer.tpl
</body>
</html>
日期
作为一个经验法则,总是将日期作为 时间戳 传递给 Smarty。这允许模板设计者使用 date_format 修饰符来完全控制日期格式,并且也使得在必要时比较日期变得容易。
{$startDate|date_format}
这将输出:
Jan 4, 2009
{$startDate|date_format:"%Y/%m/%d"}
这将输出:
2009/01/04
在模板中,可以通过时间戳来比较日期:
{if $order_date < $invoice_date}
...do something..
{/if}
当在模板中使用 {html_select_date} 时,程序员可能会希望将表单的输出转换回时间戳格式。下面这个函数可以帮助你做到这一点。
<?php
// 这假设你的表单元素名为
// 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);
}
参见 {html_select_date},
{html_select_time},
date_format 和
$smarty.now,
组件化模板
传统的在你的应用中编程模板的方式如下:首先,在你的 PHP 应用中收集你的变量(可能是通过数据库查询)。然后,你实例化你的 Smarty 对象,使用 assign() 将变量赋值给模板并使用 display() 显示模板。所以让我们假设我们在模板中有一个股票行情。我们会在应用中收集股票数据,然后在模板中赋值这些变量并显示它。现在,如果你可以仅仅通过包含模板就可以将这个股票行情添加到任何应用,而不需要预先获取数据,那不是很好吗?
你可以通过编写一个自定义插件来获取内容并将其赋值给一个模板变量来实现这一点。
function.load_ticker.php - 将文件放在 $plugins directory
<?php
// 设置我们用于获取股票数据的函数
function fetch_ticker($symbol)
{
// 在这里放置获取 $ticker_info 的逻辑
// 从某个行情资源
return $ticker_info;
}
function smarty_function_load_ticker($params, $smarty)
{
// 调用函数
$ticker_info = fetch_ticker($params['symbol']);
// 赋值模板变量
$smarty->assign($params['assign'], $ticker_info);
}
index.tpl
{load_ticker symbol='SMARTY' assign='ticker'}
股票名称: {$ticker.name} 股票价格: {$ticker.price}
参见:{include}.
混淆电子邮件地址
你有没有想过你的电子邮件地址是如何进入那么多垃圾邮件列表的?垃圾邮件发送者收集电子邮件地址的一种方式就是从网页上。为了帮助解决这个问题,你可以使你的电子邮件地址在 HTML 源码中显示为混淆的 javascript,但是它在浏览器中看起来和工作起来都是正确的。这可以通过 {mailto} 插件来实现。
<div id="contact">发送查询至
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
</div>
注意
这种方法并不是 100% 防傻的。垃圾邮件发送者可以设想地编程他的电子邮件收集器来解码这些值,但是可能性不大……希望如此..还没有……那个量子计算机在哪里 :-?.