模板引擎

模板数据

在控制器中增加返回数据, 使用 $this->display() 方法渲染模板

function index()
{
    $this->data['name'] = 'ideaa';
    $this->data['city'] = 'chengdu';
    $this->display($this->data);
}

模板中通过 $data 变量来使用数据

<?= $data['name'] ?? '' ?>
<?= $data['city'] ?? '' ?>

嵌套模板

在a模板中使用 $this->renderTpl() 方法嵌套b模板

$this->renderTpl('hello/b', $data ?? [])

不管嵌套多少层,在模板中总是用 $data 变量来获取模板数据 😄

模板组合

可以使用 renderTpl() 将多个模板组合在一起

$this->renderTpl('hello/a', $data ?? [])
$this->renderTpl('hello/b', $data ?? [])
$this->renderTpl('hello/c', $data ?? [])

扩展模板方法

除了 内置模板方法 外,你可以轻易扩展自己的模板方法。

function h1Name($name)
{
    return '<h1>'.$name.'</h1>';
}

在视图控制器中定义的方法,可以中模板中直接使用

<?= $this->h1Name($data['city'] ?? '') ?>

PHP处理HTML

扩展模板时,不可避免要混编代码,可以使用PHP来输出HTML, 改写后的 h1Name 方法

function h1Name($name)
{
    return self::htmlTag('h1', ['@content' => $name]);
    //return '<h1>'.$name.'</h1>';
}

@content 是一个特殊的key, 表示HTML内容, 视图控制器内置方法 htmlTag 可以生成任意 html 标签

添加属性

为标签添加任意属性

function h1Name($name)
{
    return self::htmlTag('h1', [
        '@content' => $name,
        'style' => 'font-size: 130px',
        'id' => $name,
        'attr-val' => $name
    ]);
}

生成的HTML为:

<h1 style="font-size: 130px" id="chengdu" attr-val="chengdu">chengdu</h1>

复杂HTML

使用支持链式调用的 wrap() 方法,生成复杂的HTML

function h1Name($name)
{
    $h1 = self::htmlTag('h1', [
        '@content' => $name,
        'style' => 'font-size: 130px',
        'id' => $name,
        'attr-val' => $name
    ]);

    return $this->wrap('div', ['class' => 'row'])
        ->wrap('div', ['class' => 'col-md-12'])
        ->html($h1);
}

生成的HTML为

<div class="row">
    <div class="col-md-12">
        <h1 style="font-size: 130px" id="chengdu" attr-val="chengdu">chengdu</h1>
    </div>
</div>

可编程HTML,让UI处理更灵活