创建自定义PHP模板

时间:2011-04-12 02:48:04

标签: php templates

我创建了一个自定义的PHP模板系统,我构建它的方式似乎很低效。我的模板的三个主要目标是:

  1. 从template.tpl include。
  2. 中提取所有网站范围的HTML元素
  3. 能够在template.tpl中动态分配内容(例如<title><script>
  4. 尽可能高效且可扩展。
  5. 最后,我的模板系统看起来像这样:

    randomPage.php

    <?php
    // declare any page specific resources
    $pageTitle = "Random Sub-Title";
    $pageResources = "/css/someRandomCSS.css"
    $pageContent = "/randomPage.tpl"
    // include the generic page template
    include dirname($_SERVER['DOCUMENT_ROOT']).'/includes/template.tpl'
    ?>
    

    randomPage.tpl

    <h1><?=$pageTitle?></h1>
    <p>Some random page's content</p>
    

    template.tpl

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <title>My Site -- <?=$pageTitle?></title>
       <link href="/css/styles.css" rel="stylesheet" type="text/css">
       <link href="<?=pageResources?>" rel="stylesheet" type="text/css">
    </head>
    <body>
       <? include $pageContent ?>
    </body>
    </html>
    

    这个系统的主要问题是,对于每个网页,我需要管理两个文件:一个用于逻辑/数据,另一个用于页面模板。这对我来说似乎效率低下,并且似乎不是一种非常可扩展的方法。

    最近,我遇到了一个聪明的框架,它允许我将我的系统从randomPage.php和randomPage.tpl整合成类似的东西:

    randomSmartyPage.php

    {extends file="template.tpl"}
    {block name=pageTitle}My Page Title{/block}
    {block name=pageResources}
       <link href="/css/someRandomCSS.css" rel="stylesheet" text="text/css">
    {/block}
    {block name=pageContent}My HTML Page Body goes here{/block}
    

    看到这种方法为我提出了三个主要问题:

    1. 我是如何接近我的模板系统的根本缺陷?
    2. 我的原始php代码可以重构,所以我不必为每个网页创建两个文件吗?
    3. 在这种情况下,使用smarty(或者可能是替代框架)会是个好主意吗?

2 个答案:

答案 0 :(得分:8)

  1. 你的代码除了PHP本身之外并没有真正使用任何模板引擎,这很好。我能看到的一个缺陷是你的模板可以访问所有变量,你为它创建的变量都是全局变量。
  2. 两个文件是一个很好的系统,一个用于更改预处理并传递给视图的文件,另一个用于视图本身,包含HTML或其他任何文件。这使您可以轻松交换视图,例如,标准浏览视图和移动浏览器的移动视图。
  3. 这可能是一个好主意,但我坚信using PHP已经足够好了。
  4. 这是一个未经测试的例子。它将封装所有变量,因此您不会污染全局命名空间。

    的index.php

    function view($file, $vars) {
        ob_start();
        extract($vars);
        include dirname(__FILE__) . '/views/' . $file . '.php';
        $buffer = ob_get_contents();
        ob_end_clean();
        return $buffer;
    }
    
    echo view('home', array('content' => Home::getContent()));
    

    视图/ home.php

    <h1>Home</h1>
    <?php echo $content; ?>
    

答案 1 :(得分:2)

您描述的方法是MVC设计模式的一部分。分离应用程序的不同方面。

您似乎已经理解的是PHP is a templating system in itselfothers before you一样{。}}。

看看这个benchmark for a rough comparison of popular template systems