Smarty 图标

根据 商标公告,你可以使用 Smarty 徽标。

Smarty Template Engine Smarty Template Engine

对于赞助、广告、新闻或其他咨询,请通过以下方式联系我们

使用 Smarty 的网站

广告

模板继承

模板继承是一种管理模板的方法,类似于面向对象编程技术。与其传统使用 {include ...} 标记管理模板的部分,你可以将一个模板的内容继承到另一个模板中(如扩展一个类),并在其中更改内容块(如重写类的函数)。这可使模板管理保持在最小化的同时提高效率,因为每个模板只包含它所扩展的模板的差异。

用例演示

挑战:假设我们正在创建一个 HTML 页面,它需要在文档的 <head></head> 中加载一些自定义 Javascript/CSS 文件。问题是这是在 header.tpl 中定义的,它包含在页面的上方。有许多可解决此问题的方法,但这些方法可能会非常凌乱。让我们使用 Smarty 3 的新功能“模板继承”使这项任务变得简单。

在使用模板继承之前,我们只能使用 {include ...} 标记共享诸如页眉和页脚之类的内容。下面是一个示例

无继承的示例

header.tpl

<html>
<head>
  <title>{$title|default:"Default Page Title"}</title>
</head>
<body>

footer.tpl

</body>
</html>

mypage.tpl

{include file="header.tpl" title="My Page Title"}
My HTML Page Body goes here
{include file="footer.tpl"}

mypage.tpl 的输出

<html>
<head>
  <title>My Page Title</title>
</head>
<body>
My HTML Page Body goes here
</body>
</html>

现在让我们通过模板继承重写这些内容

有继承的示例

layout.tpl

<html>
<head>
  <title>{block name=title}Default Page Title{/block}</title>
</head>
<body>
{block name=body}{/block}
</body>
</html>

mypage.tpl

{extends file="layout.tpl"}
{block name=title}My Page Title{/block}
{block name=body}My HTML Page Body goes here{/block}

mypage.tpl 的输出

<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 中添加一个新块,并在子模板中对其进行自定义

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>

mypage.tpl

{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}

mypage.tpl 的输出

<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>

如你所见,现在我们可以轻易地从子模板自定义页眉内容。这就是模板继承的基础。它简化了模板管理,并使难题变得微不足道!