【问题标题】:HTML markup templates in PHPPHP 中的 HTML 标记模板
【发布时间】:2011-11-17 10:14:04
【问题描述】:

当我为网站编写 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" =&gt; "Home")) 将生成一个名为“主页”的页面,其中包含来自页眉、主页和页脚模板的内容。

我在调用渲染之前完成了所有逻辑(包括数据库查询等),因此我可以将一个大的$params 数组聚集起来,然后只需执行一次调用即可将其全部渲染。

这种方法有什么缺陷吗?有没有更标准的方法来做到这一点?

【问题讨论】:

  • PHP 中有许多 模板引擎现成可用。创建自己的东西通常没有什么意义,但如果它适合你的需要,那就太好了。这不是一个真正的问题......
  • 你可以得到一个现成的模板系统,比如 smarty。其他人会更容易跟随。
  • @anttir - 正如我所说,我不想使用 Smarty 或任何其他成熟的模板引擎。
  • @draevor - 我不是要求更换引擎的建议。我只想知道我在定义模板和让我的引擎读取它们的方式上是否存在任何缺陷。通常有这样的“最佳实践”规则。
  • 好吧伙计们 - 让我们同意不同,然后继续……

标签: php html templates template-engine


【解决方案1】:

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

【讨论】:

  • 我上面给出的演示非常简化。我使用%{%%}% 来表示循环,其中每个内部变量索引在迭代中递增。有条件的东西部分是通过动态选择的小型注入模板来处理的(%_TPL?_Var_% 插入模板$params['Var']),也可以通过使用 CSS 更改标记可见性。
  • 我会接受这个,因为它让我更多地思考我如何处理我的条件包含。
【解决方案2】:

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

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

PHP 中的模板化是一场宗教辩论——我不想被卷入其中。可以说我强烈反对 Smarty - 它体积庞大,并且没有标准 PHP 没有做的任何事情。

【讨论】:

  • 我对 XML/XSLT 有一点经验,但我不想完全过渡到它。我会更舒服地直接使用 HTML 标记。并且非常同意 Smarty 方面的观点——我不认为为这种事情建立一个庞大的框架有什么意义。
【解决方案3】:

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

这种方法有什么缺陷吗?

是的,当然。

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

【讨论】:

  • 显然您没有等待我对您的评论的回复,也没有正确阅读代码。 %_TPL_ 表示注入的模板,它传递相同的$params 变量。我所有的业务逻辑都在我的代码顶部完成,然后我以一个 renderTemplatePage 调用结束它,该调用根据我传递给它的参数递归地呈现所有子模板。
  • 你在说什么?假设Homepage.tpl 文件具有以下内容:&lt;h1&gt;Homepage&lt;/h1&gt;&lt;p&gt;%_Message_%&lt;/p&gt;,而$paramsarray("PageTitle" =&gt; "Home", "Message" =&gt; "Hello, world!"),您将得到:pastebin.com/TdDWVAMG
  • 不,我的意思是真实,而不是 helloworld 之一。比如说,一个简单的留言簿消息或新闻标题页。
  • 为什么重要?结果是一样的。如果它确实很重要并且我不明白为什么,请清楚地说明你的观点,而不是变得迟钝并试图让我跳过箍。
  • 试试吧。你会看到:)
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多