在我谈到这一点之前,让我介绍一下背景:) 我一直在研究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”视图层。你有什么想法甚至是例子吗?
感谢阅读。
答案 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;