> 模板继承,顾名思义就是定义一个子模板,一个基础模板,子模板内可以重写父模板内的代码块
> block标签是不支持嵌套的
### 定义基础模板
基础模板中可以定义任意多个名称标识**不重复**的区块,例如下面定义了一个`layout.html`基础模板:
~~~html
<html>
<head>
<title>{block name="title"}标题{/block}</title>
</head>
<body>
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}
</body>
</html>
~~~
### 定义子模板
* 子模板中使用`{extend name="layout"}`来继承基础模板
* layout是基础模板的路径,路径的解析参考视图章节的[视图文件路径](views.md)
* `extend`代码必须在子模板中的第一行才有效!!!
~~~html
{extend name="base"}
{block name="title"}{$title}{/block}
{block name="menu"}
<a href="/" >首页</a>
<a href="/info/" >资讯</a>
<a href="/bbs/" >论坛</a>
{/block}
{block name="left"}{/block}
{block name="main"}
{loop $arr $value}
<a href="/new/{$value}">{$value}</a><br/>
{/loop}
{/block}
{block name="right"}
{if $name=='news'}<b>最新资讯:</b>{/if}
{/block}
{block name="footer"}
<ul>
<li>{parent}</li>
<li>版权</li>
<li>其他</li>
</ul>
{/block}
~~~
* 上例中,我们在子模板中使用了`extend`标签来继承了`layout`模板。
* 在子模板中,可以对基础模板中的区块进行重载定义,如果没有重新定义的话,则表示沿用基础模板中的区块定义,如果定义了一个空的区块,则表示删除基础模板中的该区块内容。上面的例子,我们就把left区块的内容删除了,其他的区块都进行了重载。
* 在`footer`块中,我们用`{parent}`标签来引用父级模板中的内容。
* 在子模板中,只能定义区块而不能定义其他的模板内容,否则将会直接忽略,如果区块在基础模板中不存在,则直接忽略。
* 模板可以无限级继承,比如B继承了A,而C又继承了B,最终C中的区块会覆盖B和A中的同名区块。
* 注意不要形成A继承A,或者A继承B而B又继承A这样的死循环。
* 子模板中的区块定义顺序是随意的。
- 序言
- 更新日志
- 安装
- 规范
- 常量
- 配置
- 自动加载
- MVC
- 模块
- 控制器
- 模型
- 视图
- php原生模板
- 模板引擎
- 变量输出
- 模板注释
- 模板继承
- 模板引用
- 流程控制
- 原样输出
- 服务组件
- Hook组件
- Request组件
- Router组件
- Cookie组件
- Encrypter组件
- Dispatch组件
- Response组件
- View组件
- Session组件
- Helper组件
- 数据分页
- 数据验证
- Logger组件
- Cache组件
- Redis组件
- Connection组件
- 执行sql语句
- 查询生成器
- 查询方法详解
- Schema
- Captcha组件
- CLI
- CLI工具
- 事件
- 类事件
- 实例事件
- 全局事件
- 助手函数
- 扩展
- 异常
- 部署
- Apache
- Nginx
- IIS
- 虚拟主机