定制PHP模板引擎

时间:2011-11-01 10:29:03

标签: php templates template-engine

作为我正在研究的大学项目的一小部分(基于MVC的自定义项目管理系统),我需要开发一个模板引擎。我不想使用像Smarty这样的自我系统,因为我自己编写了项目的其他部分,现在不想再回过头来了。

无论如何,到目前为止,我已经设法编写了一些简单的代码,我有一个类,创建一个实例,向实例添加一些数据,然后传入一个模板文件。该文件有一系列标签,如{this},然后被数据替换。简单。

我遇到的问题是循环事物 - 即用户表或类别列表。目前我有一个页面模板文件(users.html),其中包含开始和结束标记,它们之间有一个名为{users}的模板标记。然后我有另一个模板文件(users-detail.html),它显示一个包含用户信息的表格行。我正在创建users-detail.html模板的新实例,添加数据,解析它,然后放置输出(HTML字符串)到数组中。然后我循环这个数组,将所有字符串连接在一起,然后将其分配给users.html模板文件中的{users}标记。

正如你可以从这个解释中看出的那样,它有点像一个小窍门,并且可能有更好的方法来做我想要实现的目标。理想情况下,我希望尽可能避免在模板文件中使用PHP,并且我经常需要在一个模板文件中有多个循环。

如果有人对我如何实现这一点有任何提示/建议,或者我可以遵循的任何教程,以获得一些非常感激的灵感。

提前致谢。

1 个答案:

答案 0 :(得分:1)

之前我见过这种方法(包括循环内部的另一个模板)。我曾经在vbulletin的旧版本上工作,它确实(或做过)了。它使事情变得非常复杂,因为你不能只是为模板添加一个循环 - 没有为每个循环层设置一个全新的模板。

我建议你沿着Smarty的路线走。

经典,这句话:

  

我不想使用像Smarty这样的自我系统,因为我自己写了项目的其他部分,现在不想再回过头来了。

...表示你真的应该只使用Smarty。在现实世界中,自己重新实现某些东西的理由很差。但我就像你一样,我明白你想要自己实现一些东西(因为你想学习,你觉得它很有趣,你是一个完美主义者等等)。只要你按照自己的时间进行,这是个人项目,那就去吧。

值得研究Smarty以了解它是如何工作的(不仅仅是语法,还有它如何编译模板,存储编译版本等)。您是否愿意在PHP中编写一个可以编译模板语言并输出PHP的tokeniser / parser?如果你足够先进,那就去做吧。最简单的是,您会读取{foreach from=$something}之类的标记,并以某种方式将其翻译为<?php foreach ($something as $thing) { ?>。您检查令牌类型等以确保模板标签有效,等等。