创建自定义PHP模板

Mos*_*ses 1 php templates

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

  1. 从template.tpl include中提取所有站点范围的HTML元素.
  2. 能够在template.tpl中动态分配内容(如<title><script>)
  3. 尽可能高效和可扩展.

最后,我的模板系统看起来像这样:

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'
?>
Run Code Online (Sandbox Code Playgroud)

randomPage.tpl

<h1><?=$pageTitle?></h1>
<p>Some random page's content</p>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

最近,我遇到了一个聪明的框架,它允许我将我的系统从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}
Run Code Online (Sandbox Code Playgroud)

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

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

ale*_*lex 8

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

这是一个未经测试的例子.它将封装所有变量,因此您不会污染全局命名空间.

的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()));
Run Code Online (Sandbox Code Playgroud)

意见/ home.php

<h1>Home</h1>
<?php echo $content; ?>
Run Code Online (Sandbox Code Playgroud)