什么是模板化引擎
从前面的引言可以看出,无论你是否真正实现过模板化引擎解决方案,至少已经对以这种方式分离应用程序逻辑和表现逻辑的优点很熟悉了。尽管如此,还是有必要正式地定义使用模板化引擎能带来哪些好处,这可能很有用。
简单地讲,模板化引擎的目的在于分离应用程序的业务逻辑和表现逻辑。这样做有几个原因,最重要的两个原因如下所示。
•可以使用同样的代码基为不同目标生成数据:打印、Web、电子数据表、基于电子邮件的报表,等等。如果不使用模板化引擎,则需要针对每种输出目标复制并修改代码,这会带来非常严重的代码冗余,极大地降低了可管理性。
•应用程序设计人员(负责创建和维护界面的人)可以与应用程序开发人员独立工作,因为应用的表现和逻辑并非密不可分地纠缠在一起。此外,因为大多数模板化引擎使用的表现逻辑一般比应用程序所使用编程语言的语法更简单,所以,设计人员不需要为完成其工作而在语言上花费太多精力。
但模板化引擎如何完成这种分离?有趣的是,大多数实现的做法与编程语言非常相似,为完成各种与界面有关的任务提供了良好定义的语法和命令集。这种表现语言(presentational language)嵌入在一系列模板(template)中,每个模板包含应用程序的表现方面,用于格式化和输出应用逻辑组件提供的数据。良好定义的定界符(delimiter)指示了所提供的数据和表现逻辑放在模板中的位置。代码清单19-1 给出这种模板的一般示例。这个例子以Smarty 模板化引擎的语法为基础,这是本章所要讨论的重点。不过,所有流行的模板化引擎都遵循类似的结构,所以如果你已经选择了另一种解决方案,也会发现这些内容是很有用的。
代码清单19-1 典型的模板(index.tpl)
<html>
<head>
<title>{$pagetitle}</title>
</head>
<body>
{if $name eq "Kirk"}
<p>Welcome back Captain!</p>
{else}
<p>Swab the decks, mate!</p>
{/if}
</body>
</html>
关于这个例子有几个重要事项需要注意。首先,定界符(由大括号{}指示)用于告诉模板引擎要检查定界符之间的数据,并可能采取一些动作。最常见的是,此动作只是放置一个特定的变量值。例如,HTML标题标记中的$pagetitle变量指示了这个值(由逻辑部分传入)应该放在哪个位置上。再往下,又用定界符指示了要由引擎解析的if条件的开始和结束处。如果$name 变量设置为Kirk ,则显示一个特殊的消息;否则,显示默认消息。
因为大多数模板化引擎解决方案(包括smarty )提供的功能并非只是插入变量值,所以模板化引擎的框架必须能够完成大量最终对设计人员和开发人员隐藏的大量任务。毫不奇怪,最好通过面向对象编程来实现,从而可以得到封装。代码清单19-2 展示了如何使用Smarty 结合逻辑层准备并提供代码清单19-1 所示的index.tpl模板。现在先不用担心这个Smarty 类的位置,很快就会讲到这一点。在这个例子中,你要注意的是各层是完全分离的,还要理解这是如何实现的。
<?php
// Reference the Smarty class library.
require("smarty/Smarty.class.php");
// Create a new instance of the Smarty class.
$smarty = new Smarty;
// Assign a few page variables.
$smarty->assign("pagetitle","Welcome to the Starship.");
$smarty->assign("name","Kirk");
// Render and display the template.
$smarty->display("index.tpl");
?>
可以看到,索引实现细节都对开发人员和设计人员隐藏。现在你的好奇心应该已经得到了满足,后面我们将正式的介绍smarty.

RSS订阅






