1

由于我一直迟到回答标记为 php 的问题,我实际上知道答案,我想我会尝试自己问一个问题。

长期以来,我一直在对 php 中的自定义模板引擎进行如此多的完整重写,以至于我想征求意见。

简而言之,这是我迄今为止实现的最重要的部分:

  1. 任何 http 请求都会被路由到 handler.php
  2. 根据请求的 URL 实例化控制器并调用该控制器上的方法。
  3. 控制器方法必须返回一个IView兼容的类实例(IView定义一个Render()方法)
    1. 模板引擎为每个以“服务器端”结尾的命名空间执行一些 xpathsprintf('//%s:*[@runat="server"]', $namespaceprefix )
    2. 对于每个找到的标签,它都会查找由标识的 php 类$tag.localName并实例化一个并将其附加到原始模板。
    3. 附加后,原始模板节点将被馈送到“ServerTag”,以便它可以正确初始化
    4. 完全完整的 IView 兼容实例被分配给控制器方法中的临时变量。
  4. 控制器要求将数据从 Model 类推送到执行一些漂亮的 xpath DOM 替换的视图。
  5. 控制器将完全填充的视图返回给main()处理程序,处理程序呈现它。

我的模板基于 xml。一个简单的模板目前看起来像:

<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:red="http://www.theredhead.nl/serverside">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Title will be filed by the View depending on the Controller</title>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/" />
</head>
<body>
    <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
    <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
    <div id="PageHeader">
        <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo" />
    </div>
    <h1>www.theredhead.nl :: Test Template</h1>
    <p>
        Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
    </p>

    <div id="PageFooter">
        Built by
        <br />
        <red:UserProfileLink runat="server" Username="kris" />
    </div>
</body>
</html>

目前,此输出(包括损坏的缩进):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:red="http://www.theredhead.nl/serverside">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Welcome to my site</title>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Main/"/>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Custom/"/>
    <link rel="stylesheet" type="text/css" href="/Stylesheet/Get/Profile/"/>
</head>
<body>
    <!-- the entire body may be reset by the view using it, using XPath and DOM functions -->
    <!-- Usually the PageHeader and PageFooter would be put back after clearing the body  -->
    <div id="PageHeader">
        <img src="/Image/Get/theredhead_dot_nl.png" alt="Site Logo"/>
    </div>
    <h1>www.theredhead.nl :: ModelViewController</h1>
    <p>
        Lorum ipsum dolar sit amet. blah blah blah yackadee schmackadee.
    </p>

    <div id="PageFooter">
        Built by
        <br/>
        <div><div xmlns:profile="http://www.theredhead.nl/profile" class="ProfileBadge" style="font-size : .8em;">
<a style="text-decoration : none; border: none;" href="/Profile/View/kris">
    <img style="float : left;" src="http://www.gravatar.com/avatar/5beeab66d6fe021cbd4daa041330cc86?d=identicon&amp;s=32&amp;r=pg" alt="Gravatar"/>
    &#xA0;Kris
</a>
<br/>
<small>
&#xA0;Rep:&#xA0;1
</small>
</div></div>
    </div>
</body>
</html>
  • 我在这里只触及了冰山一角,是的,一旦我对功能感到满意,我将从输出中删除未使用的 xmlns 属性
  • 我的 mvc 和核心框架中目前只有 200 多个类
  • 我知道现有的解决方案可以做类似的事情,但我想建立自己的。

所以最大的问题是:你对必备功能有什么意见吗?

PS如果有人对完整的源代码感兴趣,请发表评论,当我达到合理的开发人员可用性水平时,我将在我的网站上提供它。

4

3 回答 3

6

为什么不直接使用 PHP 作为您的模板系统。PHP是模板系统

<?php=$variable;?>仅在 HTML 模板中转储有什么问题?您可以使用 foreach 循环等。只需确保在无法访问您不想要的任何变量的范围内运行它。

自从我的 Java/Struts 噩梦以来,我对像这样过于复杂的模板系统有一种根深蒂固的仇恨。您必须深入研究命名空间、xpath、自定义命名空间和所有这些东西,然后才能只更改您需要的一件事。

于 2008-10-13T09:40:35.673 回答
1

在我看来,只有 Phil Reif 真正阅读理解了这个问题及其意图。

那些声称 php模板引擎的人,他们忽略了太多的事实,并且让他们自己对可靠框架很重要的现实世界视而不见。

因此,到目前为止,要点必须具有的功能(尚未实现)是:

  1. 列表。我将处理那些类似于<asp:DataGrid>
  2. 验证。将使用验证控件进行处理。正则表达式、比较等
  3. 输出是强制有效的 xhtml 1.0,至少在 html 5 沉没之前。
  4. 复合自定义控件(基于 xml 模板而不是代码)
  5. inline php code...我正在考虑,<?php ... ?>是一个有效的xml DOMProcessingInstruction 节点,但评委们未定。
  6. 可配置的全局异常处理。

我已经在网上设置了初稿,所以你可以看看,也许会给我一些巧妙的想法。

顺便说一句,我将在接下来的几天内建立并运行表格。目前它只是设计的初稿(代码和风格方面)

仍然希望这里有更多的输入,你们使用和喜欢什么样的控件?(来自任何框架/语言)

克里斯

于 2008-10-15T23:50:48.983 回答
1

这是一篇关于模板引擎的文章:http: //massassi.com/php/articles/template_engines/

你这样做是错的。

于 2008-10-13T10:32:17.177 回答