跳至内容

模板继承

继承允许您定义子模板可以扩展的基本模板。扩展意味着子模板可以覆盖基本模板中一个或者全部命名的块区域。

当您渲染子模板时,效果就像渲染基本模板,不同之处在于您在子模板中覆盖的块(复数)不同。

  • 继承树可以任意深,这意味着您可以扩展一个扩展了另一个文件的文件,以此类推。

  • 除了位于 {block} 中的内容,子模板不能定义任何其他内容标签。位于 {block} 标签之外的内容都将会被移除。

  • 模板继承是一个编译时间流程,会创建一个已编译的单一模板文件。与基于使用 {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}

若要呈现以上内容,您可以使用

<?php
$smarty->display('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>

注意

compile-check已启用,所有继承关系中的文件在每一次的调用中都将检查是否修改。因此您可能希望在产品服务器上禁用 compile-check。

注意

如果您有一个子模板,通过{include}包含该子模板,并且该子模板包含{block}区域,它仅在从周围的{block}调用{include}时才起作用。在最终的父模板中,您可能需要一个虚拟{block}

使用追加和前置

{block}标签的子、父模板中的内容可以通过附加或前置的{block}标签选项标志合并,也可以通过{$smarty.block.parent}{$smarty.block.child}占位符合并。

扩展资源类型

除了在模板文件中使用{extends}标签,您还可以通过使用extends:资源类型在 PHP 脚本中定义继承关系。

下面的代码将返回与上例相同的结果。

<?php
$smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl');