190 lines
3.5 KiB
Markdown
190 lines
3.5 KiB
Markdown
# Template-engine
|
||
|
||
### 模板继承
|
||
模板继承通过extend标签与block标签配合使用实现。
|
||
一个最简单的继承
|
||
```
|
||
// Base/layout.html(父级模板)
|
||
|
||
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>Title</title>
|
||
</head>
|
||
<body>
|
||
<block name="body"></block>
|
||
</body>
|
||
</html>
|
||
|
||
// Index/index.html
|
||
|
||
<extend file="Base/layout" />
|
||
<block name="body">
|
||
<h3>内容主体</h3>
|
||
</block>
|
||
```
|
||
### 模板标签
|
||
内置一些常用标签
|
||
1. php
|
||
|
||
php标签。此标签为闭合标签,标签内的内容将被解析为原生php代码执行。
|
||
|
||
```
|
||
<php>
|
||
echo '你好';
|
||
</php>
|
||
```
|
||
|
||
2. if
|
||
|
||
if标签。此标签为闭合标签,condition属性为if的条件,属性列表:condition。
|
||
|
||
```
|
||
<if condition="$age eq 10">
|
||
// do something...
|
||
</if>
|
||
```
|
||
|
||
3. else
|
||
|
||
else标签。此标签为自闭合标签,可选属性condition,存在condition属性则被解析为elseif,属性列表:condition(可选)。
|
||
|
||
```
|
||
<if condition="$age eq 10">
|
||
// do something...
|
||
<else />
|
||
// do something...
|
||
</if>
|
||
|
||
<if condition="$age eq 10">
|
||
// do something...
|
||
<else condition="$age eq 20" />
|
||
// do something...
|
||
</if>
|
||
```
|
||
|
||
4. loop
|
||
|
||
循环标签。此标签为闭合标签,属性列表:name、id、key(可选)。
|
||
|
||
```
|
||
<loop name="lists" id="item">
|
||
{item.id}
|
||
</loop>
|
||
|
||
<loop name="lists" id="item" key="i">
|
||
{i}、{item.id}
|
||
</loop>
|
||
```
|
||
|
||
5. assign
|
||
|
||
赋值标签,在模板中创建新的php变量。此标签为自闭合标签,属性列表:name、value。
|
||
|
||
```
|
||
<assign name="username" value="TOP糯米" />
|
||
```
|
||
|
||
6. original
|
||
|
||
此标签为闭合标签。original标签中的内容不会被编译。
|
||
|
||
```
|
||
<original>
|
||
<loop name="lists" id="item">
|
||
{item.id}
|
||
</loop>
|
||
</original>
|
||
```
|
||
上例,loop标签会被原样输出。
|
||
|
||
7. switch
|
||
|
||
此标签为闭合标签。
|
||
|
||
```
|
||
<assign name="value" value="1" />
|
||
<switch name="value">
|
||
<case value="0">
|
||
$name的值为0
|
||
</case>
|
||
<case value="1">
|
||
$name的值为1
|
||
</case>
|
||
<case>默认</case>
|
||
</switch>
|
||
```
|
||
|
||
8. include
|
||
|
||
在当前模板中加载其他模板文件。
|
||
|
||
9. 变量、函数调用
|
||
|
||
输出
|
||
```
|
||
{$username}
|
||
{$user.name}
|
||
{$user['name']}
|
||
```
|
||
函数调用
|
||
```
|
||
{:mb_substr($username, 0, 3, 'utf8')}
|
||
{$username|mb_substr=0,3,'utf8'}
|
||
```
|
||
|
||
### 自定义标签
|
||
新建自定义标签库类文件Extend.php,可选择继承TagLib类(支持点语法)。
|
||
#### 闭合标签
|
||
```
|
||
class Extend extends TagLib
|
||
{
|
||
public $tags = [
|
||
'test' => ['attr' => 'start,length,id', 'close' => 1]
|
||
];
|
||
|
||
public function _test($attr, $content)
|
||
{
|
||
$parse = '<?php for ($' . $attr['id'] . ' = ' . $attr['start'] . '; $' . $attr['id'];
|
||
$parse .= ' < ' . $attr['start'] . ' + ' . $attr['length'] . '; ';
|
||
$parse .= '$' . $attr['id'] . '++): ?>';
|
||
$parse .= $content;
|
||
$parse .= '<?php endfor; ?>';
|
||
return $parse;
|
||
}
|
||
}
|
||
```
|
||
类创建完成后,调用Engine中的loadTaglib方法加载Extend类
|
||
```
|
||
$config = [
|
||
'ext' => 'html',
|
||
'dir' => './templates/',
|
||
'left' => '<',
|
||
'right' => '>',
|
||
];
|
||
$engine = Engine::instance($config);
|
||
$engine->loadTaglib('extend', Extend::class);
|
||
```
|
||
添加完成后即可在模板中使用
|
||
```
|
||
<extend:test start="1" length="10" id="test">
|
||
{$test}
|
||
</extend:test>
|
||
```
|
||
#### 自闭合标签
|
||
添加一个描述
|
||
```
|
||
'say' => ['attr' => 'what', 'close' => 0]
|
||
```
|
||
新建_say方法
|
||
```
|
||
public function _say($attr)
|
||
{
|
||
return "<?php echo '{$attr['what']}'; ?>";
|
||
}
|
||
```
|
||
模板调用
|
||
```
|
||
<extend:say what="Hello world!" />
|
||
``` |