2011-11-01 152 views
2

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

无论如何,我已经成功地编写一些简单的,到目前为止,我有一个类,创建它的一个实例,一些数据添加到实例,然后传递一个模板文件。该文件具有一系列标签,例如{this},然后替换为数据。简单。

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

正如你可能从这个解释中得知的那样,它有点不稳定,并且可能有更好的方法来完成我试图实现的目标。理想情况下,我希望尽可能避免在模板文件中使用PHP,并且我经常需要在一个模板文件中有多个循环。

如果任何人有任何关于如何实现这一点的提示/建议,或任何教程,我可以按照获得一些灵感,将不胜感激。

在此先感谢。

+3

查看h2o模板的源代码 - https:// github。com/speedmax/h2o-php - 应该帮助你在路上 – kieran

+1

为什么不看看现有的模板引擎的代码,你有什么需要并从中学习?什么比实际例子更好? – hakre

回答

1

我以前见过这种方法(包括循环内部的另一个模板)。我曾经使用旧版本的vbulletin,该版本确实(或做过)。它让烦人的事情变得复杂起来,因为你不能只为模板添加一个循环 - 没有为每个循环层设置一个全新的模板。

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

经典,这样的说法:

我不希望使用关闭自拍系统,如Smarty的,因为我已经写了项目的每个另一部分自己,不想回去现在。

...表明你真的应该只是使用Smarty。在现实世界中,这将是你自己重新实现某些东西的可靠理由。但我喜欢你,并且我明白你想要自己实现某些东西(因为你想学习,你觉得它很有趣,你是一个完美主义者等等)。只要你在你自己的时间做,这是一个个人项目,去做吧。

研究Smarty是如何工作的(不仅仅是语法,而且它是如何编译模板,存储编译版本等)值得研究。你很自在地用PHP编写一个记号器/解析器,它可以编译你的模板语言并输出PHP吗?如果你足够先进的话,就去做吧。最简单的是,你阅读{foreach from=$something}这样的标签,并以某种方式将其翻译为<?php foreach ($something as $thing) { ?>。您检查标记类型等以确保模板标记有效,等等。