Smarty 图标

您可以根据商标声明使用 Smarty 标志。

Smarty Template Engine Smarty Template Engine

有关赞助、广告、新闻或其他咨询,请通过联系方式联系我们

使用 Smarty 的网站

广告

什么是 Smarty?

Smarty 是用于 PHP 的模板引擎,有助于将展示(HTML/CSS)从应用逻辑中分离出来。这意味着PHP 代码就是应用逻辑,并且与展示分离。

理念

Smarty 设计很大程度上受到这些目标的推动

  • 将展示与应用代码彻底分离
  • PHP 后端,Smarty 模板前端
  • 补充 PHP,而不是取代它
  • 快速开发/部署,面向程序员和设计人员
  • 快速且易于维护
  • 语法易于理解,无需掌握 PHP 知识
  • 针对定制开发的灵活性
  • 安全性:从 PHP 中隔离
  • 免费、开放源代码

模板:两派思想

在 PHP 模板方面,基本上有两派思想。第一派声称“PHP 就是一个模板引擎”。这一方法简单地将 PHP 代码与 HTML 混合。虽然从纯脚本执行的角度来看,这种方法速度很快,但许多人认为,当 PHP 语法与展示混合时,就会变得混乱且难以维护。PHP 非常适合用于编程,但不太适合用于模板。

第二派声称,展示应避免任何编程代码,而应使用简单的标签来指示应用内容的显示位置。这一方法常见于其他模板引擎(和其他编程语言),也是 Smarty 所采用的方法。其理念是让模板完全专注于展示,不包含应用代码,并且尽可能少地增加开销。

为什么将 PHP 与模板分离很重要?

将 PHP 代码与模板分离有很多好处,其中包括:

  • 语法:模板通常包含语义标记,如 HTML。PHP 语法虽然适用于应用代码,但在与 HTML 混合时会迅速退化。Smarty 的简单{tag} 语法专门设计用于表达展示。Smarty 让您的模板专注于展示,而不是“代码”。这有助于更快地部署模板并简化维护。Smarty 语法无需掌握 PHP 知识,对程序员和非程序员而言都很直观。
  • 功能:模板引擎具有许多展示功能,否则这些功能需要在您自己的应用代码中进行开发、测试和维护。标签还会掩盖 PHP 语句的复杂性。例如

    PHP

    <?php echo strtolower(htmlspecialchars($title,ENT_QUOTES,UTF-8)); ?>

    Smarty

    {$title|escape|lower}
    Smarty 和 PHP 之间存在着抽象层,两者很不一样,Smarty 是通过 PHP 来简化模板维护的一个抽象层。
  • 沙盒:当 PHP 与模板混合时,可以将任何类型的逻辑注入到该模板中,而且没有任何限制。Smarty 将模板与 PHP 隔离起来,以受控的方式将展示逻辑与业务逻辑分离。Smarty 还具有安全功能,能够进一步对模板实施细粒度限制。
  • 可移植性:由于 Smarty 模板与语言无关,因此可以使用不同的编译器轻松地将其编译为其他语言(如 javascript),并且熟悉的语法也可以移植到其他编程语言当中。

有关 PHP 与 Smarty 语法比较的信息,请参见 语法比较

Web 设计师和 PHP

一个常见问题:“Web 设计师反正都需要学习一种语法,为什么不学习 PHP?”当然,Web 设计师可以学习 PHP,并且他们可能已经熟悉该语言。问题不在于他们学习 PHP 的能力,而在于维护将 PHP 与 HTML 混合使用的代码。{tags} 比 PHP 语句更简单、更直观,而且更坚固。模板还会限制可以放入模板的内容。使用 PHP 时,可以很容易地在不属于该位置的模板中添加代码。虽然你可以让设计师掌握应用程序设计规则,但其实没有必要这样做(现在,他们已经是开发人员了!)。PHP 手册是编写给开发人员的。设计师只需要了解该手册的一小部分内容,并且手册并不能帮助他们更轻松地找到所需的知识。Smarty 为 Web 设计师提供他们所需的工具,并且让开发人员能够仔细控制这些工具。还提供多种展示功能,如模板继承,这能够最大程度地提高模板的重用率,同时简化组织。

实施很重要

虽然 Smarty 提供了将展示从应用程序代码中彻底分离的工具,但是它也提供了很多打破这些规则的空间。实现不当(例如,在模板中注入 PHP),将导致比展示分离本来要解决的问题更多。该文档很好地指出了需要预防的事情。另外,还可以参见 最佳做法 部分。

Smarty 看起来像什么,我应该如何使用它?

