# Html模板引擎

CmlPHP使用自主开发的模板引擎体积小巧、简单高效,下面是语法说明 分隔符可以在配置文件中修改

# 模板定界符

'TMPL_LEFT_DEPER' => '{', //模板左定界符
'TMPL_RIGHT_DEPER' => '}', //模板右定界符

TIP

默认分隔符为{{}}

# 标签说明

# 输出变量

{{$a}} //直接输出变量
{{+$a}}// htmlspecialchars转译输出

WARNING

入库转译只需一次,输出的时候转译要n次。建议入库前转义

# 输出数组

# 一维数组:
{{$a['key']}} 或者{{$a.key}]}
{{+$a['key']}} 或者 {{+$a.key}]} // htmlspecialchars转译输出
# 二维数组:
{{$a['key1']['key2']}} 或者 {{$a.key1.key2}}   
{{+$a['key1']['key2']}}或者 {{+$a.key1.key2}} //htmlspecialchars转译输出
# 多维数组:
{{echo $a[..]....}} // 用echo输出
{{+echo $a[..]....}} //htmlspecialchars转译输出

# 判断语句

{{if $abc <1 }}
...
{{elseif}} //【可选】
...
{{else}}  //【可选】
...
{{/if}}

# 循环语句

# loop
{{loop $abc $key $val}} //$key可选】
...
{{/loop}}
# foreach
{{foreach $abc $key $val}}$key可选】
...
{{/foreach}}

# 包含公共模板

{{template /Site/Index/index}}
// 包含项目目录`/Views/Site/Index/index.html`模板文件

# 执行简单php代码

{{eval ...}}

# 执行某些函数

{{echo trim('  abc  ')}}

# 格式化日期时间

 {{datetime $time|Y-m-d H:i:s }}

####设置插件挂载点

{{hook test}}

# 获取getpostrequest请求参数

{{get name}}{{post name}}{{request name}}

# 获取配置文件配置项

{{config key1.key2}}

# 获取语言包配置项

{{lang key1.key2}}

# url_model

根据url_model配置项,生成相应的url(如果部署是在子目录自动处理)

{{url 'Index/index'}}
/**
生成的地址可能是:
/index.php/Index/index
/Index/index.html
/index.php?r=/Index/index
subdir/Index/index.html
subdir/index.php/Index/index
    ...
*/

# 生成表单令牌

{{token}}

# 输出静态文件目录基地址

{{public}}
/**
 生成的地址如:  
http://baidu.com/index.php  生成 /

http://baidu.com/public/index.php 生成/public/

http://baidu.com/subdir/public/ 生成/subdir/public/

修改配置`static__path` => 'http://img.attach.com/' 生成http://img.attach.com/
*/

生成指静态文件目录的路径(自动处理项目部署在二级三级目录的问题),如果是存放在cdn/单独服务器有独立域名 ,只要修改配置文件的static__path配置项为相应地址即可

# 静态文件管理

{{assert xxx}}

TIP

在模板中输出静态文件的地址使用{{assert}}命令,如有静态文件web/Resuorce/js/1.js 则在模板中使用 {{assert web/js/1.js}}。 当我们开启debug时,使用assert框架会启用一个简单的文件服务器。此时我们在模板中的标签{{assert web/js/1.js}}会替换成,类似这样的地址,修改文件内容时实时生效。当关闭debug时生成的地址则是相对于 {{public}}标签指向的目录。当我们设置static__path站点根目录/public时 {{assert web/js/1.js}}生成的地址则为http://mysite/public/web/js/1.js。此时public目录中并没有这个静态文件,静态文件是存在于应用目录下的 Resource中,此时我们要使用静态资源管理工具去管理静态资源目录,点击查看静态资源管理

# 模板中判断有无某个模块的权限

使用模板标签{{acl xxx}}

{{acl user/add}}

我有添加用户的权限

{{/acl}}{{acl user/add}}

我有添加用户的权限

{{else}}

我没有添加用户的权限

{{/acl}}

# 模板布局

模板布局文件都是声明在应用名/View/layout下,如声明一个模板布局文件 xxx/View/layout/master.html 内容为:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
    <title>标题</title>
</head>
<body>

    {{block content}}
        aaa
    {{/block}}

</body>
</html>

我们看到有{{block xxx}} {{/block}}标签 即声明一个区块 建一个模板文件xxxx/View/Index/index.html,内容为:

{{to content}}
    内容内容内容
    {{parent}}
{{/to}}

在控制器中使用布局渲染模板

//使用当前应用下的master部局文件,当前应用下的Index/index.html模板
\Cml\View::getEngine('Html')->->displayWithLayout('Index/index', 'master');
>
//使用base应用下的master部局文件,当前应用下的Index/index.html模板
 \Cml\View::getEngine('Html')->->displayWithLayout('Index/index', 'master',  'base');
>
//使用base应用下的master部局文件,common应用下的Index/index.html模板
\Cml\View::getEngine('Html')->->displayWithLayout('Index/index', 'master', 'base', 'common');

渲染后的页面为

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
   <title>标题</title>
</head>
<body>
>
   内容内容内容
       aaa
>
</body>
</html>

# {{urldeper}}标签

参考常见问题

# 模板注释

{{comment 我只是一个模板注释}} 

代码注释,编译后会自动删除

# 自定义一个模板标签.


/**
 * 添加一个模板标签
 *
 * @param string $pattern 正则
 * @param string $replacement 替换成xx内容
 * @param bool $haveDelimiter $pattern的内容是否要带上左右定界符
 *
 * @return bool
 */
public function addRule($pattern, $replacement, $haveDelimiter = true)
{
    if ($pattern && $replacement) {
        $this->pattern = $haveDelimiter ? '#'.$this->options['leftDelimiter'].$pattern.$this->options['rightDelimiter'].'#s' : "#{$pattern}#s";
        $this->replacement = $replacement;
        return true;
    }

    return false;
}