PHP中的HTML标记模板

时间:2011-11-17 10:14:04

标签: php html templates template-engine

当我为网站编写PHP代码时,我不喜欢将业务逻辑与表示层混合,因此我倾向于创建标记模板。我已经编写了一个非常轻量级的模板引擎来实现这一点,因为我真的不想转向像Smarty这样的完全成熟的模板框架。

以下是我所做的简化示例:

function renderTemplatePage($page, $params)
{
    $page = readTemplateFile("templates/{$page}");
    $tokens = getTemplateTokens($page);
    foreach($tokens as $token)
    {
        if(substr($token, 0, 6) == "%_TPL_")
        {
            $subPage = renderTemplatePage(tokenToPageName($token), $params);
            $page = str_replace($token, $subPage, $page);
        }
        else
        {
            $page = str_replace($token, $params[$token], $page);
        }
    }
    return $page;
}

示例页面:

<html>
    <head><title>%_PageTitle_%</title></head>
    <body>
        <div id="header">%_TPL_Header_%</div>
        <div id="content">%_TPL_Homepage_%</div>
        <div id="footer">%_TPL_Footer_%</div>
    </body>
</html>

拨打renderTemplatePage("index", array("PageTitle" => "Home"))会产生一个名为“Home”的页面,其中包含来自页眉,主页和页脚模板的内容。

在调用渲染之前,我完成了所有逻辑(包括数据库查询等),因此我可以组建一个大型$params数组,只需执行一次调用就可以全部呈现。

这种方法有什么缺陷吗?有更标准的方法吗?

3 个答案:

答案 0 :(得分:2)

它有缺陷。你如何处理模板特定的逻辑。出于好奇,您将如何处理ifsloops

答案 1 :(得分:0)

有几种方法可以实现逻辑和表示之间的分离(它正式被称为MVC的一部分 - 模型 - 视图 - 控制器方法)。

我想指出的一个方向是XML + XSLT。我们的想法是将您需要的所有信息组合为XML字符串(例如,查看以下URL的输出:http://www.whiteoctober.co.uk/?dumpXML),然后对其执行XSLT转换(请参阅http://www.w3schools.com/xsl/xsl_transformation.asp

PHP中的模板是一场宗教辩论 - 我宁愿不被拖入。我只想说我强烈反对Smarty - 它很笨重,并没有做任何标准的PHP没有做的事情。

答案 2 :(得分:-2)

所有这些自制模板的问题是缺乏现实生活测试 你没有做这样的测试,而是来这里问其他人 一般来说,这不是一个明智的策略,因为你自己的经验是必不可少的,而没有那么多专业人士有足够的时间给你一个扩展答案。虽然总有很多没有经验的用户准备回答。

  

这种方法有什么缺陷吗?

是的,当然。

您宣布don't like mixing business logic with the presentation layer 但是,%_TPL_的内容是什么?它写的是什么?我想,在同样的旧业务逻辑中。那么,你想要的分离在哪里呢?