我正在尝试为项目编写 very 基本模板引擎,最后采用this article中描述的方法,该方法编写模板变量,如[@variable]
和只需使用str_replace()
来解析模板并输入变量值。
这非常简单并且似乎运行良好,但尽管我尽了最大努力,但在模板本身中确实需要基本逻辑。我不需要任何复杂的东西,只需要一个单独的if / else或三元语句。例如,像[if@something?"text":"other text"]
。
在模板中解析基本逻辑可能是一个很好的方法,如上例所示?
更新:
我正在开发一个AJAX重型网站,所以我有一个接收请求的PHP AJAX控制器,然后返回一个JSON编码的响应。这是一个例子:
AJAX handler.php:
...
else if($req == 'getContent')
{
$template = new Template('template.tpl');
$template->setData(array(
'date' => time(),
'var' => 'foo',
'foo' => 'bar'
));
$response = array(
'error' => null,
'content' => template->getOutput()
);
}
...
echo json_encode($response);
template.tpl:
lots and lots and lots of HTML
........
variables [@date] mixed in [@foo] somewhere with HTML [@bar]
........
lots and lots and lots of HTML
如果我没有使用模板引擎(在使用str_replace()
获取后使用file_get_contents()
将变量值放入模板中),那么我必须这样做:
AJAX handler.php:
...
else if($req == 'getContent')
{
$output = '
lots and lots and lots of HTML' . time() . '
........
variables ' . $foo . ' mixed in ' . $bar . 'somewhere with HTML
........
lots and lots and lots of HTML
';
$response = array(
'error' => null,
'content' => $output
);
}
...
echo json_encode($response);
我在这里要完成的重点是从我的AJAX处理程序中分离大量的HTML文本块(在某些情况下,完全是整个页面主体),而是将它们保存在单独的文件中,这些文件更具可读性并使AJAX处理程序变得无比庞大。
答案 0 :(得分:1)
PHP已经是一种模板语言。例如,这就是上面的示例在PHP中的样子:
<? echo (something ? "text" : "other text") ?>
在添加另一层复杂性之前,请三思而后行。
有像Smarty这样的模板库,它们有正当理由,比如缓存,或者你想以安全的方式分离代码和设计(即给设计师一些他们可以在不破坏代码的情况下进行修改)。但是,如果它仅供您自己使用,那么使用本机PHP是一个非常强大的选择。
原因是避免将HTML与PHP混合并使用意大利面条代码
在HTML代码中使用简单的PHP没有任何问题。 (以及你是否在PHP中使用意大利面条代码或者你的新模板语言并没有真正起作用......)
什么是坏的(并导致Spaghetti代码)将大量代码与HTML输出混合在一起,例如计算或准备。这些应始终与HTML分开。
HTML结构中的PHP应该只进行简单的比较,if/then/else
检查,for
/ foreach
循环,以及与输出数据直接相关的任何操作(例如htmlspecialchars
或简单的计算)。
如果坚持这一点,您可以愉快地使用本机PHP来满足您的模板需求。
答案 1 :(得分:0)
也许您可以为函数定义另一个模板定义,例如:
[*function_name][param1,param2,param3]
例如,您的示例:
[*defined][@something,"text","other"]
在模板引擎代码中,您可以编写“已定义”模板函数的逻辑。
只是一个想法!!