模板继承
继承允许您定义子模板可以扩展的基本模板。扩展意味着子模板可以覆盖基本模板中一个或者全部命名的块区域。
当您渲染子模板时,效果就像渲染基本模板,不同之处在于您在子模板中覆盖的块(复数)不同。
-
继承树可以任意深,这意味着您可以扩展一个扩展了另一个文件的文件,以此类推。
-
模板继承是一个编译时间流程,会创建一个已编译的单一模板文件。与基于使用
{include}
标签包含的子模板的对应解决方案相比较,在渲染时,模板继承的性能要好得多。
基本继承
首先,创建一个带有 1 个或多个 块 的基本模板。然后,创建一个子模板。子模板的第一行必须带有 {extends} 标签。
子模板可重新定义基本模板中定义的一个或多个块。
请参见下面的简单示例。
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>
myproject.tpl(子级)
{extends file='layout.tpl'}
{block name=head}
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
<script src="/js/mypage.js"></script>
{/block}
mypage.tpl(孙子级)
{extends file='myproject.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>
注意
当compile-check已启用,所有继承关系中的文件在每一次的调用中都将检查是否修改。因此您可能希望在产品服务器上禁用 compile-check。
注意
如果您有一个子模板,通过
{include}
包含该子模板,并且该子模板包含{block}
区域,它仅在从周围的{block}
调用{include}
时才起作用。在最终的父模板中,您可能需要一个虚拟{block}
。
使用追加和前置
{block}
标签的子、父模板中的内容可以通过附加或前置的{block}
标签选项标志合并,也可以通过{$smarty.block.parent}
或{$smarty.block.child}
占位符合并。
扩展资源类型
除了在模板文件中使用{extends}
标签,您还可以通过使用extends:
资源类型在 PHP 脚本中定义继承关系。
下面的代码将返回与上例相同的结果。