搜档网
当前位置:搜档网 › 什么是模板引擎

什么是模板引擎

什么是模板引擎
什么是模板引擎

什么是模板引擎.txt如果你看到面前的阴影,别怕,那是因为你的背后有阳光!我允许你走进我的世界,但绝不允许你在我的世界里走来走去。什么是模版引擎

不知道从什么时候开始,有人开始对?HTML?内嵌入?Server?Script?觉得不太满意。然而不论是微软的?ASP?或是开放源码的?PHP,都是属于内嵌?Server?Script?的网页伺服端语言。因此也就有人想到,如果能把程序应用逻辑?(或称商业应用逻辑)?与网页呈现?(Layout)?逻辑分离的话,是不是会比较好呢?

其实这个问题早就存在已久,从交互式网页开始风行时,不论是?ASP?或是?PHP?的使用者都是身兼程序开发者与视觉设计师两种身份。可是通常这些使用者不是程序强就是美工强,如果要两者同时兼顾,那可得死掉不少脑细胞...

所以模版引擎就应运而生啦!模版引擎的目的,就是要达到上述提到的逻辑分离的功能。它能让程序开发者专注于资料的控制或是功能的达成;而视觉设计师则可专注于网页排版,让网页看起来更具有专业感!因此模版引擎很适合公司的网站开发团队使用,使每个人都能发挥其专长!

就笔者接触过的模版引擎来说,依资料呈现方式大概分成:需搭配程序处理的模版引擎和完全由模版本身自行决定的模版引擎两种形式。

在需搭配程序处理的模版引擎中,程序开发者必须要负责变量的呈现逻辑,也就是说他必须把变量的内容在输出到模版前先处理好,才能做?assign?的工作。换句话说,程序开发者还是得多写一些程序来决定变量呈现的风貌。而完全由模版本身自行决定的模版引擎,它允许变量直接?assign?到模版中,让视觉设计师在设计模版时再决定变量要如何呈现。因此它就可能会有另一套属于自己的模版程序语法?(如?Smarty)?,以方便控制变量的呈现。但这样一来,视觉设计师也得学习如何使用模版语言。

模版引擎的运作原理,首先我们先看看以下的运行图:

一般的模版引擎?(如?PHPLib)?都是在建立模版对象时取得要解析的模版,然后把变量套入后,透过?parse()?这个方法来解析模版,最后再将网页输出。

对?Smarty?的使用者来说,程序里也不需要做任何?parse?的动作了,这些?Smarty?自动会帮我们做。而且已经编译过的网页,如果模版没有变动的话,?Smarty?就自动跳过编译的动作,直接执行编译过的网页,以节省编译的时间。

使用Smarty的一些概念

在一般模版引擎中,我们常看到区域的观念,所谓区块大概都会长成这样:

区域内容

这些区块大部份都会在?PHP?程序中以?if?或?for,?while?来控制它们的显示状态,虽然模版

看起来简洁多了,但只要一换了显示方式不同的模版,?PHP?程序势必要再改一次!

在?Smarty?中,一切以变量为主,所有的呈现逻辑都让模版自行控制。因为?Smarty?会有自己的模版语言,所以不管是区块是否要显示还是要重复,都是用?Smarty?的模版语法?(if,?foreach,?section)?搭配变量内容作呈现。这样一来感觉上好象模版变得有点复杂,但好处是只要规划得当,?PHP?程序一行都不必改。

由上面的说明,我们可以知道使用Smarty?要掌握一个原则:将程序应用逻辑与网页呈现逻辑明确地分离。就是说?PHP?程序里不要有太多的?HTML?码。程序中只要决定好那些变量要塞到模版里,让模版自己决定该如何呈现这些变量?(甚至不出现也行)?。

Smarty的基础

安装Smarty

首先,我们先决定程序放置的位置。

Windows下可能会类似这样的位置:「?d:\appserv\web\demo\?」。

Linux下可能会类似这样的位置:「?/home/jaceju/public_html/?」。

到Smarty的官方网站下载最新的Smarty套件:https://www.sodocs.net/doc/e216816758.html,。

解开?Smarty?2.6.0?后,会看到很多档案,其中有个?libs?资料夹。在?libs?中应该会有?3?个?class.php?檔?+?1?个?debug.tpl?+?1?个?plugin?资料夹?+?1?个?core?资料夹。然后直接将?libs?复制到您的程序主资料夹下,再更名为?class?就可以了。就这样?没错!这种安装法比较简单,适合一般没有自己主机的使用者。

至于?Smarty?官方手册中为什么要介绍一些比较复杂的安装方式呢?基本上依照官方的方式安装,可以只在主机安装一次,然后提供给该主机下所有设计者开发不同程序时直接引用,而不会重复安装太多的?Smarty?复本。而笔者所提供的方式则是适合要把程序带过来移过去的程序开发者使用,这样不用烦恼主机有没有安装?Smarty?。

程序的资料夹设定

以笔者在Windows安装Appserv为例,程序的主资料夹是「d:\appserv\web\demo\」。安装好Smarty后,我们在主资料夹下再建立这样的资料夹:

在?Linux?底下,请记得将?templates_c?的权限变更为?777?。Windows?下则将其只读取消。

第一个用Smarty写的小程序

我们先设定?Smarty?的路径,请将以下这个档案命名为?main.php?,并放置到主资料夹下:

main.php:

include?"class/Smarty.class.php";?

