Smarty 图标

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

Smarty Template Engine Smarty Template Engine

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

使用 Smarty 的网站

广告

模板继承

继承将面向对象编程的概念带入模板,允许您定义一个(或多个)基模板,子模板可以对其进行扩展。扩展意味着子模板可以覆盖父级已命名块区域中的全部或部分内容。

  • 继承关系树可以像您希望的一样深入,这意味着您可以扩展一个文件,而该文件又扩展了另一个文件,依此类推。

  • 除了他们覆盖的 {block} 标记内部的内容之外,子模板无法定义任何内容。在 {block} 标记之外的任何内容都将被移除。

  • 可以通过 appendprepend {block} 标记选项标记以及 {$smarty.block.parent}{$smarty.block.child} 占位符,合并子模板和父模板的 {block} 标记的内容。

  • 模板继承是一个编译时流程,它创建一个单独的已编译模板文件。与基于包含 {include} 标记的子模板的相应解决方案相比,该解决方案在渲染时有更好的性能。

  • 子模板扩展其已定义的父级 {extends} 标记,该标记必须是子模板中的第一行。除了在模板文件中使用 {extends} 标记之外,您还可以在调用 fetch()display() 以及 extends: 模板资源类型时,在 PHP 脚本中定义整个模板继承关系树。后者提供了更大的灵活性。

注意

当启用 $compile_check 时,每个方法调用都会检查继承树中所有文件的修改。出于此原因,建议在生产服务器上禁用 $compile_check

注意

如果你有一个包含 {include} 的子模板,它包含 {block} 区域,只有当 {include} 本身在一个包围的 {block} 中调用时它才能工作。在最终父模板中,你可能需要一个虚拟 {block}

示例 17.6. 模板继承示例

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}

  

要渲染上述内容,请使用

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

示例 17.7. 通过模板资源 extends: 进行模板继承

除了在模板文件中使用 {extends} 标记之外,你还可以通过使用 extends: 资源 类型在 PHP 脚本中定义继承树。

以下代码将返回与上述示例相同的结果。

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

   

另请参阅 {block}{extends}extends: 资源