模板继承
继承是从面向对象编程而来的概念,模板继承可以让你定义一个或多个父模板,提供给子模板来进行扩展。 扩展继承意味着子模板可以覆盖部分或全部父模板的块区域。
继承结构可以是多层次的,所以你可以继承于一个文件,而这个文件又是继承于其他文件,等等。
在子模板和父模板中的
{block}
内容,可以通过append
和prepend
来进行合并。{block}
的选项,和{$smarty.block.parent}
或{$smarty.block.child}
会持有这些内容。模板继承在编译时将编译成单独的一个编译文件。对比效果相似的
{include}
包含模板功能,模板继承的性能更高。子模板继承使用
{extends}
标签,该标签一定放要在子模板的第一行。另一种做法是将整个模板继承树,在PHP程序调用fetch()
或display()
的时候, 用extends:
的模板资源类型,该做法有更大的灵活性。
Note
当开启了$compile_check
,继承树里面的全部文件都会在每次调用的时候检查是否有修改。 因此,在生产环境中你最好关闭$compile_check
。
Note
如果你的子模板里面有用到{include}
来包含模板,而被包含的模板里面存在供{include}
模板 调用的{block}
区域, 那么在最顶层的父模板里面,你需要放置一个空的 {block}
来作为继承。
layout.tpl (父模板)
- <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');
- ?>
参见 {block}
, {extends}
和 extends:
资源
原文: https://www.smarty.net/docs/zh_CN/advanced.features.template.inheritance.tpl