如何正确使用PHP模板功能?

时间:2013-04-08 18:20:42

标签: php html templates view reusability

在我谈到这一点之前,让我介绍一下背景:) 我一直在研究MVC框架的视图层,我正在努力开发。我已经创建了几个可重复使用的视图,例如手风琴,下拉菜单,文本编辑器,颜色选择器等。使用此功能,我可以做,例如:

<?php
$template = newView('Template');
$template->panel()->add(newView('Accordion')
    ->add('Accordion entry 1')
    ->add('Accordion entry 2')
    ->add('Accordion entry 3'));
$template->content()->add(newView('Block')
    ->add('Bla bla bla')
    ->add('Bla bla bla')
    ->add('Bla bla bla'));
echo $template;
?>

那种事情。 问题是,为了能够做到这一点,我必须混合PHP和HTML代码。例如:这是我如何生成下拉菜单的HTML:

public function __toString() {
    $output =
        '<nav'.$this->_getHeader().'>'.
            $this->_label.
            '<ul>';
    for($i = 0, $l = count($this->_entries), $last = $l - 1; $i < $l; ++$i) {
        if($i === 0) {
           $this->_entries[$i]->addClass('First');
        }
        elseif($i === $last) {
           $this->_entries[$i]->addClass('Last');
        }
        $output .= '<li>'.$this->_entries[$i].'</li>';
    }
    $output .=
            '</ul>'.
        '</nav>';
    return $output;
}

开发人员可以通过使用Firebug美化代码或阅读PHP代码来轻松设计它,但设计师不喜欢它。 为了解决这个问题,我想使用PHP模板系统。例如,设计师可以更容易理解这一点。

<table>
    <?php foreach($users as $user); ?>
    <tr>
        <td><?= $user->firstName ?></td>
        <td><?= $user->lastName  ?></td>
    </tr>
    <?php endforeach; ?>
</table>

我的问题是,如何使用PHP模板创建可重用的视图?例如,假设我有一个视图表示带有图片的图片拇指和有关它的详细信息。如果我需要显示包含其中100个的页面,我该怎么办?我应该要求观看100次吗?它会被该死的慢速磁盘执行/解析/加载100次吗? 我不知道如何用templaetes构建某种“lego-style”视图层。你有什么想法甚至是例子吗?

感谢阅读。

1 个答案:

答案 0 :(得分:2)

为防止重复读取文件,您可以加载一次文件并将其内容保存到变量中。

重复行是视图的责任,不希望出现在模板内部。

至于模板本身,我建议避免使用纯PHP模板来支持带有变量/占位符的被动模板,如下所示:

<!-- table.tpl - Template for table. -->
<table>
{{rows}}
</table>

<!-- table-row.tpl - Template for table row. -->
<tr>
    <td>{{first_name}}</td>
    <td>{{last_name}}</td>
</tr>

然后,您可以使用所需的值替换模板变量。例如,在最简单的情况下(真实世界模板当然更复杂):

$tableTpl = file_get_contents('tpl_dir/table.tpl');
$rowTpl   = file_get_contents('tpl_dir/table-row.tpl');

$rows = array(
    array(
        'first_name' => 'Lorem',
        'last_name'  => 'Ipsum'
    ),
    array(
        'first_name' => 'Foo',
        'last_name'  => 'Bar'
    )
);

$rowsFrags = array();

// This loop can be moved to a method of a template engine class.
foreach ($rows as $row) {
    $names = array_keys($row);

    foreach ($names as &$name) {
        $name = '{{' . $name . '}}';
    }

    $rowsFrags[] = str_replace($names, array_values($row), $rowTpl);
}

$rowsCode  = implode("\n", $rowsFrags);
$tableCode = str_replace('{{rows}}', $rowsCode, $tableTpl);

echo $tableCode;