Smarty 是什么?
为何使用它?
用例和工作流程
语法对比
模板继承
最佳实践
速成教程
模板继承是一种管理模板的方法,类似于面向对象编程技术。与其传统使用 {include ...} 标记管理模板的部分,你可以将一个模板的内容继承到另一个模板中(如扩展一个类),并在其中更改内容块(如重写类的函数)。这可使模板管理保持在最小化的同时提高效率,因为每个模板只包含它所扩展的模板的差异。
挑战:假设我们正在创建一个 HTML 页面,它需要在文档的 <head></head> 中加载一些自定义 Javascript/CSS 文件。问题是这是在 header.tpl 中定义的,它包含在页面的上方。有许多可解决此问题的方法,但这些方法可能会非常凌乱。让我们使用 Smarty 3 的新功能“模板继承”使这项任务变得简单。
在使用模板继承之前,我们只能使用 {include ...} 标记共享诸如页眉和页脚之类的内容。下面是一个示例
<html> <head> <title>{$title|default:"Default Page Title"}</title> </head> <body>
</body> </html>
{include file="header.tpl" title="My Page Title"} My HTML Page Body goes here {include file="footer.tpl"}
<html> <head> <title>My Page Title</title> </head> <body> My HTML Page Body goes here </body> </html>
现在让我们通过模板继承重写这些内容
<html> <head> <title>{block name=title}Default Page Title{/block}</title> </head> <body> {block name=body}{/block} </body> </html>
{extends file="layout.tpl"} {block name=title}My Page Title{/block} {block name=body}My HTML Page Body goes here{/block}
<html> <head> <title>My Page Title</title> </head> <body> My HTML Page Body goes here </body> </html>
我们不再需要在多个文件(header.tpl、footer.tpl 等)中管理我们的页面布局,现在我们在一个内聚模板(layout.tpl)中管理它,并使用 {block ...} 标记定义可更改的内容块。现在你可以简单地扩展 layout.tpl(基本上是复制它),然后自定义任何已定义的块元素。你可以链接任意数量的子模板,这就是继承的概念。
所以回到我们最初的挑战,我们如何满足在页眉中加载自定义 Javascript/CSS 的需求?只需向 layout.tpl 中添加一个新块,并在子模板中对其进行自定义
<html>
<head>
<title>{block name=title}Default Page Title{/block}</title>
{block name=head}{/block}
</head>
<body>
{block name=body}{/block}
</body>
</html>
{extends file="layout.tpl"}
{block name=title}My Page Title{/block}
{block name=head}
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
<script src="/js/mypage.js"></script>
{/block}
{block name=body}My HTML Page Body goes here{/block}
<html>
<head>
<title>My Page Title</title>
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
<script src="/js/mypage.js"></script>
</head>
<body>
My HTML Page Body goes here
</body>
</html>
如你所见,现在我们可以轻易地从子模板自定义页眉内容。这就是模板继承的基础。它简化了模板管理,并使难题变得微不足道!