模板继承

继承是从面向对象编程而来的概念,模板继承可以让你定义一个或多个父模板,提供给子模板来进行扩展。 扩展继承意味着子模板可以覆盖部分或全部父模板的块区域。

  • 继承结构可以是多层次的,所以你可以继承于一个文件,而这个文件又是继承于其他文件,等等。

  • 在覆盖父模板的{block}块以外的地方,子模板不能定义任何内容。任何在{block}以外的内容都会被自动忽略。

  • 在子模板和父模板中的{block}内容,可以通过appendprepend来进行合并。{block}的选项,和{$smarty.block.parent}{$smarty.block.child}会持有这些内容。

  • 模板继承在编译时将编译成单独的一个编译文件。对比效果相似的{include}包含模板功能,模板继承的性能更高。

  • 子模板继承使用{extends}标签,该标签一定放要在子模板的第一行。另一种做法是将整个模板继承树,在PHP程序调用fetch()display()的时候, 用extends:的模板资源类型,该做法有更大的灵活性。

Note

当开启了$compile_check,继承树里面的全部文件都会在每次调用的时候检查是否有修改。 因此,在生产环境中你最好关闭$compile_check

Note

如果你的子模板里面有用到{include} 来包含模板,而被包含的模板里面存在供{include}模板 调用的{block}区域, 那么在最顶层的父模板里面,你需要放置一个空的 {block} 来作为继承。


Example 17.6. 模板继承例子

layout.tpl (父模板)

  1. <html>
  2. <head>
  3. <title>{block name=title}默认页面标题{/block}</title>
  4. {block name=head}{/block}
  5. </head>
  6. <body>
  7. {block name=body}{/block}
  8. </body>
  9. </html>
  10.  

myproject.tpl (子模板)

  1. {extends file='layout.tpl'}
  2. {block name=head}
  3. <link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
  4. <script src="/js/mypage.js"></script>
  5. {/block}
  6.  
  7.  

mypage.tpl (孙子模板)

  1. {extends file='myproject.tpl'}
  2. {block name=title}我的页面标题{/block}
  3. {block name=head}
  4. <link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
  5. <script src="/js/mypage.js"></script>
  6. {/block}
  7. {block name=body}我的HTML页面内容在这里{/block}
  8.  

显示上面的模板

  1. $smarty->display('mypage.tpl');
  2.  

页面将输出:

  1. <html>
  2. <head>
  3. <title>我的页面标题</title>
  4. <link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
  5. <script src="/js/mypage.js"></script>
  6. </head>
  7. <body>
  8. 我的HTML页面内容在这里
  9. </body>
  10. </html>


Example 17.7. 用extends:来进行模板继承

代替模板内使用{extends}的继承方式,你可以通过在PHP内定义继承树来进行继承,使用extends:的资源类型。

下面的代码将返回和上面例子一样的结果:

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

参见 {block}, {extends}extends: 资源

原文: https://www.smarty.net/docs/zh_CN/advanced.features.template.inheritance.tpl