模板--为什么和如何在PHP中使用它们

模板

是否你面临着创建由一个编程人员(可能就是你)和一个设计人员同时进行创作的网站?你不知道如何使工作对你俩来说变得容易吗?我来给你答案:使用FastTemplate来使你的站点更容易定制!

  好了,你可能想知道为什么你要使用FastTemplates。

·可以在几秒钟改变你的整个站点的外观
·抽象程序设计,没有垃圾HTML代码
·设计人员不需要关心全部的"模糊"代码
·令人惊讶地快
·更容易重用旧的模版(对普通的表单而说)

  FastTemplate源于一个有同样名称的Perl软件包(可以在CPAN上找到)。你可以下载PHP 的版本从它的主页(本站下载地址为:http://www.phpe.net/downloads/1.shtml)。你只需要其中的一个类的文件(class.FastTemplate.php)。

  让我首先解释一下在使用模板生成一个页面与简单地通过echo或print 将页面输出之间有什么不同吧。
简单地使用echo/print的方法很适合编写短的脚本,但是不能帮助你更好的组织和定制。模板在另一方面给
了你创建多国语言站点的能力,只是通过改动一个参数。他们可以促使你更关心你要做的。

  在开始编码之前不要害怕思考。它可能会花费一些时间,但是这些花费会随着项目的发展对你有所回报。

  那么,如何应用FastTemplate呢?首先你需要先进行一个简单地调用:

<?php $tpl=new FastTemplate ("path");
?>
传递给它一个路径,是所有你的模板文件存放的目录。它返回一个对象,你可以用它进行参
数赋值,生成页面等等。

  FastTemplate是基于这样一种假设:一个很大的页面是由很多小的部分组成的。每一个部分有一个唯一
的名字。最小的部分是赋值给这样有着唯一名字的一段正常的文本字符串。这个可以通过 <?php
$tpl->assign(NAME, "text");
?>
来完成。现在,如果你的一个模板包含{NAME},FastTemplate 就知道你
的意图了。

  另外,FastTemplate需要知道你想如何调用你的模板。你需要通过传递一个相关数组(associative
array)给 <?php $tpl->define(); ?>
来给它一个提示。
<?php
$tpl->define(array(foo => "foo.tpl",
bar => "bar.tpl"));
?>
  这些赋值将分别给foo和bar以不同的文件(名为foo.tpl和bar.tpl)。

  现在你想让FastTemplate替换在模板foo中的所有{MACROS}为相应的值。通过发出命令

<?php
$tpl->parse(PAGECONTENT, "foo");
?>
来实现。 这个命令将把模板"foo"的内容赋给PAGECONTENT。   当然,我们还没有做完,因为模板bar中为主要的页面定义,FastTemplate需要替换其中的
{PAGECONTENT}宏。我们也需要给PAGETITLE赋值,如下所做: <?php
$tpl->assign(PAGETITLE, "FooBar test");
$tpl->parse(MAIN, "bar");
?>
  容易吧,不是吗?我们现在只需要把它输出: <?php
$tpl->FastPrint(MAIN);
?>
  下面三个文件显示了实际练习中的更多的细节描述。我不知道在现实生活了离了这个技术应如何生活 --
你的设计者会高兴,你的老板会微笑,因为你可以在更短的时间内做更多的事情。

bar.tpl <!-- bar.tpl -->
<HTML>
<HEAD><TITLE>Feature world - {PAGETITLE}</TITLE></HEAD>
<BODY BGCOLOR=BLACK TEXT=WHITE>
<H1>{PAGETITLE}</H1>
{PAGECONTENT}
</BODY>
</HTML>
foo.tpl <!-- foo.tpl -->
很明显示什么都没做。请看{NAME}.
demo.php3 <?php
include "class.FastTemplate.php3";

$tpl = new FastTemplate( ".");
$tpl->define(array(foo => "foo.tpl", bar => "bar.tpl"));

$tpl->assign(NAME, "me");
$tpl->assign(PAGETITLE, "Welcome!");

$tpl->parse(PAGECONTENT, "foo");
$tpl->parse(MAIN, "bar");

$tpl->FastPrint(MAIN);
?>

创建整个表格
  我也写了一个短的例子,用来演示如何通过单行模板来生成整个表格。它很有效,因为你仍然不需要直
接修改HTML文档。

  我们增加一个模板的内容到一个已经定义过的唯一命名的后面来创建HTML表格。这个可以通过在调用
$tpl->parse()时,在模板名前加上一个"."来实现。 <?php
// 将模板foo的内容赋给TPL1
$tpl->parse(TPL1, "foo");

// 在TPL1后附上模板bar的内容
$tpl->parse(TPL1, ".bar");
?>

page.tpl

<HTML>
<HEAD><TITLE>Feature world - {PAGE_TITLE}</TITLE></HEAD>
<BODY BGCOLOR=BLACK TEXT=WHITE>
<H1>{PAGE_TITLE}</H1>
{PAGE_CONTENT}
</BODY>
</HTML>

table.tpl

<TABLE>
<TR> <TH>name</TH> <TH>size</TH> </TR>
{TABLE_ROWS}
</TABLE>

table_row.tpl

<TR>
<TD>{FILENAME}</TD>
<TD>{FILESIZE}</TD>
</TR>

yad.php3

<?php
include "class.FastTemplate.php3";

function InitializeTemplates() {
global $tpl;

$tpl = new FastTemplate( ".");
$tpl->define( array( page => "page.tpl",
table => "table.tpl",
table_row => "table_row.tpl" ) );
}

function ReadCurrentDirectory() {
global $tpl;

$handle = opendir( ".");
while($filename = readdir($handle)) {
$tpl->assign(FILENAME, $filename);
$tpl->assign(FILESIZE, filesize($filename));
$tpl->parse(TABLE_ROWS, ".table_row");
}
closedir($handle);
$tpl->parse(PAGE_CONTENT, "table");
}

function PrintPage($title) {
global $tpl;

$tpl->assign(PAGE_TITLE, $title);
$tpl->parse(FINAL, "page");
$tpl->FastPrint(FINAL);
}

InitializeTemplates();
ReadCurrentDirectory();
Printpage( "Yet Another Demo");
?>

速度讨论

  "Ok," 你可能会说,"一切都太好了。但是它不会影响我的网站的速度吗?"

  不,你的网站可能变得更快。一个简单的原因就是:因为你作为一个编程人员关心的是设计你的应用和编写代码,你的代码将会更有效率,处理相同的任务更容易和更快速。所以,你可能会在上面列出的为什么考虑使用FastTemplate在你的项目中的原因列表中增加另一条理由。

  如果你只是想转换一个已经存在的web站点,性能上的成功可能不会被注意到。我建议在PHP中使用正则表达式缓冲,它将对这种情况有所帮助。因为FastTemplate对每一个宏都使用正则表达式,每一个正则表达式将被只编译一次并且速度上的影响可以忽略不计。

时间: 2024-10-31 01:12:33

模板--为什么和如何在PHP中使用它们的相关文章

如何在VS2008中自定义多项目模板

环境要求:vs2008   目标:自定义模板,当VS2008创建项目时可以使用模板创建   1,在VS中创建项目,并修改至所要求的模板程度 现在假设我的解决方案中有两个项目:   2,File-->Export Template...(创建单个项目模板) 为TestProject1项目创建模板,填写模板description,Finish之后弹出MyExportedTemplate文件夹: 为TestProject2项目创建模板,填写模板description,Finish之后弹出MyExpor

如何在PHP中判断一个网页请求是ajax请求还是普通请求

如何在PHP中判断一个网页请求是ajax请求还是普通请求?你可以通过传递参数的方法来 实现,例如使用如下网址请求:  /path/to/pkphp.com/script.php?ajax 在PHP脚本中使用如下方法判断: if(isset($_GET['ajax'])) { -这是一个ajax请求,然后- } else { -这不是一个ajax请求,然后- } 通过传递_GET参数的方法简单实现了网页请求的判断.但是如果需要这样的功能,这个 方法可能就有弊端,功能需求如下: 1.通过ajax请求

如何在BCB中使用DirectX

这是一个简要的指南,可以指导你如何在BCB中使用DirectX SDK. 我在这里假定你的BCB的安装路径在:C:\Borland\CBuilder\,DirectX SDK在C:\dx5sdk\ 设置 Borland C++ Builder #include 这是许多人遇到的麻烦, Borland在BCB的\Include路径下提供了DirectX的头文件, 如果只是把c:\dx5sdk\sdk\inc\加到BCB的include路径下,它会进行如下步骤: 查找 C:\Borland\Cbui

如何在Word中为字符添加上划线?

    有时,需要在Word中为字符添加上划线.那么如何在Word中为字符添加上划线呢?本文就来介绍一下在Word中为字符添加上划线的方法.     1.双行合一:依次点击"格式→中文版式→双行合一",调出"双行合一"对话框,将光标定在"文字"下面的方框中,按"Shift+ -"键输入上划线,并输入相应的字符,通过预览窗口浏览效果,如果效果满意,点击"确定"即可.     2.插入公式:依次点击"

如何在Word中为字符添加上划线

  有时,需要在Word中为字符添加上划线.那么如何在Word中为字符添加上划线呢?本文就来介绍一下在Word中为字符添加上划线的方法. 1.双行合一:依次点击"格式→中文版式→双行合一",调出"双行合一"对话框,将光标定在"文字"下面的方框中,按"Shift+ -"键输入上划线,并输入相应的字符,通过预览窗口浏览效果,如果效果满意,点击"确定"即可. 2.插入公式:依次点击"插入→对象"

如何在Ruby中编写微服务?

[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采用微服务架构.但是,又有多少相关教程呢?我们来看看这篇关于用Ruby编写微服务的文章吧. 人人都在讨论微服务,但我至今也没见过几篇有关用Ruby编写微服务的.像样的教程.这可能是因为许多Ruby开发人员仍然最喜欢Rails架构(这没什么不好,Rails本身也没什么不好,但是Ruby可以做到的事还有很

数据库-如何在vfp中调用某一特定word文档的邮件合并功能?

问题描述 如何在vfp中调用某一特定word文档的邮件合并功能? 如下操作应该怎么实现? 已经做好了一个需要邮件合并的word模板,插入了合并域,引用了vfp数据库中的数据, 在VFP中通过表单录入数据存入数据库, 将刚才录入的数据通过一个vfp的程序或命令在word文档中进行邮件合并生成需求的文档然后保存到指定位置. 想做这样一个东西,可是最后一步里不知道怎么写.

javascript-nvelocity中的#if()如何在JavaScript中使用?

问题描述 nvelocity中的#if()如何在JavaScript中使用? nvelocity中的if跟JavaScript中的if关键字冲突了,怎么想办法可以用nvelocity中的#if <script type=""text/javascript""> function GetTestType() { var s = document.getElementById(""testType""); $selec

如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)

原文:如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试) 相信很多开发者目前的系统还是Win7或Mac,一般不会为了开发某个程序而重装系统,所以我们就需要用到VMware这类的虚拟机来模拟预期的开发环境.在开始介绍前,给大家说明下我当前的软硬件环境,本文所讲的内容适用于此环境. 软件环境:Windows 7 旗舰版 (x64).VMware Workstation 10,硬件环境:Xeon CPU E3 1230 (4核).       简介 想要安装 Win