模板继承 继承是从面向对象编程而来的概念,模板继承能够让你定义一个或多个父模板,提供给子模板来进行扩展。 扩展继承意味着子模板能够覆盖部分或所有父模板的块区域。php
继承结构能够是多层次的,因此你能够继承于一个文件,而这个文件又是继承于其余文件,等等。css
在覆盖父模板的{block}块之外的地方, 子模板不能定义任何内容。任何在{block}之外的 内容都会被自动忽略。html
在子模板和父模板中的{block}内容,能够经过 append 和 prepend来进行合并。 {block}的选项,和 {$smarty.block.parent} 或 {$smarty.block.child}会持有这些内容。编程
模板继承在编译时将编译成单独的一个编译文件。对比效果类似的{include}包含模板功能,模板继承的性能更高。app
子模板继承使用{extends}标签, 该标签必定放要在子模板的第一行。 另外一种作法是将整个模板继承树,在PHP程序调用fetch() 或 display()的时候, 用extends:的模板资源类型,该作法有更大的灵活性。性能
Note 当开启了$compile_check,继承树里面的所有文件都会在每次调用的时候检查是否有修改。 所以,在生产环境中你最好关闭$compile_check。fetch
Note 若是你的子模板里面有用到{include} 来包含模板,而被包含的模板里面存在供{include}模板 调用的{block}区域, 那么在最顶层的父模板里面,你须要放置一个空的 {block} 来做为继承。spa
Example 17.6. 模板继承例子code
layout.tpl (父模板)htm
<html> <head> <title>{block name=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}个人页面标题{/block} {block name=head} <link href="/css/mypage.css" rel="stylesheet" type="text/css"/> <script src="/js/mypage.js"></script> {/block} {block name=body}个人HTML页面内容在这里{/block}
显示上面的模板
$smarty->display('mypage.tpl');
页面将输出:
<html> <head> <title>个人页面标题</title> <link href="/css/mypage.css" rel="stylesheet" type="text/css"/> <script src="/js/mypage.js"></script> </head> <body> 个人HTML页面内容在这里 </body> </html>
Example 17.7. 用extends:来进行模板继承
代替模板内使用{extends}的继承方式, 你能够经过在PHP内定义继承树来进行继承,使用 extends:的资源类型。
下面的代码将返回和上面例子同样的结果:
<?php $smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl'); ?>