序言
理念
Smarty的设计主要由这些理念的驱动:
干净地分离显示逻辑和程序代码
PHP后端,Smarty模板前端
增强PHP, 而不是取代它
程序员和设计师的快速开发/部署
快速和简单的维护
语法简单易懂,无须懂PHP
灵活的自定义开发
安全: 隔离于PHP
免费, 开源
Smarty是什么?
Smarty是一个PHP的模板引擎,提供让程序逻辑与页面显示(HTML/CSS)代码分离的功能。 也就是PHP代码是程序逻辑,与页面显示分开。
两种观点
当PHP出现了模板引擎时,就有了两种观点: 第一种观点是:“PHP本身就是模板引擎”。主张在HTML中内使用简单的PHP代码。 虽然从纯代码运行观点来看,这种主张是速度最快的,但有很大的争议就是内嵌的PHP代码会 使得HTML凌乱并且非常复杂。
另一种观点是页面显示应该是没有程序代码的,转而用简单的标签来显示内容。 这中主张在别的模板引擎(甚至是其他编程语言)是很常见的,而且也是Smarty的观点。 这种方式可以让模板只专注于页面显示,避免混合了程序逻辑代码,更方便管理。
PHP与模板分离的重要性
两个主要是好处:
语法:模板语法通常是更符合HTML标记的语义。PHP语法可以在程序代码中运作的很好, 但如何混合在HTML中就不然。Smarty简单的{标签}语法是为了表达显示逻辑而设计的。 Smarty让你的模板更专注于页面显示,而不用关注太多“代码”。 这可以让模板开发得更快速,维护更容易。 学习Smarty的语法不需要懂得PHP的相关知识,程序员或非程序员都能很快上手。
松耦合:当PHP代码混合在模板中,那将无法约束任意的逻辑代码被写到模板上。 Smarty分隔了模板和PHP,控制了页面显示和业务逻辑的分离。 Smarty还有安全特性,可以令模板源码有强制的约束。
页面设计者和PHP
一个通常的问题是:“页面设计者既然要学一门语法,为什么不学PHP?”。当然页面设计者可以 学习PHP,而且他们可能已经非常熟悉PHP。问题并非是他们是否有能力学习PHP,问题在于HTML混合PHP的情况,如果设计者使用PHP,那么就很容易会将一些不属于模板的PHP代码写到模板上。 (正如当他们只需要一把小刀但你塞给他们一把瑞士军刀一样)。 你可以教导他们程序设计的规则,但这可能是他们不真正需要学习的事情(他们不是开发者)。 而且PHP手册也是非常繁多难以筛选出你需要的部分进行教导, 就像你给了车子的买主一本汽车工厂里面的装配手册,而不是汽车的操作手册一样。 Smarty恰到好处地给予了设计者需要的工具,而提供了开发者更好地控制这些工具的方法。 这种简单的标签语法也是非常受到设计者的欢迎,帮助了设计者流水式地组织管理模板。
实践很重要
虽然Smarty提供了让你清晰分离显示逻辑和程序代码的工具,但也留下了不少空间可违反这些规则。一个失败的实践(如将纯PHP代码写到模板中)将导致比显示逻辑分离更多的问题。本手册可以很好地告诉你哪些事情需要关注的。同时也可以参考Smarty网站上最佳实践的文章。
Smarty是怎么工作的?
在底层,Smarty“编译”(简单地复制和转换)模板为PHP代码。这在每个模板第一次调用时发生,然后编译后的代码将被一直使用。Smarty处理地非常的好,所以模板设计师仅编辑模板而不需要关注编译的事情。这方法保持了模板的易维护,同时也保证了运行时是PHP代码的方式运行,这样PHP代码就可以通过类似APC等OP-CODE缓存器来加速了。
模板继承
模板继承是Smarty 3的新特性。在模板继承出现之前,我们将模板分为多片,如header和footer等模板。这种在每个模板内都引入header/footer的组织方式会导致许多问题,如递归跳转等。模板继承,就像维护单独的模板一样简单。我们可以设置一些内容块来进行继承,这样更直观、有效和容易被管理。更多详情请参考模板继承的章节。
为什么不使用 XML/XSLT 语法?
有许多好的理由。首先,Smarty不仅可以用在XML/HTML模板中,还可以做更多,如生成电邮、javascript、CSV和PDF文档等。 其次,XML/XSLT语法比起PHP代码还要更冗长和脆弱!它适合给计算机看,但对人类非常不友好。 Smarty是希望模板能非常容易阅读、理解和维护的。
模板安全
虽然Smarty已经隔离了PHP代码,但如果你愿意,你还可以有相当多的方法来使用它。 模板安全机制提供了严格的隔离方式。在你将模板给第三方进行编辑,但又不希望他们使用全部的PHP功能时, 模板安全机制非常地有用。
整合
有时人们会把Smarty和一些MVC框架进行对比(Model-View-Controller 模型-视图-控制器)。 Smarty并非一个MVC,它仅是显示层,就是MVC中的V层(视图层)。 从这方面而言,Smarty可以很容易被整合到MVC中作为视图层。 许多非常著名的框架都整合了Smarty作为视图层,你可以在论坛或者文档中找到一些相关的内容。
其他的模板引擎
Smarty并非唯一的,遵循"分离显示逻辑和程序代码"的引擎。 举个例子,Python有这相同理念的模板引擎,如 Django Templates 和 CheetahTemplate等。 说明: Python这种语言天生是不那么容易混杂在HTML中,因为其设计思路就是希望程序代码独立在显示之外的。 当然,也有一些Python库可以让Python混合到HTML中,但一般是不推荐的。
Smarty不是什么
Smarty不是一个应用开发框架。Smarty不是一个MVC。Smarty不像Zend Framework, CodeIgniter, PHPCake, 或者其他的PHP应用开发框架。
Smarty是一个模板引擎,在应用程序中,当作V层(视图层)的组件来使用。 Smarty可以很轻易连接到其他的视图引擎中。 和其他的软件技术一样,Smarty也有着学习曲线。 Smarty不一定保证良好的程序设计或者达成显示分离的目的,这还得需要开发者和模板设计师的努力。
Smarty适合我吗?
Smarty并非一个可以做任何事情的工具。重要的是如何去判断Smarty是否符合你的需要,下面是一些建议:
模板语法。 你的模板内容是否PHP代码和HTML的混合体? 你的模板设计师是否也适应用PHP开发? 你的模板设计师是否希望有一套标记型的语法来设计显示内容? 通过使用Smarty和PHP的经验可以回答这些问题。
业务状况。 是否有将模板和PHP代码分离的需求? 你是否有非可信的第三方来编辑模板,但你又不希望他们可以使用全部PHP的功能? 你是否需要通过程序控制哪些功能在模板是可用、和不可用? Smarty的设计可以满足以上的功能。
强大特性。 比起自行开发,Smarty的特性如缓存、模板继承和插件机制,是否更能节省开发时间? 你计划使用的基础库或者框架是否需要这样的显示组件?
PHP模板是个热门的话题,也存在很多意见的分歧。 重要的是你弄清楚Smarty,弄情况你的需求,来做一个适合你的选择。 欢迎在论坛或者IRC频道中提出问题讨论。
参见Smarty网站的“用例及工作流”章节。
使用Smarty的站点
每天都有成千上万的独立访客访问Smarty网站,大多数都是开发者在阅读手册。许多著名的PHP项目在使用Smarty,如XOOPS CMS, CMS Made Simple , Tiki CMS/Groupware 和 X-Cart 等等。
总结
无论你使用Smarty来制作一个小网站,或者是大型的商业系统,它都能很好地适合你的需要。 这里是一些选择Smarty的优势:
分离PHP代码和HTML/CSS显示
良好的组织和管理
第三方模板访问安全机制
全功能,易于扩展
众多用户使用,Smarty一直在发展
LGPL 许可,可商业使用
100% 免费, 开源的项目