1

几年前,我用 PHP 创建了一个小型网站,该网站现在已经发展壮大,您可能会猜到它相当混乱。尽管我确实有一个单独的模板来完成 html 的最终输出,但我最终还是不得不在代码的“业务逻辑”部分处理大量的 html。

我的主要问题是页面包含各种小部件(如“最新条目”、广告等),这些小部件在页面之间发生变化,因此它们的 html-(模板-)代码不能硬编码到模板中。事实上,即使是主内容容器也是一个小部件,因为页面结构(或布局)总是相同的。

所以我最终得到了一个在代码的业务逻辑部分生成的包含 $templateData['mainContent']、$templateData['widget1']、$templateData['widget2'] 等的数组。

我该如何解决这个问题?

看了一会儿,似乎有两种方法可以解决这个问题:

  1. 显而易见的方法是使用具有继承和包含的专用模板语言,就像 django 一样,但考虑到这些语言的复杂性,我不太愿意再学习其中一种。另外,我在使用 django 期间注意到的一点是,它并不是特别快(尤其是因为它诱使人们也将这种模板用于 css 和 javascript)。

  2. 另一种选择是使用 PHP 本身提供的模板功能。但这意味着每个小部件都有自己的 php 模板,并通过包含模板文件生成其 html 代码,并使用输出缓冲捕获结果。这是一个好主意吗?因为我仍然在逻辑部分内的变量中使用 HTML。此外,这种滥用输出缓冲不是为了它不打算用于的东西吗?那么性能呢?(我正在写入/读取/刷新的缓冲区在哪里?调用 ob_* 函数有多贵?)

据我所见,这两种变体都有拥护者。就我个人而言,我更喜欢选项 2(因为这是我已经在做的事情),但是 html-in-variables 感觉非常错误,我怀疑我是否会以这种方式解决任何问题。

是否有其他选择?你是如何解决这个问题的?

4

5 回答 5

2

我以前遇到过这个问题,并且我的想法/问题与您目前的想法几乎相同。我强迫自己学习模板语言。输入 Twig一种受 Django 模板语言影响的轻量级模板语言。它的占用空间非常小,在内存使用方面几乎是不可见的。

给自己一些时间来适应它,然后再决定你是否想要它。

于 2011-04-04T10:59:11.300 回答
2

将这些漂亮的数组分配给 smarty 并学习在 tpl 文件上迭代它们。这比看起来容易。当您需要多次包含同一段 html/php 时,您只需重新包含它。

http://www.smarty.net/

smarty快速可靠吗?是的

于 2011-04-04T11:03:58.790 回答
2

为什么不让每个小部件只包含它的模板?
因此,您只需从主模板中调用小部件。

于 2011-04-04T11:05:15.763 回答
1

一种想法是创建模板驱动/视图驱动的页面,以访问 Web 服务或 API,为您需要的所有数据提供服务。

您可以将 URL 链接到模板,并且模板通过 Web 服务(AJAX 样式)或静态调用数据检索功能。

然后,业务逻辑部分仅限于处理输入和准备通用检索,并提供过滤或排序等机制,而模板确定如何过滤、如何排序或如何分页等。

我建议您使用适当的对象关系映射 (ORM) 框架/ ActiveRecord模式(参见StackOverflowWikipedia上的此处),它允许您使用可由模板重新配置以满足其需求的通用检索对象(如前面提到的过滤和排序)。

实际检索将在需要时通过调用检索对象上的特殊方法(如 或类似方法find())在模板中完成。load()

编辑:
关于其他人建议的模板框架,我不太喜欢它们,因为它们经常重复 PHP 中已经找到的功能,通过添加另一个解析器层来重新发明轮子;但是,您从任何体面的模板框架中获得的好处是缓存(可能有一些基于 PHP 的模板引擎也支持缓存)。

于 2011-04-04T11:00:52.097 回答
0

多种选择

有几种方法可以做到这一点。

以下是一些值得考虑的策略:

  • 使用封装(包含)在 PHP 对象方法中的普通 PHP 视图。这就是CakePHP实现其视图的方式。

  • 将带有 <% %> 等占位符的 HTML 文件加载为纯文本,并使用正则表达式替换内容

  • 加载 HTML 文件并将其解析为 XML 或 HTML。然后,您可以使用类似Symfony 的 CssSelector 组件来添加、删除或替换内容,就像使用 jQuery 一样。然后,将其渲染回纯文本和echo它。

  • 使用以下流行的模板引擎之一:

  • ...


最佳选择?

哪个选项最好?我想这取决于您的用例:

  • 纯 PHP 将始终为您提供最佳性能,但它也是最不可读的选项。

  • 如果您喜欢以与使用 jQuery 相同的方式浏览 HTML 代码,则可能需要使用DOM-Query 之类的库。

  • 如果您正在寻找一个可以在后端和前端使用的经过良好测试的模板引擎,Mustache是您的最佳选择!

  • ...

于 2014-03-13T21:39:12.660 回答