几年前我用PHP创建了一个小网站,现在已经发展壮大,你可能会猜到它有点混乱。虽然我确实有一个单独的模板来完成html的最终输出,但我仍然最终在代码的“业务逻辑”部分处理了很多html。
我的主要问题是该页面包含各种小部件(如“最新条目”,广告等),这些小部件在不同页面之间发生变化,因此其html-(模板)代码无法硬编码到模板中。事实上,即使是主要内容容器也是一个小部件,因为页面结构(或布局)始终是相同的。
所以我最终得到了一个带有$ templateData ['mainContent'],$ templateData ['widget1'],$ templateData ['widget2']等的数组,这些数组是在代码的业务逻辑部分生成的。
我该如何解决这个问题?
环顾四周,似乎有两种方法可以解决这个问题:
显而易见的方法是使用带继承的专用模板语言,包括像django那样,但考虑到这些语言的复杂程度,我并不是真的愿意学习另一种语言。我在django花费的时间里注意到的是它并不特别快(特别是因为它诱使人们使用css和javascript的模板)。
另一种选择是使用PHP本身提供的模板功能。但这意味着每个小部件都有自己的php模板,并通过包含模板文件并使用输出缓冲捕获结果来生成其html代码。这是一个好主意吗?因为我仍然在逻辑部分内部的变量内部结束HTML。此外,这不是滥用输出缓冲的东西不是为了它?性能怎么样? (我正在编写/读取/刷新的缓冲区在哪里?对ob_ *函数的调用有多贵?)
从我所看到的,两种变体都有倡导者。我个人更喜欢选项2(因为它是我已经在做的事情),但是html-in-variables感觉非常错误,我怀疑我是否会以这种方式解决任何问题。
还有其他选择吗?你是怎么解决这个问题的?
答案 0 :(得分:2)
之前我遇到过这个问题,而且我现在有几乎相同的想法/问题。我不得不学习模板语言。 Enter Twig一种受Django模板语言影响的轻量级模板语言。它的占用空间非常小,在内存使用方面几乎不可见。
给自己一些时间来适应它,然后决定你是否愿意。
答案 1 :(得分:2)
将那些漂亮的数组分配给smarty并学习在tpl文件上迭代它们。 它比看起来容易。 当你需要多次使用相同的html / php时,你只需要包含它。
智能快速可靠吗?是
答案 2 :(得分:2)
为什么不让每个小部件只包含它的模板?
因此,您只需从主模板中调用小部件即可。
答案 3 :(得分:1)
一个想法是创建访问Web服务的模板驱动/视图驱动页面或提供所需数据的API。
您可以将URL链接到模板,模板可以通过Web服务(AJAX样式)或静态调用数据检索功能。
然后,业务逻辑部分仅限于输入的处理和准备通用检索,并提供例如机制。过滤或排序,而模板决定如何过滤,如何排序或如何分页等。我建议您使用适当的对象关系映射(ORM)框架/ ActiveRecord模式(请参阅here on StackOverflow或Wikipedia),它允许您使用通用检索对象可以通过模板重新配置以满足其需要(例如上述过滤和排序)。
然后在需要时通过调用检索对象上的find()
,load()
或类似方法等特殊方法,在模板中完成实际检索。
编辑:
关于其他人建议的模板框架,我不太喜欢它们,因为它们经常复制已在PHP中找到的功能,通过添加另一个解析器层来重新发明轮子;从任何体面的模板框架中获得的好处是缓存(可能有一些基于PHP的模板引擎也支持缓存)。
答案 4 :(得分:0)
有几种方法可以做到。
这里有几个值得考虑的策略:
使用在PHP对象的方法中封装(包含)的普通PHP视图。这就是 CakePHP 实现其观点的方式。
使用< %%>等占位符加载HTML文件作为纯文本并使用正则表达式替换内容
加载HTML文件并将其解析为XML或HTML。然后,您可以使用 Symfony's CssSelector component 之类的内容来添加,删除或替换内容,就像使用jQuery一样。然后,将其渲染回纯文本并echo
。
使用以下常用模板引擎之一:
...
哪个选项最好?我想这取决于你的用例: