Smarty 是什么?
为什么使用它?
使用案例和工作流
语法比较
模板继承
最佳实践
速成课程
继承将面向对象编程的概念带入模板,允许您定义一个(或多个)基模板,子模板可以对其进行扩展。扩展意味着子模板可以覆盖父级已命名块区域中的全部或部分内容。
继承关系树可以像您希望的一样深入,这意味着您可以扩展一个文件,而该文件又扩展了另一个文件,依此类推。
除了他们覆盖的 {block}
标记内部的内容之外,子模板无法定义任何内容。在 {block}
标记之外的任何内容都将被移除。
可以通过 append
或 prepend
{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:
资源