Smarty模板引擎全教程

简介:
Smarty模板引擎全教程

前面已经介绍了在SpeedPHP框架中使用Smarty模板引擎的方法,下面我们来更详细地介绍Smarty的使用方法。

本章是对Smarty常用的一些功能进行了详述,让您在最短的时间内掌握Smarty模板的日常开发。如果您需要更深入的了解Smarty这个优秀的PHP模板引擎技术,请参考Smarty中文手册。

一、对模板赋值

将变量输入到模板

程序:

$this->hello = "Hello world";

模板:

<{$hello}>

输出:

Hello world

将数组输入到模板

程序:

$this->color = array('red' => '红色', 'yellow' => '黄色', 'green' => '绿色');

模板可以使用:

<{$color['red']}>

同时也可以:

<{$color.red>

输出:

红色

二、模板内部语法

if,elseif,else 条件判断

<{if $color == "red"}>

这是红色的。

<{elseif $color == "green" || $color == "white"}>

这是绿色或者白色的。

<{else}>

这不知道什么颜色

<{/if}>

Smarty中的if/else除了不使用括号外和PHP的if/else几乎是一样的。

include 包含文件

<{include file="header.html"}>

请注意include的包含是以'template_dir'的设置为根目录的,而且并不存在相对目录。所以比如我们的footer.html在"模板目录/main/footer.html",我们将使用

<{include file="main/footer.html"}>

来进行包含。

在Smarty中还有include_php,和include一样,只是include_php包含的是可执行的PHP文件。同时,如果使用include_php函数,将可能涉及到Smarty的安全特性,这和{php}语法也是有关的。详细请参考Smarty中文手册。

当然,在基于Smarty的模板开发中,我们原则上不建议在模板内使用PHP的功能。

foreach,foreachelse

和PHP的foreach一样,循环处理数组。

例:$this->color = array('red' => '红色', 'yellow' => '黄色', 'green' => '绿色');

<{foreach item=colorname from=$color key=enname}>

<{$enname}>: <{$colornam}><br>

<{/foreach}>

将输出:

red:红色

yellow:黄色

green:绿色

多维数组也是同样处理,请留意以下的多维数组:

例:

$students = 

   array(

      'name' => 'He Qing',

      'age' => 17,

      'score' => array(

         'math' => 76,

        'english' => 92,

         'PE' => 72

      ),

   ),

   array(

      'name' => 'Lee Wen',

      'age' => 18,

      'score' => array(

         'math' => 69,

        'english' => 80,

         'PE' => 79

      ),

   ),

);

$this->students = $students ;

模板:

学生成绩:<br>

<{foreach item=person from=$students}>

姓名:<{$person.name}><br>

年龄:<{$person.age}><br>

分数:

<{foreach item=num key=subject from=$person.score}>

<{$subject}>:<{$num}><br>

<br><br>

<{/foreach}>

<{foreachelse}>

暂无学生数据!

<{/foreach}>

foreachelse是在变量未赋值的时候将显示。

和foreach差不多的还有section,详细请参考Smarty中文手册。

literal

literal主要用于显示有可能包含大括号等字符信息的 javascript 脚本. 当这些javascript 脚本处于 {literal}{/literal} 标签中时,模板引擎将不分析它们,而直接显示。

有时候我们在使用Smarty模板时,会遇到程序正常却仅输出空白页面;这时我们可以检查一下,是否该模板中包含了javascript脚本。在这些javascript外边加上literal就不会有问题了。

<{literal}>

<script language=javascript>

  <!--

  function isblank(field) {

  if (field.value == '') 

  { return false; }

  else

  {

  document.loginform.submit();

  return true;

  }

  }

  // -->

</script>

<{/literal}>

literal和下面介绍的strip虽然在一般的Smarty教程中很少有介绍,但的确literal和strip对日常的开发是非常有帮助的,尤其是strip。

strip

Smarty将清除{strip} ... {/strip}之间的全部空格以及回车。

建议马上在您的模板中使用strip标签,根据实际开发的估计,一般的页面在使用了strip标签几乎可以减少四分之一的html文件大小,尤其在内容特别多的页面(比如首页)在网页的打开速度和显示速度上面有着明显的提高。

例子:

{strip}

<table border=0>

<tr>

<td>

<A HREF="{$url}">

<font color="red">This is a test</font>

</A>

</td>

</tr>

</table>

{/strip}

显示:

<table border=0><tr><td><A HREF="http://my.domain.com">

<font color="red">This is a test</font></A></td></tr></table>

三、SpeedPHP框架在Smarty模板中的函数

在模板中,除了可以使用Smarty本身自带的函数外,sp框架还提供了一些常用的函数,下面我们里了解一下:

spUrl

和输出spUrl()函数结果一样,显示一个URL地址

比如:

程序中:echo spUrl('article', 'list', array('page'=>3, 'pageSize' => 10)); // 显示文章列表的第三页

在模板中使用就是:

<{spUrl c='article' a='list' page=3 pageSize=10}>

T

和输出 T()函数的结果一样,显示多语言情况下的翻译结果

比如:

程序中:echo T("welcome"); // 显示在特定语言下的欢迎信息

在模板中则是:

<{T w='welcome'}>

四、HTML相关函数

Smarty提供了一系列的HTML代码生成函数。以下例子均出自Smarty手册,详细说明请参考Smarty中文手册。

html_checkboxes

