《Android和PHP开发最佳实践 》一3.5 认识Smarty模板引擎

简介: 本节书摘来自华章出版社《Android和PHP开发最佳实践 》一书中的第3章,第3.5节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.5 认识Smarty模板引擎

如果你说学过PHP而没学过Smarty模板引擎,我相信所有的面试官都会觉得你在撒谎。虽然PHP语言本身就可以嵌入到HTML页面中去进行数据展现,但是这样做我们不仅需要书写大量的<?php ?>标签,而且在某些地方还需要嵌入大量的冗余代码,另外也不利于逻辑的解耦和分离。所以,在项目中我们还是需要一个专门的模板引擎,而Smarty就是PHP语言在这个领域的不二选择了。
目前,最新的Smarty版本已经出到3.x,应该说与2.x版本相比做了很大的改进,接下来简单介绍一下Smarty的使用。实际上,Smarty的下载包中本来就包含了一些实例代码。首先,从官方下载地址(http://www.smarty.net/download)下载最新的稳定的开发包版本(Latest Stable Release),我们在这里使用的是Smarty 3.1.5版本,该版本必须运行于PHP 5.2以上的版本中。
解压之后,我们把Smarty-3.1.5重新命名为smarty并放入我们前面配置好的站点目录,然后在浏览器中打开demo地址(http://php-demo/smarty/demo/),打开的界面如图3-15所示。

image

小贴士:如果你找不到站点目录,请返回查看3.2.3节中Apache配置虚拟主机的部分内容。
以上这个界面就是由Smarty模板引擎渲染出来的页面,其对应的PHP文件的代码,见代码清单3-15,已添加注释,方便读者阅读。
代码清单 3-15

<?php
// 包含 Smarty 类库
require('.../libs/Smarty.class.php');
// 初始化 Smarty 对象
$smarty = new Smarty;
// 初始化 Smarty 配置
//$smarty->force_compile = true;
$smarty->debugging = true;
$smarty->caching = true;
$smarty->cache_lifetime = 120;
// 各种变量赋值
$smarty->assign("Name","Fred Irving Johnathan Bradley Peppergill",true);
$smarty->assign("FirstName",array("John","Mary","James","Henry"));
$smarty->assign("LastName",array("Doe","Smith","Johnson","Case"));
$smarty->assign("Class",array(array("A","B","C","D"),array("E","F","G","H"),
array("I","J","K","L"),array("M","N","O","P")));
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" 
=> "3"),array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234")));
$smarty->assign("option_values", array("NY","NE","KS","IA","OK","TX"));
$smarty->assign("option_output", array("New York","Nebraska","Kansas","Iowa",
"Oklahoma","Texas"));
$smarty->assign("option_selected", "NE");
// 渲染相应模板
$smarty->display('index.tpl');
?>

从上面的代码我们可以很清晰地看到Smarty的一般使用过程:先初始化Smarty对象,然后配置Smarty参数,接着就是进行各种变量的赋值,最后在模板页面展现出来。对于本例,大家可以看看index.tpl中的模板写法,当然Smarty的用法还是很丰富的,想学好它,最好的老师就是官方文档了,请参考“http://www.smarty.net/docs/en/”。以下我们也简单介绍几种在开发时需要掌握的核心要点。

  1. 常用配置选项
    在使用Smarty模板引擎之前,我们必须先学习如何配置Smarty的选项。而在Smarty的常见选项中,我们首先必须了解4个最基本的目录选项。

模板目录(template):本目录用于存储模板文件,需要渲染对应文件时把文件相对地址作为参数传入display方法即可。比如,我们有一个模板文件地址位于template/test/index.tpl,那么我们则应当使用“$smarty->display('test/index.tpl');”语句来渲染该模板。
编译模板目录(template_c):本目录主要用于存储Smarty模板引擎产生的模板编译文件,Smarty也正是使用这种方法来提高执行效率的。当然,我们在部署项目时一定要注意该目录必须是可写的。
缓存目录(cache):Smarty允许把展示过的模板缓存起来,使用此功能将进一步提高模板引擎的运行速度。当然,我们还可以通过设置cache_lifetime属性来控制缓存文件的有效时间。
配置目录(configs):这个目录可以用于保存Smarty模板引擎的配置文件,不过在实际项目中使用得比较少,我们经常会把配置放入项目统一的配置目录。
在实际项目中我们经常使用继承和重载的方式来定制和配置我们自己的Smarty模板类。比如,在代码清单3-16中,我们就实现了一个自定义的My_Smarty类,此类中设置了Smarty模板的必要目录和缓存的生效时间。
代码清单 3-16

<?php
// 包含 Smarty 类库
require 'Smarty.class.php';

// 定义自己的模板类
class My_Smarty extends Smarty 
{
    function __construct()
    {
        // 重载 Smarty 基类
        parent::__construct();
        // 配置目录
        $this->setTemplateDir('/path/to/templates/');
        $this->setCompileDir('/path/to/templates_c/');
        $this->setConfigDir('/path/to/configs/');
        $this->setCacheDir('/path/to/cache/');
        // 配置缓存
        $this->caching = true;
        $this->cache_lifetime = 60;
        // 设置默认变量
        $this->assign('app_name', 'My App');
    }
}
?>

在上述代码中,setTemplateDir方法用于设置模板目录,setCompileDir方法用于设置编译过的中间模板目录,setConfigDir和setCacheDir方法分别用于设置Smarty模板的配置文件和缓存文件的目录。

  1. 常用模板语法
    Smarty 3.0中的语法实际上和PHP的语法已经比较接近了,使用起来相当方便。接下来让我们来熟悉一下Smarty模板语言的基本用法。首先,我们要知道所有的Smarty的默认界限符号是大括号(当然这个也是可以设置的)。因此,我们可以通过类似于“{$var}”的写法来获取Smarty变量“var”的值。其次,Smarty中为我们提供了大量的字符串辅助标签,非常方便,例如,如果需要把某个变量的首字母大写,使用方法如代码清单3-17所示。

代码清单 3-17

{$articleTitle|capitalize}

另外,如果我们想把时间戳转化为需要的时间格式,使用方法如代码清单3-18所示。
代码清单 3-18

{$smarty.now|date_format}
{$smarty.now|date_format:"%Y-%m-%d"}

此外,我们还可以使用代码清单3-19中的类似方法来过滤非法字符,避免XSS(跨站攻击)的风险。
代码清单 3-19

{$articleTitle|escape:'html'}
{$articleTitle|escape:'htmlall'}

接下来,我们还会介绍一下在展示过程中最常用到的循环语句的写法。实际上在Smarty中有两种最常用到的循环语句写法,一种是“{section}”,另一种是“{foreach}”。现在假设我们需要循环一个散列数组列表“$userList”,散列数组中包含“id”和“name”两个字段,示例见代码清单3-20,大家可以好好理解一下。
代码清单 3-20

{* 注释:使用section标签循环 *}
{section name=user loop=$userList}
    ID : {$userList[user].id}
    NAME : {$userList[user].name}
{/section}

{* 注释:使用foreach标签循环 *}
{foreach $userList as $user}
    ID : {$user.id}
    NAME : {$user.name}
{/foreach}

从上面的代码中可以看出,Smarty 3.0的foreach用法已经和PHP的语法非常类似了,既容易理解又方便实用,推荐大家使用。另外,在Smarty中注释默认使用的是“{...}”标签,这个也需要大家了解一下。
由于篇幅限制,Smarty模板引擎的基本使用我们介绍到这里,关于其更多的信息请大家参考官方的文档并动手实践一下,毕竟Smarty模板也是使用PHP进行服务端开发的必不可少的一项技能。

相关文章
|
8天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
8天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
10天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
10天前
|
数据库连接 PHP 数据库
【PHP开发专栏】PHP错误处理与异常捕获
【4月更文挑战第30天】PHP是流行的服务器端脚本语言,广泛用于动态网站和应用开发。本文深入探讨PHP的错误处理和异常捕获机制,分为三部分:首先介绍PHP错误处理,包括错误级别(如E_NOTICE、E_WARNING、E_ERROR)和错误处理函数;其次,讲解异常捕获,利用try-catch处理程序错误,自定义异常类;最后,讨论两者在数据库操作、文件操作和网络请求等场景的应用及最佳实践。示例代码展示了如何自定义错误处理器和异常处理。
|
1天前
|
PHP Android开发
android通过http上传文件,服务器端用php写(原创)
android通过http上传文件,服务器端用php写(原创)
|
2天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
8 0
|
3天前
|
Android开发 Kotlin
Kotlin开发Android之基础问题记录
Kotlin开发Android之基础问题记录
15 1
|
3天前
|
Java Android开发
Android开发@IntDef完美替代Enum
Android开发@IntDef完美替代Enum
12 0
|
4天前
|
Android开发
Android 盒子开发过程中遇到的问题及解决方法
Android 盒子开发过程中遇到的问题及解决方法
8 2
|
4天前
|
监控 安全 PHP
采用PHP开发的不良事件管理系统源码vue2+element医院不良事件上报系统的意义 AEMS系统源码
不良事件管理系统(AEMS)是一种用于医疗行业的解决方案,它主要用于处理和管理临床不良事件。这些不良事件是指由医疗导致的伤害,与疾病的自然转归相反,可能延长病人的住院时间或导致残疾。AEMS的目标是揭示系统的不足与缺陷,减少不良事件对病人、家属、医护人员和医院声誉的影响。
19 1