What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
理念
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% 免费, 开源的项目