模板引擎

优质
小牛编辑
125浏览
2023-12-01

我们自己实现了一个轻量级的模板引擎,不要问为什么不用smart之类的,因为我们认为没有必要为了一个小小的模板引擎而引入smaart这样复杂的实现。你可能会说,smart功能强大,支持各种标签,标签也是很强大,而且还可以对模板引擎进行各种"灵活"的配置... 这里我们觉得有必要说明一下:

  1. 框架的内置模板引擎基本上实现了我们日常开中所有常用的标签。
  2. 不常用的标签我们也做了巧妙的实现。
  3. 我们只提供了扩展模板标签的入口(具体操作请参考 模板编译规则配置),并没有提供所谓的“灵活”配置, 原因很简单,还是 约定优于配置原则,这些配置你往往很少会用到的,一般都是用默认的。

1. 注册变量

注册变量很简单,通过在控制器调用 Template::assign() 方法就可以了。因为 ControllerTemplate 的子类(这个会在控制器中解释).

$this->assign('name', 'xiaoming');

2. 获取已经注册的变量

获取已经注册的变量是通过 Template::getTemplateVar() 去获取。

$this->getTemplateVar("name");

模板标签

我们提供一些常用标签的便捷实现

$user = array('username' => 'fuck_this_work', password => '123456');
$this->assign('user', $user);

变量输出

<h3>{title}</h3>
<div>{user['password']}</div>

也可以这样写:


<h3>{$value}</h3>
<div>{$user.password}</div>

后一种风格更偏向与javascript或者java的模板标签风格, 同样的如果是二维数组的话也是一样的:

<h3>{$arr['key1']['key2']}</h3>
<h3>{$arr.key1.key2}</h3>

你会说三维数组怎么办,没办法,目前支持二维一下的数组,如果你真的用到了三维数组的话那就说明你的需求及其复杂或者你的程序设计不够科学。

loop标签

loop标签数用来遍历数组的

foreach ( $arr as $key => $value )

<ul>
    {loop $arr $key $value}
    <li>key : {$key}, value : {$value}</li>
    {/loop}
</ul>

foreach ( $arr as $value )

<ul>
    {loop $users $value}
    <li>name : {$value.name}, address : {$value[address]}</li>
    {/loop}
</ul>

if标签

当需要做逻辑判断的时候就需要用到 if 标签

if () {} elseif {}


<ul>
    {if $id < 1}
    <li>{$id}+1</li>    
    {elseif $id > 100}
    <li>{$id}-10</li>    
    {/if}
</ul>

require|include标签

当你需要包含另外一个模板的时候,你就需要使用到 {require} 或者 {include} 标签了。恩,其实着两个标签没有任何区别的,之所以还留着这个轮子,是为了兼容。也为了满足那些有强迫症的码农。

<!DOCTYPE html>
<html lang="zh-CN">
{include test.inc_header}

<body>
{include test.inc_top}
<div class="container">

    <div class="jumbotron">
        <h1><span class="label label-info">O(∩_∩)O~~ 欢迎使用Herosphp!</span></h1>

        <h3 style="padding-top: 20px;">致力于开发方便,快捷,优雅的php开发框架。</h3>
        <h3>上手容易,部署简单,开发效率,性能优越。</h3>

    </div>

</div>

</body>
</html>

{include module.template}

  • module 模块名称,即你要包含的模板在哪个模块
  • template 模板名称,这里不需要写模板后缀的

res|cres 标签

这2个都是用来引入静态资源的标签,只是默认的文件的路径不一样。 使用语法 {res:css $filepath} 或者 {res:js $filepath}.

  • res:css 根路径/res/styles
  • res:js 根路径 /res/js
  • cres:css 根路径 /res
  • cres:js 根路径 /res

举个栗子:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>this is a test</title>

    {res:css bootstrap.min.css}
    {cres:css admin/user/login.csss}
</head>
<body>
<div class="container">

    <div class="jumbotron">
        <h1><span class="label label-info">O(∩_∩)O~~ 欢迎使用Herosphp!</span></h1>

        <h3 style="padding-top: 20px;">致力于开发方便,快捷,优雅的php开发框架。</h3>
        <h3>上手容易,部署简单,开发效率,性能优越。</h3>

    </div>

</div>


{res:js jquery.min.js}
{res:js bootstrap/bootstrap.js}
</body>
</html>

其他内置标签

我们还提供了一些特殊的标签,用来处理特殊的变量和逻辑:

  • {run}标签: 执行php表达式
  • {expr}标签:输出php表达式
  • {url}标签:输出格式化的url
  • {date}标签:根据时间戳输出格式化日期
  • {cut}标签:裁剪字指定长度的字符串,注意截取的格式是UTF-8, 多余的字符会用...表示
<ul>
    <li>{run $i=0}  => <?php $i = 0;?></li> 
    <li>{run $i++} => <?php $i++;?></li>
    <li>{expr date('Y-m-d H:i:s')} => <?php echo date('Y-m-d H:i:s') ?></li>
    <li>{expr strlen($username)} => <?php echo strlen($username) ?></li>
    <li>{url /admin/user/login} => <?php echo url('/admin/user/login')?></li>
    <li>{date 1472635074 Y-m-d H:i:s} => <?php echo date(1472635074, 'Y-m-d H:i:s'); ?></li>
    <li>{cut abcdefgasdasd 6} => 输出 <code class="scode">abcdef...</code></li>
</ul>

二次开发

如果需要对模板引擎进行修改或者二次开发,你可以通过配置(如何配置请看这里编译模板规则配置app/configs/app.config.php 添加模板解析规则去支持新的标签。

关于模板引擎的详细实现请阅读 herosphp/core/Template.class.php