我不打算仅针对PHP选择模板引擎。我选择不使用像Smarty这样的模板引擎,因为我想学习如何使用PHP和HTML正确设计模板。有人可以提供有关如何设计模板页面的链接或示例吗?
答案 0 :(得分:17)
只需为if / for / foreach控制语言结构使用替代PHP语法,该语言结构是专门为此目的而设计的:
<h1>Users</h1>
<?php if(count($users) > 0): ?>
<table>
<thead>
<tr>
<th>Id</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
<?php foreach($users as $user): ?>
<tr>
<td><?php echo htmlentities($user->Id); ?></td>
<td><?php echo htmlentities($user->FirstName); ?></td>
<td><?php echo htmlentities($user->LastName); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<p>No users in the database.</p>
<?php endif; ?>
我还建议为非常相似的HTML输出创建视图助手,并使用它们而不是重复的HTML代码。
答案 1 :(得分:9)
真的不是那么困难。
Non-PHP goes out here
<?php # PHP goes in here ?>
More non-PHP goes out here
<?php # More PHP goes in here ?>
答案 2 :(得分:7)
function returnView($filename,$variables){
ob_start();
$htmlfile = file_get_contents($filename);
foreach($variables as $key=>$value){
$htmlfile = str_replace("#".$key."#", $value, $htmlfile);
}
echo $htmlfile;
return ob_get_clean();
}
//htmlfile
<html>
<title>#title#</title>
</html>
//usage
echo returnView('file.html',array('title'=>'hello world!');
我的框架我有加载视图的功能,然后在布局中将其删除:
public function returnView(){
ob_start();
$this->loader();
$this->template->show($this->controller,$this->action);
return ob_get_clean();
}
布局如下所示:
<html>
<head>
<title><?php echo $this->layout('title'); ?></title>
</head>
<body>
<?php echo $this->layout('content'); ?>
</body>
</html>
答案 3 :(得分:1)
您可能想要考虑的是,如果您选择MVC风格的方法,如果您将模板包含在对象(其类方法之一)中,那么模板文件中的$this
将指向你从中调用它的对象。
如果您想确保模板的某种封装,即如果您不想依赖全局变量来传递动态数据(例如,从数据库中),这将非常有用。
答案 4 :(得分:0)
我已经使用了各种模板引擎,并设计了自己的模板引擎,随着时间的推移越来越精细。我认为最好通过使用本机php的东西来保持它尽可能简单,而不是创建精细的功能。 (这篇文章有一些好处:Boring Architecture is Good)。我发现在几个月或几年后回到项目时,可读性和维护性更好。
例如:
<?
$name="john";
$email="john@xyz.com";
require "templates/unsubscribe.php";
- templates / unsubscribe.php -
<?
$o=<<<EOHTML
Hi $name, sorry to see you go.<BR>
<input type=input name=email value=$email>
<input type=submit value='Unsubscribe'>
EOHTML;
echo $o;
答案 5 :(得分:0)
使用理查德的例子,但更简单:
<h1>Users</h1>
<? if(count($users) > 0): ?>
<table>
<thead>
<tr>
<th>Id</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
<? foreach($users as $user): ?>
<tr>
<td><?= htmlentities($user->Id) ?></td>
<td><?= htmlentities($user->FirstName) ?></td>
<td><?= htmlentities($user->LastName) ?></td>
</tr>
<? endforeach ?>
</tbody>
</table>
<? else: ?>
<p>No users in the database.</p>
<? endif ?>