《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进行服务端开发的必不可少的一项技能。

相关文章
|
6天前
|
XML 存储 Java
探索安卓开发之旅:从基础到进阶
【9月更文挑战第37天】安卓开发,一个充满无限可能的领域。它不仅关乎技术的深度与广度,更关乎开发者的成长与突破。本文将带你走进安卓开发的世界,从基础知识的学习到进阶技巧的掌握,一起感受编程的魅力与乐趣。
|
4天前
|
移动开发 监控 Android开发
Android & iOS 使用 ARMS 用户体验监控(RUM)的最佳实践
本文主要介绍了 ARMS 用户体验监控的基本功能特性,并介绍了在几种常见场景下的最佳实践。
ly~
|
17天前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
56 6
|
16天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
19天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
|
3天前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
19 4
Android开发表情emoji功能开发
|
1天前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
11 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
2天前
|
缓存 安全 PHP
PHP 7新特性及其最佳实践
【10月更文挑战第2天】本文将深入探讨PHP 7带来的创新特性,以及如何运用这些特性优化代码和提升性能。我们将从类型声明、空值合并运算符等新语法出发,通过实际代码示例,展示如何高效利用PHP 7的新特性进行开发。文章还将分享一系列最佳实践,帮助你写出更安全、更快速的PHP代码。无论你是PHP新手还是资深开发者,这篇文章都将为你提供有价值的见解和技巧。
15 5
|
3天前
|
JSON API Android开发
探索安卓开发之旅:打造你的第一个天气应用
在这篇文章中,我们将一起踏上一段激动人心的旅程,学习如何在安卓平台上开发一个简单的天气应用。通过实际操作和代码示例,我们将逐步构建一个能够显示当前位置天气情况的应用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供清晰的指导和启发性的见解,帮助你理解和掌握安卓开发的基础知识。让我们一起探索代码的世界,解锁新技能,实现你的创意和梦想。
|
3天前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
16 3