【问题标题】:Creating html templates using PHP使用 PHP 创建 html 模板
【发布时间】:2009-11-25 20:56:53
【问题描述】:

通过环顾和研究现有框架,我学到了很多关于 MVC 框架如何工作的知识。似乎我看到的每个框架都有一个布局,每个控制器中的每个方法都有自己的模板文件。所以会有登录模板、注销模板、注册等等。

我的问题是,您如何以及为什么要在一个文件中为整个页面创建一个模板。假设您想在多个页面上显示登录表单,您是否不必为要显示的每个模板创建登录表单?这不违反不要重复自己的规则(DRY)吗?

到目前为止,我一直在做的事情是创建小块模板,然后将它们组合起来创建每个页面。所以与其做这样的事情,

$title = 'Blah Blah Blah';
$user  = 'Jon Miller';

include 'index.phtml';

<html>
  <head>
    <title><?php echo $title; ?></title>
  </head>
  <body>
    <h3><?php echo $user; ?></h3>
    <form>login form</form>
  </body>
</html>

我一直在这样做

$title = 'Blah Blah Blah';

include 'header.phtml';

$user  = 'Jon Miller';

include 'user.phtml';
include 'login_form.phtml';
include 'footer.phtml';

header.phtml
<html>
  <head>
    <title><?php echo $title; ?></title>
  </head>
  <body>

user.phtml
    <h3><?php echo $user; ?></h3>

login_form.phtml
    <form>login form</form>

footer.phtml
  </body>
</html>

和往常一样,我只想知道正确的方法,以及如何以及为什么......这似乎违反了 DRY 规则。

谢谢

【问题讨论】:

    标签: php html templates dry


    【解决方案1】:

    您应该查看“layouts”和“view helpers”的概念。虽然我已经链接到这些概念的 Zend 框架版本,但其他 MVC 框架(和 MVC 概念)也应该有它们。

    基本理念是您的页面“视图”(例如登录表单)包含在您的站点“布局”中——整个站点使用的通用模板。当您请求具有不同视图(例如用户配置文件)的不同控制器时,该视图也包含在同一布局中。

    要在所有页面上包含类似登录表单的内容,可以使用视图助手。该视图助手可以显示当前用户,或显示登录表单,具体取决于登录状态。视图助手可能包含在布局中,或者包含在特定控制器中(只要 MVC 框架允许某种命名的渲染段)。

    两步“包含”方法比线性包含部分(包括页眉,然后是内容,然后是页脚 - 您现在正在做的)更有效,因为您的模板不必拆分 HTML 标记。 Zend 指南在布局中有 good visual example 的视图模板。

    【讨论】:

    • 链接已损坏
    【解决方案2】:

    一个词:组织。分离页面的每个部分将允许分别查看/编辑它们中的每一个。这个简单的概念非常有益。例如,团队中想要处理登录过程的任何人都可以很容易地发现他们必须编辑login_form.phtml,并且他们可以确定编辑login_form.phtml 不太可能无意中干扰其他功能。

    作为最佳实践,这是我的做法(不完全但类似)。

    $Title = 'Blah Blah Blah';
    $User  = 'Jon Miller';
    
    $ThemeName = "MyGreenPage";
    $Contents  = array("User", "Login_Form");
    
    function Include($FileName) {
        if (file_exists($FileName))
            include $FileName;
    }
    

    MyGreenPage.phtml:

    <html>
      <head>
        <title><?php echo $title; ?></title>
    <?php
        foreach($Contents as $Content)
            Include("$Content.pcss");
    ?>
    <?php
        foreach($Contents as $Content)
            Include("$Content.pjs");
    ?>
      </head>
      <body>
    <?php
        foreach($Contents as $Content)
            Include("$Content.phtml");
    ?>
      </body>
    </html>
    

    User.pcss:

    /*  Some styles needed by User */
    

    User.pjs:

    /*  Some script needed by User */
    

    User.phtml:

        <h3><?php echo $user; ?></h3>
    

    Login_Form.pcss:

    /*  Some styles needed by Login_Form */    
    

    Login_Form.pjs:

    /*  Some script needed by Login_Form */
    

    Login_Form.phtml:

        <form>login form</form>
    

    让我再次提醒您,这并不是我所做的(我确实使用 OOP),因此它可能不会完全按原样运行,您可能需要对其进行编辑。

    【讨论】:

      【解决方案3】:

      使用 PHP 进行 HTML 模板化的最常见方法是使用以下流行的模板引擎之一:


      或者,您可以在 HTML 中放置类似于 &lt;% variablename %&gt; 的占位符。只需加载您的 HTML,执行正则表达式即可找到所有占位符并将其替换为相应的变量。


      或者,您可以加载 HTML,将其解析为 DOM document,然后修改您的 DOM。我创建了库 DOM Query 以便能够使用类似 jQuery 的语法来执行此操作,但您也可以使用 vanilla PHP 或其他几个库之一。


      或者,您可以在前端使用 JavaScript 做一些 HTML 模板。如果你想在前端和后端都做 HTML 模板,你可能需要考虑使用 Mustache,因为 Mustache 模板可以在前端(使用 JavaScript)和后端(使用 PHP)中使用.

      【讨论】:

        【解决方案4】:

        对于我正在处理的这个项目,所有视图都是 XSL 模板。我没有将变量传递给视图,而是在控制器中生成所有 XML 并使用视图对其进行转换。

        我喜欢这种结构,因为我可以将所有模板保存在一个文件中,并按我想要的方式排列它们。它也是一种标准模板语言,非常灵活并且拥有大量文档。到目前为止,效果非常好。

        这种结构的一个很好的例子是WoW Armory 网站(查看源代码)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-10
          • 2013-06-29
          • 2014-10-20
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多