【问题标题】:Find occurances of custom tag in HTML, perform function and replace tag with function output在 HTML 中查找自定义标签的出现,执行功能并用功能输出替换标签
【发布时间】:2011-03-12 16:37:11
【问题描述】:

这可能是一个非常简单的问题,所以很抱歉没有更具挑战性!

我正在开发使用模板系统的内部 CMS。

为了使这个 CMS 尽可能可扩展,我想使用“模块”。因此,我想在模板文件中放置代表模块的自定义 HTML 标签。

这看起来像:

<p><Module name="newsTicker" property="value" anotherProperty="anotherValue" /></p>

我通过以下方式获取我的模板文件:

ob_start();
include "templatefile.tpl";
$buffer= ob_get_contents();
ob_end_clean();

现在我想查看$buffer 的内容,对于<Module name="moduleName" /> 的每次出现我想include "moduleName.class.php",创建该类的一个新实例,运行该模块的getOutput() 函数并将返回 <Module /> 标记所在位置的值。

我不知道该怎么做...:/有什么想法吗?

如果您不明白,请考虑新闻行情。我可能会编写一些代码来查看我数据库中的新闻表并列出 10 个最新新闻故事,然后将其输出到 html <ul>。我想将其抽象化,以便可以在许多页面上使用。所以在我的主页模板中,我可能有标签<Module name="newsTicker" />。现在,当我访问主页时,我需要查看主页的 tpl 文件,我会发现它在哪里显示 <Module name="newsTicker" />,我将提取 name 属性并包含一个基于该名称的类(在本例中它将是newsTicker.class.php)。这将有一个名为getOutput() 的函数,因此我将能够类似于:$output = $current_module->getOutput();,然后我需要返回到我的 tpl 文件并将原始<Module name="newsTicker" /> 更改为$output 的内容。

感谢您的帮助。 :)

汤姆

【问题讨论】:

    标签: php regex templates content-management-system


    【解决方案1】:
    • 使用 DOMDocument 查找 Module 元素(我个人只会使用小写字母)。
    • 存储name 属性。
    • include_once 基于 name 属性的类(如果使用自动加载则跳过)。
    • 使用$class = new $name
    • 删除原始Module DOM 元素和appendChild$class->getOutput()

    【讨论】:

    • 看起来不错,但是如果这些模板文件不是完整的 HTML 文件,它会起作用吗?例如,我将使用的文件可能只是页面中的一个内容块,而不是整个 HTML 文档。
    • @Thomas 是的,它应该可以工作,但是当您 $dom->saveHTML() 时,您可能需要从 body 元素中提取。
    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多