在PHP模板做的权利。。。怎样

在PHP模板做的权利。。。怎样,php,html,template-engine,templating,Php,Html,Template Engine,Templating,几年前,我用PHP创建了一个小网站,现在这个网站已经发展壮大了,你可能会猜到它相当混乱。虽然我有一个单独的模板来完成html的最终输出,但我最终还是要在代码的“业务逻辑”部分处理很多html 我的主要问题是,页面包含各种小部件(如“最新条目”、广告等),这些小部件在页面之间会发生变化,因此它们的html-(模板)代码无法硬编码到模板中。事实上,甚至主内容容器也是一个小部件,因为页面结构(或布局)总是相同的 因此,我最终得到了一个包含$templateData['mainContent']、$te

几年前,我用PHP创建了一个小网站,现在这个网站已经发展壮大了,你可能会猜到它相当混乱。虽然我有一个单独的模板来完成html的最终输出,但我最终还是要在代码的“业务逻辑”部分处理很多html

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

因此,我最终得到了一个包含$templateData['mainContent']、$templateData['widget1']、$templateData['widget2']等的数组,这些数组是在代码的业务逻辑部分生成的

我如何解决这个问题

环顾四周一段时间后,似乎有两种方法可以解决这个问题:

  • 最明显的方法是像django那样使用一种带有继承和包含的专用模板语言,但考虑到这些语言的复杂性,我真的不愿意再学习另一种。在我与django相处的过程中,我还注意到它的速度并不特别快(特别是因为它也吸引人们使用css和javascript模板)

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

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


    还有别的选择吗?您是如何解决这个问题的?

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


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

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


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

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

    您可以将URL链接到模板,模板通过web服务(AJAX样式)或静态方式调用数据检索函数

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

    我建议您使用适当的对象关系映射(ORM)框架/模式(请参阅或中的),该框架/模式允许您使用通用检索对象,这些对象可以由模板重新配置以满足其需要(例如前面提到的过滤和排序)

    然后,当需要时,通过调用特殊方法(如
    find()
    load()
    或检索对象上的类似方法)在模板中执行实际检索

    编辑:

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

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

    您可以将URL链接到模板,模板通过web服务(AJAX样式)或静态方式调用数据检索函数

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

    我建议您使用适当的对象关系映射(ORM)框架/模式(请参阅或中的),该框架/模式允许您使用通用检索对象,这些对象可以由模板重新配置以满足其需要(例如前面提到的过滤和排序)

    然后,当需要时,通过调用特殊方法(如
    find()
    load()
    或检索对象上的类似方法)在模板中执行实际检索

    编辑:

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

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

    smarty是否快速可靠?是

    将那些漂亮的数组分配给t