Html模板引擎

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

模板定界符

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

默认分隔符为{{}}

标签说明

直接输出变量

//入库转译只需一次,输出的时候转译要n次。所以这边输出不做htmlspecialchars转译。建议入库前转义。

{{$a}}

{{+$a}} htmlspecialchars转译输出 v2.7.1+可用

输出数组

//入库转译只需一次,输出的时候转译要n次。所以这边输出不做htmlspecialchars转译。建议入库前转义。

  • 一维数组: {{$a['key']}}或者{{$a.key}]} {{+$a['key']}}或者{{+$a.key}]} htmlspecialchars转译输出 v2.7.1+可用

  • 二维数组: {{$a['key1']['key2']}}或者 {{$a.key1.key2}} {{+$a['key1']['key2']}}或者 {{+$a.key1.key2}} htmlspecialchars转译输出 v2.7.1+可用

  • 多维数组: {{echo $a[..]….}} 用echo输出{{+echo $a[..]….}} htmlspecialchars转译输出 v2.7.1+可用

判断语句

  1. {{if $abc <1 }}
  2. 。。。。
  3. {{elseif}} 【可选】
  4. 。。。。
  5. {{else}} 【可选】
  6. 。。。。
  7. {{/if}}

循环语句

loop

  1. {{loop $abc $key $val}} 【$key可选】
  2. 。。。
  3. {{/loop}}

foreach

  1. {{foreach $abc $key $val}} 【$key可选】
  2. 。。。
  3. {{/foreach}}

包含公共模板

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

执行简单php代码

  1. {{eval ...}}

执行某些函数

  1. {{echo trim(' abc ')}}

格式化日期时间

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

设置插件挂载点

  1. {{hook test}}

获取get、post、request请求参数

  1. {{get name}}、{{post name}}、{{request name}}

获取配置文件配置项

  1. {{config key1.key2}}

获取语言包配置项

  1. {{lang key1.key2}}

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

  1. {{url 'Index/index'}}
  2. 生成的地址可能是:
  3. /index.php/Index/index
  4. /Index/index.html
  5. /index.php?r=/Index/index
  6. subdir/Index/index.html
  7. subdir/index.php/Index/index
  8. ...

生成表单令牌

  1. {{token}}

输出静态文件目录基地址

  1. {{public}}
  2. 生成的地址如:
  3. http://baidu.com/index.php 生成 /
  4. http://baidu.com/public/index.php 生成/public/
  5. http://baidu.com/subdir/public/ 生成/subdir/public/
  6. 修改配置`static__path` => 'http://img.attach.com/' 生成http://img.attach.com/

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

静态文件管理

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

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

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

  1. {{acl user/add}}
  2. 我有添加用户的权限
  3. {{/acl}}
  4. {{acl user/add}}
  5. 我有添加用户的权限
  6. {{else}}
  7. 我没有添加用户的权限
  8. {{/acl}}

模板布局

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

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
  6. <title>标题</title>
  7. <link href="{{public}}css/Test/style.css" rel="stylesheet" type="text/css" media="screen" />
  8. </head>
  9. <body>
  10. {{block content}}
  11. aaa
  12. {{/block}}
  13. </body>
  14. </html>
我们看到有{{block xxx}} {{/block}}标签 即声明一个区块 建一个模板文件xxxx/View/Index/index.html,内容为:
  1. {{to content}} 内容内容内容 {{parent}} {{/to}}
在控制器中使用布局渲染模板
  1. //使用当前应用下的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');
渲染后的页面为
  1. <!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> <link href="{{public}}css/Test/style.css" rel="stylesheet" type="text/css" media="screen" /></head><body> 内容内容内容 aaa</body></html>

{{urldeper}}标签

参考常见问题

模板注释

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

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

自定义一个模板标签.

  1. /**
  2. * 添加一个模板标签
  3. *
  4. * @param string $pattern 正则
  5. * @param string $replacement 替换成xx内容
  6. * @param bool $haveDelimiter $pattern的内容是否要带上左右定界符
  7. *
  8. * @return bool
  9. */
  10. public function addRule($pattern, $replacement, $haveDelimiter = true)
  11. {
  12. if ($pattern && $replacement) {
  13. $this->pattern = $haveDelimiter ? '#'.$this->options['leftDelimiter'].$pattern.$this->options['rightDelimiter'].'#s' : "#{$pattern}#s";
  14. $this->replacement = $replacement;
  15. return true;
  16. }
  17. return false;
  18. }

原文: http://doc.cmlphp.com/devintro/view/html.html