速成教程 部分很好地概述了通常如何将 Smarty 实施到 PHP 应用程序中。

它如何运作?

在幕后,Smarty 会将模板的副本编译成 PHP 脚本。这样,您可以同时获得模板标记语法的优势和 PHP 的速度。编译发生在首次调用每个模板时,然后会从此点开始使用编译版本。Smarty 会为您执行此操作,所以模板设计人员只需编辑 Smarty 模板,而无需管理已编译版本。此方法令模板易于维护并令执行时间保持极快。由于已编译版本是 PHP,APC 或 ZendCache 等 op 代码加速器将继续对已编译脚本发挥作用。

模板继承

模板继承是 Smarty 3 的新功能,也是众多出色新功能之一。在模板继承之前,我们将模板分段管理,例如页眉和页脚模板。这种组织方式会带来很多需要费一番周折才能解决的问题,例如按页面方式管理页眉/页脚中的内容。使用模板继承时,我们会将模板保留为单个页面,而不再包含其他模板。然后,我们可以通过继承在模板中操作内容块。这使得模板直观、高效且易于管理。有关更多信息,请参见 模板继承

为什么不使用 XML/XSLT 语法?

有两个很好的理由。首先,Smarty 不仅仅可用于基于 XML/HTML 的模板,例如生成电子邮件、javascript、CSV 和 PDF 文档。其次,XML/XSLT 语法比 PHP 代码更冗长且更脆弱!它非常适合计算机,但对人类来说却很糟糕。Smarty 的目标是易于阅读、理解和维护。

模板安全性

虽然 Smarty 可以保护您不受 PHP 侵害,但您仍可以选择在某些情况下使用它。模板安全性强制限制 PHP(和选择 Smarty 函数)。如果您有第三方编辑模板,并且不想向他们开放 PHP 或 Smarty 的全部功能,这将非常有用。

其他模板引擎

Smarty 并不是唯一遵循“分离编程代码与展示”理念的引擎。例如,Python 拥有围绕相同原理构建的模板引擎,如 Django 模板CheetahTemplate注意:Python 等语言不会与 HTML 本机混合,这给了它们从一开始就正确分离编程代码的优势。虽然有可用于将 Python 与 HTML 混合的库,但通常不会采用它们。

Smarty 不是什么

Smarty 不是应用程序开发框架。Smarty 不是 MVC。Smarty 不是 Zend FrameworkCodeIgniterCakePHP 或任何其他适用于 PHP 的应用程序开发框架的替代方案。

Smarty 是一款模板引擎,用作应用程序的(V)视图组件。Smarty 可以轻松地与上面作为视图组件列出的任何引擎相耦合。与任何其他软件一样,Smarty 也有一个学习曲线。Smarty 不能保证良好的应用程序设计或良好的表现分离,这仍然需要一个合格的开发者和网页设计师来解决。

Smarty 适合我吗?

Smarty 并不能作为每一项工作的工具。重要的是确定 Smarty 是否符合你的需求。有一些重要问题需要自问

模板语法。你是否满意将 PHP 标签与 HTML 混合使用?你的网页设计师是否熟悉 PHP?你的网页设计师是否更喜欢为表现而设计的基于标签的语法?同时使用 Smarty 和 PHP 的一些经验有助于回答这些问题。

业务案例:是否有必要隔离 PHP 的模板?是否有不信任方编辑你不想释放 PHP 功能的模板?是否需要以编程方式控制模板里允许和不允许的内容?Smarty 按照设计提供了这些功能。

特色集:Smarty 的功能,例如缓存、模板继承和插件架构,是否能够节省编写代码的开发周期,否则就需要这些代码?你计划使用的代码库或框架是否具有表现组件所需的功能?

另请参阅 Smarty 网站上的关于 使用案例和工作流 的部分。

使用 Smarty 的网站

每天有数万名独立访问者访问 Smarty 网站,其中大多数是阅读文档的开发者。许多著名的 PHP 项目都使用 Smarty,例如 XOOPS CMSCMS Made SimpleTiki CMS/Groupware,仅举几例。

总结

无论你将 Smarty 用于小型网站还是大型企业解决方案,它都可以满足你的需求。Smarty 拥有众多功能,使其成为一个不错的选择

  • 将 PHP 与 HTML/CSS 分离很有意义
  • 可读性用于组织和管理
  • 第三方模板访问的安全性
  • 完整的功能,并且可以轻松扩展以满足你自己的需求
  • 大量的用户群,Smarty 会继续存在
  • 用于商业用途的 LGPL 许可
  • 100% 免费使用,开源项目