【问题标题】:Bespoke PHP Templating Engine定制 PHP 模板引擎
【发布时间】:2011-11-01 10:29:03
【问题描述】:

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

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

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

正如您可能从该解释中看出的那样,这有点麻烦,并且可能有更好的方法来完成我想要实现的目标。理想情况下,我希望尽可能避免在模板文件中使用 PHP,而且我经常需要在一个模板文件中包含多个循环。

如果有人对我如何实现这一目标有任何提示/建议,或者我可以遵循任何教程以获得一些灵感,我将不胜感激。

提前致谢。

【问题讨论】:

  • 查看 h2o 模板的源代码 - github.com/speedmax/h2o-php - 应该对您有所帮助
  • 您为什么不查看现有模板引擎的代码并从中学习呢?有什么比一个实际的例子更好的呢?

标签: php templates template-engine


【解决方案1】:

我以前见过这种方法(包括循环内部的另一个模板)。我曾经在旧版本的vbulletin 上工作过(或做过)这个。这让事情变得非常复杂,因为您不能只在模板中添加一个循环 - 而不为每一层循环设置一个全新的模板。

我建议你改走Smarty的路线。

经典地,这句话:

我不希望使用像 Smarty 这样的独立系统,因为我已经自己编写了项目的所有其他部分,现在不想再重复了。

... 表示您确实应该只使用 Smarty。在现实世界中,自己重新实现某些东西是一个糟糕的理由。但我和你一样,我理解你想自己实现一些东西(因为你想学习,你觉得它很有趣,你是一个完美主义者,等等)。只要你在自己的时间做这件事,而且这是一个个人项目,那就去做吧。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多