生成多个多选框
程序:
$this->cust_checkboxes = array(
            1000 => 'Joe Schmoe',
            1001 => 'Jack Smith',
            1002 => 'Jane Johnson',
            1003 => 'Charlie Brown'
);
$this->customer_id' = 1001;
模板:
<{html_checkboxes name="id" options=$cust_checkboxes checked=$customer_id separator="<br />"}>
输出:
<label><input type="checkbox" name="checkbox[]" value="1000" />Joe Schmoe</label><br />
<label><input type="checkbox" name="checkbox[]" value="1001" checked="checked" />Jack Smith</label><br />
<label><input type="checkbox" name="checkbox[]" value="1002" />Jane Johnson</label><br />
<label><input type="checkbox" name="checkbox[]" value="1003" />Charlie Brown</label><br />

html_image 

生成图片img标签,html_image将自动获取图片长宽。
模板:
<{html_image file="pumpkin.jpg"}>
输出:
<img src="pumpkin.jpg" alt="" border="0" width="44" height="68" />

html_options 

生成多个下拉框选项组,需要自行加上<select>
程序:
$this->cust_options= array(
            1000 => 'Joe Schmoe',
            1001 => 'Jack Smith',
            1002 => 'Jane Johnson',
            1003 => 'Charlie Brown'
);
$this->customer_id' = 1001;
模板:
<select name=customer_id>
    <{html_options options=$cust_options selected=$customer_id}>
</select>
输出:
<select name=customer_id>
    <option value="1000">Joe Schmoe</option>
    <option value="1001" selected="selected">Jack Smith</option>
    <option value="1002">Jane Johnson</option>
    <option value="1003">Charlie Brown</option>
</select>

html_radios 

生成多个单选框
程序:
$this->cust_radios = array(
            1000 => 'Joe Schmoe',
            1001 => 'Jack Smith',
            1002 => 'Jane Johnson',
            1003 => 'Charlie Brown'
);
$this->customer_id' = 1001;
模板:
<{html_radios name="id" options=$cust_radios checked=$customer_id separator="<br />"}>
输出:
<input type="radio" name="id[]" value="1000">Joe Schmoe<br />
<input type="radio" name="id[]" value="1001" checked="checked"><br />
<input type="radio" name="id[]" value="1002">Jane Johnson<br />
<input type="radio" name="id[]" value="1003">Charlie Brown<br />

html_select_date 

生成年月日下拉框
模板:
{html_select_date month_format="%m" field_order="YMD" start_year="1950" }

html_select_time 生成时分秒下拉框
{html_select_time use_24_hours=true}

html_table 

生成一个表格
程序:
$this->data = array(1,2,3,4,5,6,7,8,9);
模板:
{html_table loop=$data cols=4 }
输出:
<table border="1">
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
<tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
<tr><td>9</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</table>

五、对模板变量的修饰

针对输入到模板的变量,有时候我们需要进行一些转换修饰,比如对网址进行URL编码等。下面我们将介绍几个常用的变量修饰器(Modifiers)

default

默认值
在变量为空或未赋值的时候,将由默认值替代输出。
例:<{$user_name|default:'游客'}>,如果$user_name并未赋值,则输出“游客”。

escape 

对字符串进行编码,常用的编码方式:有html(进行HTML转码)url(进行URL转码)javascript(javascript转码)等
例:$this->url = "http://www.163.com";
模板:<{$url|escape:"url"}>
输出:http%3A%2F%2Fwww.163.com

lower 小写 upper 大写

对字符串进行小写或大写的转换
例:$this->hello = "Hello World!";
模板:
<{$hello|lower}>  
将输出 hello world!
<{$hello|upper}>  
将输出 HELLO WORLD!

replace

替换,与str_replace效果相同
例:$this->num = "101010101010101";
模板:<{$num|replace:"1":"0"}>  // 1被替换成了0
输出:111111111111111

strip_tags

去除HTML标签,也就是去除<>中间的字符串
例:$this->myword = "<b>hi</b>, <font color=red>this is red font.</font>";
模板:<{$myword|strip_tags}>
输出:hi,this is red font.

在Smarty手册中,我们还可以看到一些计算字符串长度和截取字符串的变量修饰器,可是在使用汉字的情况下,目前这些变量修饰器却不能正常的使用。这个情况我们可以使用sp框架的spAddViewFunction函数功能,将能够计算汉字的函数和正确截取汉字的函数注册到模板之中,使得这些函数可以像Smarty内置函数一样使用。这样一方面可以令您的应用程序功能更加强大,另一方面也符合了Smarty的设计理念,不破坏模板引擎的功能最小化原则。

当然,上面讲述的SpeedPHP框架在Smarty模板中的函数T与spUrl,也都是通过spAddViewFunction方式注册到模板引擎中的。

在日常开发中,我们将经常需要对输入到模板的变量进行调试,所以可以开启Smarty的调试功能进行调试。详细介绍可以参考《自动页面输出以及视图高级功能》。

本文转自博客园知识天地的博客,原文链接:Smarty模板引擎全教程,如需转载请自行联系原博主。

相关文章
|
5天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
409 125
|
7天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
698 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
5天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
408 123
|
3天前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
303 108
|
4天前
|
存储 人工智能 数据可视化
别再手动复制 Skill 了:多 Agent 时代的 Skill 管理方案
多 Agent 场景下 Skill 的统一管理与同步。
245 125
|
18天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
11天前
|
缓存 人工智能 运维
GLM 5.2自托管全流程实战:硬件选型、vLLM/SGLang部署与成本盈亏测算
2026年智谱发布GLM 5.2超大混合专家模型,区别于以往仅开放API的闭源大模型,该模型权重以MIT开源协议对外发布,企业与开发者可完整下载、本地审计、私有化部署,实现数据不出环境、自定义微调、自主调度推理资源。GLM 5.2拥有753B总参数,原生支持百万级上下文窗口,在代码生成、长文档推理、数学逻辑等多项基准测试中对标国际顶尖商用模型,是首款可完整自托管的前沿代码向大模型。
914 0
|
13天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)