define(@#__SITE_ROOT@#,?@#d:/appserv/web/demo@#);?//?最后没有斜线?

$tpl?=?new?Smarty();?

$tpl->template_dir?=?__SITE_ROOT?.?"/templates/";?

$tpl->compile_dir?=?__SITE_ROOT?.?"/templates_c/";?

$tpl->config_dir?=?__SITE_ROOT?.?"/configs/";?

$tpl->cache_dir?=?__SITE_ROOT?.?"/cache/";?

$tpl->left_delimiter?=?@#<{@#;?

$tpl->right_delimiter?=?@#}>@#;?

?>?

照上面方式设定的用意在于,程序如果要移植到其它地方,只要改?__SITE_ROOT?就可以啦。?(这里是参考?XOOPS?的?)

Smarty?的模版路径设定好后,程序会依照这个路径来抓所有模版的相对位置?(范例中是?@#d:/appserv/web/demo/templates/@#?)?。然后我们用?display()?这个?Smarty?方法来显示我们的模版。

接下来我们在?templates?资料夹下放置一个?test.htm:(扩展名叫什么都无所谓,但便于视觉设计师开发,笔者都还是以?.htm?为主。)

templates/test.htm:

?

?

?

<{$title}>?

?

?

<{$content}>?

?

?

现在我们要将上面的模版显示出来,并将网页标题?($title)?与内容?($content)?更换,请将以下档案内容命名为?test.php?,并放置在主资料夹下:

test.php:

require?"main.php";?

$tpl->assign("title",?"测试用的网页标题");?

$tpl->assign("content",?"测试用的网页内容");?

//?上面两行也可以用这行代替?

//?$tpl->assign(array("title"?=>?"测试用的网页标题",?"content"?=>?"测试用的网页内容"));?

$tpl->display(@#test.htm@#);?

?>?

请打开浏览器,输入?http://localhost/demo/test.php?试试看(依您的环境决定网址),应该会看到以下的画面:

再到?templates_c?底下,我们会看到一个奇怪的资料夹?(%%179)?,再点选下去也是一个奇怪的资料夹?(%%1798044067)?,而其中有一个档案:

templates_c/%%179/%%1798044067/test.htm.php:

?

?

?

?

<?php?echo?$this->_tpl_vars[@#title@#];??\>?

?

?

_tpl_vars[@#content@#];??\>?

?

?

没错,这就是?Smarty?编译过的档案。它将我们在模版中的变量转换成了?PHP?的语法来执行,下次再读取同样的内容时,?Smarty?就会直接抓取这个档案来执行了。

最后我们整理一下整个?Smarty?程序撰写步骤:

Step?1.?加载?Smarty?模版引擎。

Step?2.?建立?Smarty?对象。

Step?3.?设定?Smarty?对象的参数。

Step?4.?在程序中处理变量后,再用?Smarty?的?assign?方法将变量置入模版里。

Step?5.?利用?Smarty?的?display?方法将网页秀出。

如何安排你的程序架构

上面我们看到除了?Smarty?所需要的资料夹外?(class?、?configs?、?templates?、?templates_c)?,还有两个资料夹:?includes?、?modules?。其实这是笔者模仿?XOOPS?的架构所建立出来的,因为?XOOPS?是笔者所接触到的程序中,少数使用?Smarty?模版引擎的架站程序。所谓西瓜偎大边,笔者这样的程序架构虽没有?XOOPS?的百分之一强,但至少给人看时还有?XOOPS?撑腰。

includes?这个资料夹主要是用来放置一些?function?、?sql?檔,这样在?main.php?就可以将它们引入了,如下:

main.php:

include?"class/Smarty.class.php";?

define(@#__SITE_ROOT@#,?@#d:/appserv/web/demo@#);?//?最后没有斜线?

//?以?main.php?的位置为基准?

require_once?"includes/functions.php";?

require_once?"includes/include.php";?

$tpl?=?new?Smarty();?

$tpl->template_dir?=?__SITE_ROOT?.?"/templates/";?

$tpl->compile_dir?=?__SITE_ROOT?.?"/templates_c/";?

$tpl->config_dir?=?__SITE_ROOT?.?"/configs/";?

$tpl->cache_dir?=?__SITE_ROOT?.?"/cache/";?

$tpl->left_delimiter?=?@#<{@#;?

$tpl->right_delimiter?=?@#}>@#;?

?>?

modules?这个资料夹则是用来放置程序模块的,如此一来便不会把程序丢得到处都是,整体架构一目了然。

上面我们也提到?main.php?,这是整个程序的主要核心,不论是常数定义、外部程序加载、共享变量建立等,都是在这里开始的。所以之后的模块都只要将这个档案包含进来就可以啦。因此在程序流程规划期间,就必须好好构思?main.php?中应该要放那些东西;当然利用?include?或?require?指令,把每个环节清楚分离是再好不过了。

在上节提到的?Smarty?程序?5?步骤,?main.php?就会帮我们先将前?3?个步骤做好,后面的模块程序只要做后面两个步骤就可以了。

从变量开始

如何使用变量

从上一章范例中,我们可以清楚地看到我们利用?<{?及?}>?这两个标示符号将变量包起来。预设的标示符号为?{?及?}?,但为了中文冲码及?javascript?的关系,因此笔者还是模仿?XOOPS?,将标示符号换掉。变量的命名方式和?PHP?的变量命名方式是一模一样的,前面也有个?$?字号?(这和一般的模版引擎不同)。标示符号就有点像是?PHP?中的

(事实上它们的确会被替换成这个)?,所以以下的模版变量写法都是可行的:

1.?<{$var}>

2.?<{?$var?}>?

3.?<{$var

}>?

在?Smarty?里,变量预设是全域的,也就是说你只要指定一次就好了。指定两次以上的话,变量内容会以最后指定的为主。就算我们在主模版中加载了外部的子模版,子模版中同样的变量一样也会被替代,这样我们就不用再针对子模版再做一次解析的动作。

而在?PHP?程序中,我们用?Smarty?的?assign?来将变量置放到模版中。?assign?的用法官方手册中已经写得很多了,用法就如同上一节的范例所示。不过在重复区块时,我们就必须将变量做一些手脚后,才能将变量?assign?到模版中,这在下一章再提。

修饰你的变量

上面我们提到?Smarty?变量呈现的风貌是由模版自行决定的,所以?Smarty?提供了许多修饰变量的函式。使用的方法如下:

<{变量|修饰函式}>?

<{变量|修饰函式:"参数(非必要,视函式而定)"}>?

范例如下:

<{$var|nl2br}>?

<{$var|string_format:"%02d"}>?

好,那为什么要让模版自行决定变量呈现的风貌?先看看底下的?HTML?,这是某个购物车结帐的部份画面。

总金额:21,000?元

一般模版引擎的模版可能会这样写:

总金额:{format_total}?元

它们的?PHP?程序中要这样写:

$total?=?21000;?

$tpl->assign("total",?$total);?

$tpl->assign("format_total",?number_format($total));?

?>?

而?Smarty?的模版就可以这样写:?(number_format?修饰函式请到Smarty?官方网页下载)

"?/>

总金额:<{$total|number_format:""}>?元

Smarty?的?PHP?程序中只要这样写:

$total?=?21000;?

$tpl->assign("total",?$total);?

?>?

所以在?Smarty?中我们只要指定一次变量,剩下的交给模版自行决定即可。这样了解了吗?这就是让模版自行决定变量呈现风貌的好处!

控制模版的内容

重复的区块

在?Smarty?样板中,我们要重复一个区块有两种方式:?foreach?及?section?。而在程序中我们则要?assign?一个数组,这个数组中可以包含数组数组。就像下面这个例子:

首先我们来看?PHP?程序是如何写的:

test2.php:

require?"main.php";?

$array1?=?array(1?=>?"苹果",?2?=>?"菠萝",?3?=>?"香蕉",?4?=>?"芭乐");?

$tpl->assign("array1",?$array1);?

$array2?=?array(?

array("index1"?=>?"data1-1",?"index2"?=>?"data1-2",?"index3"?=>?"data1-3"),? array("index1"?=>?"data2-1",?"index2"?=>?"data2-2",?"index3"?=>?"data2-3"),? array("index1"?=>?"data3-1",?"index2"?=>?"data3-2",?"index3"?=>?"data3-3"),? array("index1"?=>?"data4-1",?"index2"?=>?"data4-2",?"index3"?=>?"data4-3"),? array("index1"?=>?"data5-1",?"index2"?=>?"data5-2",?"index3"?=>?"data5-3"));? $tpl->assign("array2",?$array2);?

$tpl->display("test2.htm");?

?>?

而模版的写法如下:

templates/test2.htm:

?

?

?

测试重复区块?

?

?

?

利用?foreach?来呈现?array1?

<{foreach?item=item1?from=$array1}>?

<{$item1}>?

<{/foreach}>?

利用?section?来呈现?array1?

<{section?name=sec1?loop=$array1}>?

<{$array1[sec1]}>?

<{/section}>?

利用?foreach?来呈现?array2?

<{foreach?item=index2?from=$array2}>?

<{foreach?key=key2?item=item2?from=$index2}>?

<{$key2}>:?<{$item2}>?

<{/foreach}>?

<{/foreach}>?

利用?section?来呈现?array1?

<{section?name=sec2?loop=$array2}>?

index1:?<{$array2[sec2].index1}>?

index2:?<{$array2[sec2].index2}>?

index3:?<{$array2[sec2].index3}>?

<{/section}>?

?

?

?

执行上例后,我们发现不管是?foreach?或?section?两个执行结果是一样的。那么两者到底有何不同呢?

第一个差别很明显,就是foreach?要以巢状处理的方式来呈现我们所?assign?的两层数组变量,而?section?则以「主数组[循环名称].子数组索引」即可将整个数组呈现出来。由此可知,?Smarty?在模版中的?foreach?和?PHP?中的?foreach?是一样的;而?section?则是?Smarty?为了处理如上列的数组变量所发展出来的叙述。当然?section?的功能还不只如此,除了下一节所谈到的巢状资料呈现外,官方手册中也提供了好几个?section?的应用范例。

不过要注意的是,丢给?section?的数组索引必须是从?0?开始的正整数,即?0,?1,?2,?3,?...。如果您的数组索引不是从?0?开始的正整数,那么就得改用?foreach?来呈现您的资料。您可以参考官方讨论区中的此篇讨论,其中探讨了?section?和?foreach?的用法。

巢状资料的呈现

模版引擎里最令人伤脑筋的大概就是巢状资料的呈现吧,许多著名的模版引擎都会特意强调这点,不过这对?Smarty?来说却是小儿科。

最常见到的巢状资料,就算论譠程序中的讨论主题区吧。假设要呈现的结果如下:

公告区

站务公告

文学专区

好书介绍

奇文共赏

计算机专区

硬件外围

程序中我们先以静态资料为例:

test3.php:

require?"main.php";?

$forum?=?array(?

array("category_id"?=>?1,?"category_name"?=>?"公告区",? "topic"?=>?array(?

array("topic_id"?=>?1,?"topic_name"?=>?"站务公告")?

)?

),?

array("category_id"?=>?2,?"category_name"?=>?"文学专区",? "topic"?=>?array(?

array("topic_id"?=>?2,?"topic_name"?=>?"好书介绍"),?

array("topic_id"?=>?3,?"topic_name"?=>?"奇文共赏")?

)?

),?

array("category_id"?=>?3,?"category_name"?=>?"计算机专区",? "topic"?=>?array(?

array("topic_id"?=>?4,?"topic_name"?=>?"硬件外围"),?

array("topic_id"?=>?5,?"topic_name"?=>?"软件讨论")?

)?

)?

);?

$tpl->assign("forum",?$forum);?

$tpl->display("test3.htm");?

?>?

模版的写法如下:

templates/test3.htm:

?

巢状循环测试?

?

?

? <{section?name=sec1?loop=$forum}>?

?

<{$forum[sec1].category_name}>?

?

<{section?name=sec2?loop=$forum[sec1].topic}>?

?

??

<{$forum[sec1].topic[sec2].topic_name}>?

?

<{/section}>?

<{/section}>?

?

?

?

执行的结果就像笔者举的例子一样。

因此呢,在程序中我们只要想办法把所要重复值一层一层的塞到数组中,再利用?<{第一层数组[循环1].第二层数组[循环2].第三层数组[循环3].?...?.数组索引}>?这样的方式来显示每一个巢状循环中的值。至于用什么方法呢?下一节使用数据库时我们再提。

转换数据库中的资料

上面提到如何显示巢状循环,而实际上应用时我们的资料可能是从数据库中抓取出来的,所以我们就得想办法把数据库的资料变成上述的多重数组的形式。这里笔者用一个?DB?类别来抓取数据库中的资料,您可以自行用您喜欢的方法。

我们只修改?PHP?程序,模版还是上面那个?(这就是模版引擎的好处~),其中?$db?这个对象假设已经在?main.php?中建立好了,而且抓出来的资料就是上面的例子。

test3.php:

require?"main.php";?

//?先建立第一层数组?

$category?=?array();?

$db->setSQL($SQL1,?@#CATEGORY@#);?

if?(!$db->query(@#CATEGORY@#))?die($db->error());?

//?抓取第一层循环的资料?

while?($item_category?=?$db->fetchAssoc(@#CATEGORY@#))?

{?

//?建立第二层数组?

$topic?=?array();?

$db->setSQL(sprintf($SQL2,?$item_category[@#category_id@#]),?@#TOPIC@#);?

if?(!$db->query(@#TOPIC@#))?die($db->error());?

//?抓取第二层循环的资料?

while?($item_topic?=?$db->fetchAssoc(@#TOPIC@#))?

{?

//?把抓取的数据推入第二层数组中?

array_push($topic,?$item_topic);?

}?

//?把第二层数组指定为第一层数组所抓取的数据中的一个成员?

$item_category[@#topic@#]?=?$topic;?

//?把第一层数据推入第一层数组中?

array_push($category,?$item_category);?

}?

$tpl->assign("forum",?$category);?

$tpl->display("test3.htm");?

?>?

在数据库抓取一笔资料后,我们得到的是一个包含该笔数据的数组。透过?while?叙述及?array_push?函式,我们将数据库中的资料一笔一笔塞到数组里。如果您只用到单层循环,就把第二层循环?(红色的部份)?去掉即可。

决定内容是否显示

要决定是否显示内容,我们可以使用?if?这个语法来做选择。例如如果使用者已经登入的话,我们的模版就可以这样写:

<{if?$is_login?==?true}>

显示使用者操作选单

<{else}>

显示输入帐号和密码的窗体

<{/if}>

要注意的是,「==」号两边一定要各留至少一个空格符,否则?Smarty?会无法解析。

if?语法一般的应用可以参照官方使用说明,所以笔者在这里就不详加介绍了。不过笔者发现了一个有趣的应用:常常会看到程序里要产生这样的一个表格:?(数字代表的是资料集的顺序)

1?2

3?4

5?6

7?8

这个笔者称之为「横向重复表格」。它的特色和传统的纵向重复不同,前几节我们看到的重复表格都是从上而下,一列只有一笔资料。而横向重复表格则可以横向地在一列中产生?n?笔资料后,再换下一列,直到整个循环结束。要达到这样的功能,最简单的方式只需要?section?和?if?搭配即可。

我们来看看下面这个例子:

test4.php:

require?"main.php";?

$my_array?=?array(?

array("value"?=>?"0"),?

array("value"?=>?"1"),?

array("value"?=>?"2"),?

array("value"?=>?"3"),?

array("value"?=>?"4"),?

array("value"?=>?"5"),?

array("value"?=>?"6"),?

array("value"?=>?"7"),?

array("value"?=>?"8"),?

array("value"?=>?"9"));?

$tpl->assign("my_array",?$my_array);?

$tpl->display(@#test4.htm@#);?

?>?

模版的写法如下:

templates/test4.htm:

?

?

横向重复表格测试?

?

?

?

?

<{section?name=sec1?loop=$my_array}>?

<{$my_array[sec1].value}>?

<{if?$smarty.section.sec1.rownum?is?div?by?2}>?

?

?

<{/if}>?

<{/section}>?

?

?

?

?

重点在于?$smarty.section.sec1.rownum?这个?Smarty?变量,在?section?循环中这个变量会取得从?1?开始的索引值,所以当?rownum?能被?2?除尽时,就输出??使表格换列?(注意!是??在前面?在后面)?。因此数字?2?就是我们在一列中想要呈现的资料笔数。各位可以由此去变化其它不同的呈现方式。

加载外部内容

我们可以在模版内加载?PHP?程序代码或是另一个子模版,分别是使用?include_php?及?include?这两个?Smarty?模版语法;?include_php?笔者较少用,使用方式可以查询官方手册,这里不再叙述。

在使用?include?时,我们可以预先加载子模版,或是动态加载子模版。预先加载通常使用在有共同的文件标头及版权宣告;而动态加载则可以用在统一的框架页,而进一步达到如?Winamp?般可换?Skin?。当然这两种我们也可以混用,视状况而定。

我们来看看下面这个例子:

test5.php:

require?"main.php";?

$tpl->assign("title",?"Include?测试");?

$tpl->assign("content",?"这是模版?2?中的变量");?

$tpl->assign("dyn_page",?"test5_3.htm");?

$tpl->display(@#test5_1.htm@#);?

?>?

模版?1?的写法如下:

templates/test5_1.htm:

?

?

?

<{$title}>?

?

?

<{include?file="test5_2.htm"}>?

<{include?file=$dyn_page}>?

<{include?file="test5_4.htm"?custom_var="自订变量的内容"}>?

?

?

模版?2?的写法如下:

templates/test5_2.htm:

<{$content}>

模版?3?的写法如下:

templates/test5_3.htm:

这是模版?3?的内容

模版?4?的写法如下:

templates/test5_4.htm:

<{$custom_var}>

这里注意几个重点:1.?模版的位置都是以先前定义的?template_dir?为基准;2.?所有?include?进来的子模版中,其变量也会被解译。;3.?include?中可以用「变量名称=变量内容」来指定引含进来的模版中所包含的变量,如同上面模版?4?的做法。

用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择,但是官方引擎SMARTY 诞生后,选择就有了变化。它的理念和实现都是相当"前卫"的。本文主要讨论SMARTY之于其他模板引擎的不同特点,简要介绍了该引擎的安装及使用,并用一个小的测试案例对比了SMARTY和PHPLIB?template的速度和易用性。

一、MVC需要模板

MVC最早是在SmallTalk语言的开发过程中总结出的一种设计模式,MVC分别代表了"模型"、"视图"和"控制",目的就是让不同的开发角色在大中型项目中各司其职。在网络应用程序的开发中,可以用下图来表示各概念之间的关系。?

该图展示了一个简单的WEB应用程序,用户在浏览器上看到信息是数据库服务器上的内容,但在这之前经过了应用服务器加工。开发人员负责的就是建立数据结构、处理数据的逻辑以及表示数据的方法。?

96年CGI在中国开始流行的时候,早期的WEB程序员都是从HTML开始自学成材的,在PERL 中print一行行的HTML并不是一件难事,但是随着网络的一步步提速,页面大小也从当初的二、三十K暴涨了十倍。写CGI程序就产生了一个迫切的要求:分开PERL和HTML源码。于是,社会进步体现在开发小组内部的分工上。由于美工和程序员对互相的工作并不是十分熟悉,在进行合作的过程中需要用一种约定的"语言"进行交流。?

这种语言并不是我们的母语或者英语,术语叫做"模板",逻辑和表示依靠它联系。它是结合了HTML和脚本语言特征的一种表达方式。通过这种方式,表示层可以按照用户所希望的格式来显示经过逻辑层处理过的数据。如果你有Windows平台下MFC的开发经验,那么一定会很熟悉Document/Document?Template/View的封装,这就是一个很典型的MVC例子。对于Web应用来说,个人认为J2EE中的EJB/servlets/JSP是最强大的,当然还有简洁优美的Structs。另一个很有名的实现就是COM/DCOM+ASP,这个组合在我国是最多人使用的。?

通过几种MVC实现在WEB应用程序里的对比,可以得到一个关于模板的概念:一组插入了HTML 的脚本或者说是插入了脚本HTML,通过这种插入的内容来表示变化的数据。下面给出一个模板文件的例子,这个模板经过处理后在浏览器里显示"Hello,?world!"

$greetings

$greetings

这里暂且省略处理方式,在后面做专门对比讨论。

二、为什么选SMARTY??

对PHP来说,有很多模板引擎可供选择,比如最早的PHPLIB?template和后起之秀Fast?template,经过数次升级,已经相当成熟稳定。如果你对目前手中的模板引擎很满意,那么......也请往下看,相信你作为一个自由软件爱好者或者追求效率和优雅的开发者,下面的SMARTY介绍多少会有点意思。?

除了个人偏好的影响,我一直倾向于使用官方标准的实现,比如APACHE的XML引擎Axis。好处就是可以获得尽可能好的兼容性(比如早期MFC对于Win3x的兼容性就比其它的应用程序框架好,当然现在各种版本都很完善了)。SMARTY发布之前我一直使用的是?PEAR?中的Integrated?Template?eXtension。这个引擎和PHPLIB?template、Fast?template几乎是兼容的,从模板的语法到对模板的处理同出一辙:都是将模板读入内存然后调用parse()函数,用数据对预置的标记进行替换。

下面看看SMARTY是怎么做的。接到request后,先判断是否第一次请求该url,如果是,将该url所需的模板文件"编译"成php脚本,然后redirect;如果不是,就是说该url的模板已经被"编译"过了,检查不需要重编译后可以马上redirect,重编译条件可以自己设定为固定时限,默认的是模板文件被修改。?

怎么样,看起来是不是有点眼熟?想起来了──这不就是JSP的原理嘛!的确,这种"编译"用在PHP这样的解释性脚本引擎上显得匪夷所思,但是仔细想想,JAVA不也是由JVM解释执行的吗?这就叫"没有做不到,只有想不到"。?

既然谈到了JAVA,就再对PHP的未来发表一点看法。PHP官方网站上宣布了要在2003年年底发布PHP5.0版。这个版本拥有很多崭新的特性:比如异常处理,命名空间,更加面向对象等等。可以说越来越向JAVA靠拢,SMARTY也是新特性之一,使得PHP更适用于大中型项目的开发。但是似乎离我当初选择它的原因──灵巧易用──越来越远了。但就一个软件的生存周期来看,PHP正处在成长期,开发者赋予它更多的功能,以期能胜任商业应用是利大于弊的。作为PHP的忠实用户,肯定不希望PHP总是被人指责"能力不足"吧?

为什么选择SMARTY,仅仅因为它很像JSP?当然有更为充分的理由。首先,除了第一次编译的成本比较高之外,只要不修改模板文件,编译好的cache脚本就随时可用,省去了大量的parse()时间;其次SMARTY像PHP一样有丰富的函数库,从统计字数到自动缩进、文字环绕以及正则表达式都可以直接使用;如果觉得不够,比如需要数据结果集分页显示的功能,SMARTY还有很强的扩展能力,可以通过插件的形式进行扩充。?

事实胜于雄辩。我设计了一个测试程序,通过速度和开发难度这两个因素对比了一下SMARTY 和PHPLIB?template,选PHPLIB?template的原因是在patrick的文章?《在PHP世界中选择最合适的模板》中有一个PHPLIB?template对Fast?template的竞赛,结果PHPLIB?template 大获全胜,这使得SMARTY有了一个很好的对手。在测试之前,先谈一下在安装过程中需要注意的问题。

三、可能遇到的问题?

在SMARTY的?官方网站上,有详尽的用户手册,可以选择在线HTML和PDF格式的版本。这里就不再涉及手册上已有的内容,只是把初次使用可能遇到的问题做个解释。?

第一个问题就很要命:提示说找不到所需文件?并不是每一个人都按照SMARTY默认目录结构来写应用的。这里需要手工指定,假设目录结构如下:

就需要在index.php里指定目录结构:

$smart->template_dir?=?"smarty/templates/";

$smart->compile_dir?=?"smarty/templates_c/";

$smart->config_dir?=?"smarty/configs/";

$smart->cache_dir?=?"smarty/cache/";

第一个问题解决了,紧接着就是第二个:我刚用Dreamweaver生成的漂亮模板怎么不能用?并不是模板文件有什么问题,而是因为SMARTY默认的标记分隔符是{},不巧的是Javascript 肯定包含这个标记。好在我们可以用任意字符当作分隔符,再加上这两句:

$smart->left_delimiter?=?"{/";

$smart->right_delimiter?=?"/}";

这下安装就基本完成,没问题了。

四、反衬和类比?

先构思一下对测试的设计。主要的评比因素当然是速度了。为了进行速度测试,采取了算术平均数的作法。在测试页面中重复将页面生成N遍,再对比总页面生成时间。另一个重要因素是易用性(至于扩展性不用比较已经有结果了),所以使用的模板不能太小。我用的是我个人主页的的页面,一个用Firework+Dreamweaver生成的HTML文件,大小约7K。其中的变量设置也采取最常用的区块,在PHPLIB?template里叫block,而SMARTY则称section。别小看这称呼的不同,易用性标准分两块:模板文件和脚本文件的语法是否简明易用。

js模版引擎handlebars

js模版引擎handlebars.js实用教程——each嵌套 1 2 3 4 5each嵌套 - by 杨元 6 7 8

each嵌套

9 10
11 12 13 14 15 16 17 18 19 26 27

28 55 56

jetTemplate模板学习和使用

一、如何配置jetTemplate ? ? ? ? ?

拓展方法:可以非常好的进行格式化处理和一些小的模板处理。

?? ??? ???? ?

?o o

二、model and view 我们发现在这一块基本上没有什么区别,把数据对象放在map中,在后面的页面就可以帮我们完成整个的处理。 返回值表示对应的html文件。 这一块没有什么问题。这一块非常方便。 三、页面的布局 jetbrick-template samples

#for(UserInfo user: userlist) #end
ID 姓名 邮箱 书籍
${user.id} ${https://www.sodocs.net/doc/e216816758.html,} ${user.email} 书籍列表
#include("includes/footer.jetx")

整个的思路也非常简单,就是使用#include和#tag layout_block("mainContent")两个标志就可以搞定了。 四、页面渲染 这一块也很简单,看上面的例子和官网上的说明就OK了。

JADE教程

JADE教程 1. Jade5.0的安装和设置 Jade5.0都是自动安装的,这不成问题。要把PDF卡片引入,先将ICDD的光盘插入,然后pdf/setup/select all/,其它按提示进行。 可以对优选项进行设置:EDIT/preference/,里面包括了对显示窗口的设置,仪器参数的设置,打印输出的设置等。 2 .数据的输入 Jade软件可以直接读取Rigaku、Bruker、Philips、Scintag等很多衍射仪的原始数据。打开File\patterns,将出现如附件中所示画面,先(I)找到你文件位置,从(III)的下拉框中选择你的数据格式,按(II)选择。很多仪器输出文件的格式都是*.raw,实际上都是不一样的,但格式选错了也没关系,软件会给你自动转到合适的格式中去的。 高级一点的:有一些数据格式在(III)的下拉框中没有,比如最常见的txt,xy 等,此时你可以自己动手设置,在以上的数据输入面板中,点击工具栏上的“import",进入格式设置画面,如附件所示,a区为注释区,b区为数据格式区,对于最简单的一列角度,一列强度的数据格式,a区不用填写,b区在”angle column“前打上勾,数据从第1行开始读,每行1列数据,强度数据从第8行开始(角度不算),角度从1至6列,所得数据格式即为附件中所示的数据格式。你也可以按照自己的数据格式进行自由改动,如果a区中表明第1行有说明文字,则数据从第2行读入,相应在b区就将data starts改成2。做完上面的工作后,将文件后缀改为你的数据后缀(箭头所指),再将该格式保存下来便可大功告成了。 3. 基本功能使用:平滑,扣背底

Twig模板引擎使用笔记

Twig模板引擎使用笔记 安装配置 1.新建一个目录 libs 2.在该目录下新建文件 composer.json,往该文件写入以下内容: 3.{ 4. "require": { 5. "twig/twig": "1.*" 6. } 7.} 8.在 libs 目录上执行 composer install 安装 Twig(前提是已安装 Composer 包管理器) 9.在 libs 上级目录新建三个文件夹:templates、templates_c、web,其中 templates 用来存放 模板文件,templates_c 用来存放编译缓存文件,web 用来存放 PHP 源文件 10.在 libs 上级目录新建文件 MyTwig.php 公共文件,内容如下: 11.// 引用 Composer 自动加载文件 12.require_once dirname(__FILE__).'/libs/vendor/autoload.php'; 13. 14.// 注册 Twig 加载器 15.Twig_Autoloader::register(); 16. 17.// 设置基本的配置项 18.$loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/templates'); 19.$twig = new Twig_Environment($loader, array( 20. 'cache' => dirname(__FILE__).'/templates_c', 21. 'auto_reload' => true 22.)); 23.后续使用时,只需让 web 目录下的 PHP 文件引用该公共文件,且在 templates 目录下放置好 对应的模板即可,引用公共文件的语句为:require_once dirname(dirname(__FILE__)).'/MyTwig.php'; 24.基本的模板渲染语句:echo $twig->render('abc.html.twig', array('name' => 'Ruchee')); 可用符号 == != < > >= <= + - ~ * / // % ** | [] . .. and or not in is b-and b-or b-xor 部分符号的含义如下 ?~:连接两字符串,相当于 PHP 中的点号 ?//:整除 ?**:乘方,相当于 PHP 中的 ^ ?b-and、b-or、b-xor:按位与、按位或、按位异或 ?-:减法以及去除空白的简写用法,如 {{- 数据 }} => 去除左边的空白、{{ 数据 -}} => 去除右边的空白、{{- 数据 -}} => 去除两边的空白

JADE中文教程,包还一个真实系统

目录 第一章绪论 (3) 1.1问题概述 (3) 1.2该领域技术发展现状 (3) 1.3全文安排 (5) 第二章AGENT简介 (6) 2.1Agent技术的起源与发展 (6) 2.2Agent定义 (7) 2.3Agent的适用领域 (10) 2.4agent技术的标准化 (10) 第三章JADE平台介绍 (12) 3.1JADE平台简介 (12) 3.2JADE的特点 (14) 3.3用JADE创建多Agent系统 (15) 3.3.1Agent平台 (15) 3.3.2Agent类 (17) 3.3.3Agent任务.执行Agent行为 (19) 3.4交互协议 (21) 3.5对移动Agent的支持 (22) 第四章基于JADE平台上的"图书交易"系统 (23) 4.1"图书交易"系统要实现的功能 (23) 4.1.1买方Agent (23) 4.1.2卖方Agent (23) 4.2建立JADE Agent-Agent类 (24) 4.2.1agent标识符 (24) 4.2.2结束Agent (25) 4.2.3向Agent中传递参数 (25)

4.3Agent执行的任务-Behaviour类 (27) 4.3.1行为调度和执行 (28) 4.3.2在特定的时间点执行某个操作 (31) 4.4"图书交易"系统执行的行为 (32) 4.4.1买方Agent的行为 (33) 4.4.2卖方Agent的行为 (34) 4.5Agent间通讯-ACLMessage类 (37) 4.5.1发送消息 (37) 4.5.2"图书交易"系统中的各类消息 (37) 中文翻译 (95) 1 介绍 (95) 2 JADE 特点 (99) 3 用JADE创建多agent系统 (100) 3.1 Agent平台 (100) 3.2 Agent类 (105)

20个代码生成框架

20个代码生成框架 1 1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://https://www.sodocs.net/doc/e216816758.html, 官方论坛:http://https://www.sodocs.net/doc/e216816758.html,/default.aspx 版权形式:30天试用 开源:否 需要先注册确认后才能下载 1.2 MyGenerator MyGenerator是又一个国外很不错的代码生成工具,有人觉得比CodeSmith简单、好用。 所有api可以在帮助菜单中找到。 官方网站:http://https://www.sodocs.net/doc/e216816758.html,/portal/default.aspx 官方论坛: 版权形式:免费 开源:否 1.3 NHibernate. NHibernate是Hibernate公司在Java自动生成领域取得巨大成功后推出的一款ORM工具. 官方网站:http://https://www.sodocs.net/doc/e216816758.html,/ 官方论坛: 版权形式:免费 开源:否 1.4 湛蓝.Net代码生成器

一款基于软件自动生成理念,能直接生成应用的dotnet代码生成器 官方网站:http://https://www.sodocs.net/doc/e216816758.html, 官方论坛:http://https://www.sodocs.net/doc/e216816758.html,/ 版权形式:免费 开源:否 1.5 动软.NET代码自动生成器 一款人气很旺的免费C#代码生成器 官方网站:http://https://www.sodocs.net/doc/e216816758.html, 官方论坛: 版权形式:免费 开源:否 1.6 CodePlus 专为sql server c#语言设计的代码生成器,功能还是很强大 官方网站:http://https://www.sodocs.net/doc/e216816758.html, 官方论坛: 版权形式:需要少量的注册费用 开源:否 下载地址很神秘 1.7 CodeMaker asp,jsp,php代码生成工具,自动生成维护数据库信息的动态网页的代码生成器。它可以帮助ASP、JSP、PHP开发人员快速的开发简单的数据库维护程序。无需任何编码,只需将数据库结构导入到CodeMaker中并做简单的设置,CodeMaker即可生成完整的数据库操作页面。用CodeMaker可以简单快速的创建网站后台维护程序。提高开发效率数十倍以

(完整word版)jade6.5教程(xrd物相分析)

第一部分物相分析 1.打开您的数据。File—read… 打开后的界面如图1: 图1 2.很多人说打开数据后要平滑曲线,但是我个人认为还是先不要平滑的好,因为每一次的平滑曲线操作都会造成数据失真。我更倾向于物相分析完毕后,平滑曲线,使得输出的报告更易读。但是,到底要不要在此平滑曲线取决于您自己。平 滑曲线的操作如下: 右击图2中箭头所指按钮,可以进行参数设置,左击就是平滑曲线。

图2 3.物相分析。一般的,物相分析要至少分3轮进行,这样才能把所有的物相找出来。这3轮分别命名为大海捞针、单峰分析、指定元素分析。 首先左击按钮寻峰。 (1)“大海捞针”物相分析:右击图3箭头所指按钮,出现图4所示标签。在General 选项里,首先勾选上左侧的所有的库,去掉右侧所有的对勾,其他设置如图4所示,最后左击ok。 图3

图4 完成上述步骤,出现图5所示界面。显示了矿物名称、化学式、FOM值、PDF-#、RIR等内容。矿物的排序是按FOM值由小到大排列的,FOM值越小,表示存在这种矿物的可能性越大(但不绝对)。当鼠标左击到一个矿物时,在X衍射图谱显示栏会显示蓝色的线,选择与X衍射图谱拟合最好的矿物,然后在矿物名称前面勾选,表示你认为存在此矿物(如图6)。注意:选择矿物时,要尽量选取有RIR值的矿物,否则后面的定量工作将不能继续。 图5 图6

(2)单峰分析:完成大海捞针后,可能还有峰没有对上,此时要用此法。 在大海捞针的基础上,左击图7方框内的按钮,然后按照图8内标明的步骤操作。然后重复大海捞针的操作(与大海捞针不同的是,此时系统只选择与你选中的峰对应的物相)。 图7

CMS系统模版引擎设计(3):Label基类的设计

上节讲了页面的整个生产流程,大家都期待第三篇,也就是生产的核心内容——Label的替换。说实话,我很有压力啊:)一个人一个实现思路,所以...可能你不能接受。 我的标签分为2种,一种是配置变量标签(就是站点和系统的Config),用%变量名%表示,在初始化Labels之前是要执行替换的。另外一种就是数据调用的Label咯。看下风格: //简单的循环列表 {Article:List Top="10" CategoryId="5"} [field:Title/] {/Article:List} //引用用户控件模版,CategoryId是需要传递的参数 {System:Include TemplateId="5" CategoryId="7"/} //详情页模版 {Article:Model ArticleId="Url(articleid)"}

[field:Title/]

{/Article:Model} {Artcile:Model name="PostTime"dateformat="yyyy年MM月dd日"/} 大家可以看出点端倪了吧,格式都是统一的。我来说下: Article:List:是Article模块下的List标签 Top :调用条数 CategoryId:分类ID 当然还支持其他的属性比如Skip,Class,Cache等等,这些属性关键是看List标签的支持度。 下面的...当然是循环部分,而[field:FieldName/]则是具体的字段,接着是关闭标签。 但例如System模块的Include标签却没有内容部分。 而详情页的字段展示和列表不同,他的字段可以任意位置摆放。所以可以下面的那个Model虽没有ID也可以输出:)这些七七八八的细节比较多。 我们如何解释这些标签代码呢?

Discuz模板引擎标签

Discuz模板引擎标签 2009-06-03 09:18 Discuz! 的模板采用近似 PHP 表达式的语法,支持的元素如下: 1. 逻辑元素包围符,该符号用于包含条件和循环元素,其中: statement1 statement2 statement3 为一个典型的条件模板,当条件 expr1 为真时,显示模板 statement1 内容;否则当 expr2 为真时,显示模板 statement2 内容,否则显示模板 statement3 的内容.如同 其他语言中的条件控制一样,其中 和 是非 必须的. statement 相当于 PHP 的数组循环语句 foreach($array as $value) { statement } 而 statement 相当于 PHP 的数组循环语句

foreach($array as $key => $value) { statement } 逻辑元素包围符在 { } 外面包含了 html 的注释符号 ,除了为了和信息元素 相区别外,也方便了使用 Dreamweaver 和 Frontpage 之类工具编辑模板的用户.因逻 辑元素会被识别为 html 的注释而不被显示,对于绝大多数用户,逻辑元素中的内容是 完全不需要修改的,甚至修改错一个字符就可能引起错误信息和整个系统无法运行.因 此通常您在修改模板的时候,不要修改模板的逻辑信息,更不要将逻辑信息内部元素(如 等)的位置,否则可能会导致错误.如果您的模板被不慎修改损坏,请立 即用原始模板覆盖,即可恢复. 对于高手而言,实际上外部的 是可以省略不写的,可以用于某些元素在模板 中的定位,但强烈建议普通用户不要轻易尝试. 2. { ... } 信息元素包围符,其中 {CONSTANT} 可以引用界面替换变量,其中必须为大写字母,该符号实际的作用是引用 PHP 常量 CONSTANT,因此也可以通过它来引用其他的常量内容. {lang variable} 可以在模板中引用语言变量 variable 的内容,语言变量经由 https://www.sodocs.net/doc/e216816758.html,ng 中数组 $language 定义. 如 {lang post_edit} 的内容在编译模板的时候被替换为 $language['post_edit'] 的内容,简体中文版的意思是 "编辑帖子". {faq variable} 可以在模板中引用论坛帮助的帮助关键字,在后台=>其他设置=》论坛帮助=》具体某个帮助的详情可以看到或者设置 3. {template name} 模板嵌入符,为了避免模板的冗长,可以使用本符号来将 name 模板的内容嵌

JADE笔记之:消息模板简介

MessageTemplate class 利用MessageTemplate可以针对ACLMessage的每个属性设置模式,以达到过滤消息的目的。为了可以构建更复杂的匹配规则,多个模式也可以进行and,or,not运算。最有用的一些规则或方法包括:通信行为匹配,发送者匹配,会话ID匹配。 比如MatchPerformative( performative ) 是通信行为的匹配。 这里 performative 可能是: https://www.sodocs.net/doc/e216816758.html,RM ACLMessage.PROPOSE ACLMessage.AGREE 还有发送者匹配MatchSender( AID ),会话匹配 MatchConversationID( String ),通信协议匹配MatchProtocol( String ) ,本体匹配MatchOntology( String)。 比如:MessageTemplate mt = MessageTemplate.and( MessageTemplate.Match Performative( https://www.sodocs.net/doc/e216816758.html,R M ), MessageTemplate.Match Sender( new AID( "a1", AI D.ISLOCALNAME))) ; 相当于建立了一个模板,表示消息规则为INFORM行为并且发送者为“a1”。 接收过程如下:ACLMessage msg = receive( mt ); if (msg != null) { ... handle message } block(); 示例:package jadePrime.acl; import jade.core.Agent; import jade.core.AID; import jade.core.behaviours.*;

Smarty模板技术讲解

模板引擎Smarty 目录 模板引擎Smarty (1) 一、模板引擎 (2) 1、混合式编程(HTML+PHP) (2) 2、项目的开发流程 (2) 3、什么是模板引擎 (2) 4、模板引擎原理 (3) 二、Smarty模板引擎 (5) 1、什么是Smarty模板引擎 (5) 2、为什么要学习Smarty (5) 3、下载安装 (6) 4、Smarty项目部署(三步走) (6) 5、Smarty入门五步走 (6) 三、详解Smarty工作流程 (8) 1、smarty执行流程 (8) 2、smarty执行原理图 (9) 3、几个常用属性 (9) 1)分界符 (9) 2)与路径相关的四个属性 (9) 3、默认值 (10) 4、常用的方法 (11) 四、设计篇 (11) 1、模板注释 (11) 2、模板中的变量 (12) 1)从PHP中分配的变量 (12) 2)从配置文件中读取变量 (14) 3)在模板中直接定义变量 (14) 3、Smarty中的常用保留变量 (15) 4、变量调节器 (16) 五、内建函数(sysplugins) (20) 1、capture函数 (20) 2、config_load函数 (20) 3、include_php函数 (21) 4、insert函数 (22) 5、if elseif else函数 (23) 6、ldelim、rdelim函数 (24) 7、literal函数 (25) 8、foreach函数 (25) 六、作业: (27)

一、模板引擎 1、混合式编程(HTML+PHP)

编号 手机名称 价格
优点:开发迅速、语法简介 缺点:后期维护基本无效 2、项目的开发流程 设计效果图-确认-设计HTML+CSS+JS-整合PHP代码-上线测试-确认-发布-推广 设计师-程序员-测试-客户不满意-设计师-程序员-测试-客户不满意-… 把我们HTML+PHP进行完全分离 HTML:设计师 PHP:程序员 3、什么是模板引擎 模板引擎,是指利用某种模板语言将页面制成模板,再依据业务逻辑将该模板语言翻译成业

js模版引擎handlebars.js实用教程——each嵌套+++

1 2 3 4 5each嵌套 - by 杨元 6 7 8

each嵌套

9 10
11 12 13 14 15 16 17 18 19 26 27 28 55 56 循环嵌套在稍微复杂点的页面设计中即会涉及,Handlebars.js完全支持each嵌套,可以在each中使用each。 上边的例子演示了两个关键点:each嵌套的可实现性、如何在each嵌套中读取父each中的数据。 例子很简单,info本身是一个信息列表,是属于某个人的,我们先用each遍历所有的人,然后再遍历每个人的info信息,这样就形成了each嵌套。但是我们想在内层each中获取外层each的数据,达到“谁的什么”这样的显示效果。

CMS系统模板引擎设计(5):Label应用初探

话说上节听的很郁闷,讲的也郁闷,整个系列没有详细的Code,所以都有点懵。其实仔细看之前的几节应该还是能够理解整个思路的。我在这里再整理一遍:用户访问URL后->根据所有Page的URL 规则(urlpattern)获取当前Page,然后再根据page的Template,Find出所有的Label(通过反射),然后遍历这些Label,把得到的数据的Html替换掉Label本身的标签代码。最后整个Template就是要生成的HTML了。 所以我们要明白Label是如何获取工作才能获取数据库的数据的。一个Label可以理解成一个控件,那么控件必然会支持一些属性(Parameter)和一些内容(Field)。我们上节就是在讲怎么来解析par ameter,因为有些特殊的parameter,所以设计的时候设计了parameter的基类,特殊的则是子类。 同样,field是具体的要展现在HTML代码中的字段,比如中的[field:Title/],这就是一个字段,我们的模版引擎的工作就是把他替换掉应该展现的标题,而如何才能工作?我们就得设计Field的整个逻辑。在替换循环的过程中使用field类。 但是,我今天不讲Field了,因为这样讲大家还是糊涂依旧。今天我们就来设计一个Article:List的初级版。我觉得或许从实例讲解大家更容易理解设计的理念。OK,那就开始设计一个Article.List,我们最熟悉的文章列表。 //简单的循环列表 {Article:List Top="10" CategoryId="5"} [field:Title/] {/Article:List} 想象一下Repeater,有个ItemTemplate,那么对于List这个Label来说,他的ItemTemplate 显然就是Template属性。那么如果我们获取到数据源后直接foreach替换掉所有的field即可。代码大概如下: ///

///获取要展示的HTML代码 /// /// public override string GetRenderHtml() { var html = TemplateString; foreach (var article in GetDataSource())

一个简单的python模板引擎

分享一个简单的python模板引擎 python模板引擎也很多,但是希望可以使用python原生的来作模板而不用在创建一个新的语法,但是python本身的缩进又不适合做模板所以要把缩进去掉就可以了 #coding:utf-8 __author__="sdm" __author_email='sdmzhu3@https://www.sodocs.net/doc/e216816758.html,' __date__ ="$2009-8-25 21:04:13$" ''' pytpl 类似php的模板类 ''' import sys import StringIO import os.path import os #模板的缓存 _tpl_cache={} class Pytpl: def __init__(self,tpl_path='./'): self.tpl_path=tpl_path self.data={} self.output = StringIO.StringIO() pass def set(self,name,value): ''' 设置模板变量 ''' self.data[name]=value; pass def get(self,name): ''' 得到模板变量 '''

t={} return t.get(name,'') pass def tpl(self,tplname): ''' 渲染模板 ''' f=self.tpl_path+tplname if not os.path.exists(f): raise Exception('tpl:[%s] is not exists' % f) mtime=os.stat(f).st_mtime if not _tpl_cache.has_key(f) or _tpl_cache[f]['time']

ASP模板引擎

ASP模板引擎 阐述一种全新的ASP模板引擎,实现代码(逻辑)层与HTML(表现)层的分离.这种模板实现方法避免了一般ASP模板加载模板文件(加载组件)和替换所浪费的资源,实现编译型的模板引擎,提高程序的执行速度和稳定性。 摘要: 阐述一种全新的ASP模板引擎,实现代码(逻辑)层与HTML(表现)层的分离.这种模板实现方法避免了一般ASP模板加载模板文件(加载 组件)和替换所浪费的资源,实现编译型的模板引擎,提高程序的执行速度和稳定性。 当前,WEB开发已经变得非常火爆,因为各种应用,已经约来越要求表现层和逻辑层的分离.ASP和HTML夹在一起程序将变得难于维护,可读性也差。在PHP领域,模板引擎已经非常普遍,如phplib,SMARTY,等等.有使用替换方式的,也有编译方式的(SMARTY),它们都较好的实现了逻辑层和表现层的分离.由 于PHP的影响,在ASP界有人借鉴phplib等使用替换的方法开发出asp的模板类,由于ASP在字符处理上性能并不是很强大,所以在速度上受到影响,这样的模板在目前的应用也不是很广泛。如: 1 2 3 4{$title} 5 6 7{$body} 8 9

1 2<% 3TemplateCode=Load("template.html")'自定义函数,装载模板文件到TemplateCode 4TemplateCode=Replace(TemplateCode,"{$title}","asp模板引擎终结者")'替换模板 5TemplateCode=Replace(TemplateCode,"{$body}","asp模板引擎终结者内容")'替换模板 6Response.Write TemplateCode 7%> 上面的例子只是初步展示了当前ASP模板的思想,有ASP 版的CMS系统已经嵌入了对模板的逻辑控制,虽然能够实现逻辑和界面的分离,但是这种模板存在的问题就是模板需要每次都用ASP解析一次,程序相当于解析两次,而且当要替换的内容很多的时候,将会降低性能.而且装载模板需要服务器支持一种组件(FSO,ADODB,XMLHTTP均可实现). 借鉴于编译型的模板,我在ASP中引进这种思路.提出一种应用在ASP中的功能和性能都很优良的模板体系.下面用代码表示: 1 2 3 4 <%=title%> 5 6 7