414 12
发新话题
打印

[精]SmartTemplate(适用于企业级PHP开发的模板引擎)

本主题由 flyindance 于 2007-11-16 17:30 设置高亮

[精]SmartTemplate(适用于企业级PHP开发的模板引擎)

SmartTemplate (适用于企业级PHP开发模板引擎)

乔楚将带你入门SmartTemplate这个模板引擎, 文章会更倾向于SmartTemplate,所以会有点偏颇。

企业级PHP开发,我们需要考虑:

    •        质量 (程序必须拥有一致性和稳定性)
    •        功能 (程序必须满足付费用户的所有功能需求)
    •        性能 (程序应该在一个可接受的严格规定的时间内处理用户请求)
    •        扩展性 (倘若硬件支持,程序使用用户必须有数量级的提升)
    •        持续发展 (不能超过被期望的开发预算)
    •        准时性 (程序必须在规定的时间交付)
    •        维护/支持费用 ()
    •        可用性
    •        ......
    •        等等

简短说明:

主要翻译http://www.smartphp.net/的SmartTemplate部分的内容,随着认识的逐次加深,我将适当调整翻译的结果。
如果你有任何建议,请告诉我,谢谢!

为什么推荐他:

•        轻巧
•        简单
•        功能确实不错


访问网址: http://bbs.phpres.com/forum-50-1.html
现在下载http://smarttemplate.yi.org/download

基本方法:
   • assign
   • append
   • output
   • result
   • use_cache
   • debug

模板流程控制:
       • if
       • else
       • elseif
       • begin ... end(块结构)
    希望下面这个教程可以带你入门这个简单快速强大的PHP模板引擎。


[ 本帖最后由 SmartTemplate 于 2007-6-25 13:26 编辑 ]
本帖最近评分记录
  • phpres 威望 +10 2007-11-17 10:29
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate 简介
SmartTemplate是一个支持大型WEB应用程序的模板引擎.
SmartTemplate有什么特色?
普通模板引擎工作方式: 你的PHP脚本指定一个HTML模板,指定动态内容并显示。模板分析器使用指派的内容替换模板内所有的占位符,然后显示给用户. 这意味着,每次你要输出一些内容,程序都要花上好多时间去进行字符串的处理和正则表达式的工作。
SmartTemplate 的工作方式类似模板编译,他把模板转换为可执行的PHP脚本,并且保存起来以备以后重用。当一个新的模板在第一次被使用时,The first time a new template is processed, 模板内所有的占位符被替换为简单的可输出指定内容的PHP代码元素。据个例子,模板片断 <H3>;{TITLE}</H3>;,将被转换为 <H3>;<?php echo $TITLE; ?>;</H3>;. 如果你指定内容给正确的变量, 将再也不需要进行模板分析了. 程序要做得仅仅是自己包含并执行便以后的模板. 这通常会戏剧性的减少模板引擎的运行时间.

SmartTemplate 支持:
    " 普通变量替换 (字符串,等等)
    " 重复的内容块 (嵌套数组/ BEGIN..END)
    " 基本的逻辑控制结构 (IF..ELSEIF..ELSE)
    " 可定制的扩展模块 (输出过滤, 大小写转换, 格式输出, 等等.)
    " 模板编译 (HTML 模板被转换为可执行的PHP代码)
    " 输出缓存 (重用输出页面从而提速你的程序)

让我们用一些简单的例子开始,告诉你如何使用 SmartTemplate:

通常的流程是先建立一个WEB页面,展示所需要的效果. 创建简单的页面版式可以使用一个网页编辑器,例如Dreamweaver或者Homesite. 为了获得更为友好的页面版式效果,可以使用一个专业的设计工具,例如Photoshop、 Paintshop Pro或者Gimp等等.

预览:
复制内容到剪贴板
代码:
Hello World!
现在我们来看看达到我们期望的页面版式的HTML源代码:

HTML-源代码 (hello_world.html):
复制内容到剪贴板
代码:
<HTML>;
<H3>;Hello World!</H3>;
</HTML>;
然后开始令人激动的一步: 分离内容和设计. 我们把HTML源代码之中的内容元素替换为模板占位符. 模板占位符被分配一个唯一的名称并且使用一个特有的标签包含起来,这样我们在随后的程序之中可以识别他们. 标题 Hello World! 被替换为一个叫做TITLE 的占位符. 我们是用大括弧来标记占位符, 似的我们的模板引擎可以发现: {TITLE}. 最后HTML模板如下:

HTML-模板 (hello_world.tpl.html):
复制内容到剪贴板
代码:
<HTML>;
<H3>;{TITLE}</H3>;
</HTML>;
使内容整合到模板,我们需要做如下工作:

    "        调用 SmartTemplate 类
    "        创建一个 SmartTemplate 分析器 对象
    "        告诉 SmartTemplate 要使用的HTML模板
    "        指定内容给关联的占位符
    "        处理模板
    "        输出结果

以下的PHP程序完成所需的工作:
hello_world.php:
复制内容到剪贴板
代码:
<?php

    require_once "class.smarttemplate.php";
    $page = new SmartTemplate("hello_world.tpl.html");
    $page->;assign('TITLE', 'Hello World!');
    $page->;output();

?>;
就这么简单 – 我们的 Hello World 例程已经准备运行了.


[ 本帖最后由 SmartTemplate 于 2007-6-25 13:30 编辑 ]
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

比Smarty要快上8倍!
SmartTemplate 特别优化以提高速度.尽管 SmartTemplate 支持多种功能和函数, 但是在你的程序运行期间,仅仅很少一部分时间用在模板处理上.
他将使得你使用最少开发费用开发PHP程序,同时拥有闪电般的运行数度!

以下的基准测试,使用我们众所周知得模板引擎作为对比,来测试他们得运行速度。
测试过程分别使用包含1、20、200个对象被使用得模板。
基准测试 I: (Smarty vs. SmartTemplate)
    •  Server: RedHat Linux, Apache 1.3.27, PHP 4.3.1
    •  Pentium III - 1300 MHz CPU, 512 MB RAM
    •  Apache 基准测试, 20 个并发请求




基准测试 II: (Smarty vs. SmartTemplate)
    •  Server: RedHat Linux, Apache 1.3.27, PHP 4.3.1 + IonCube Accelerator
    •  Pentium III - 1300 MHz CPU, 512 MB RAM
    •  Apache基准测试, 20 个并发请求

What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate 配置

bool $reuse_code
设置是否保存编译后的模板代码,以备重用
如果设置否false,SmartTemplate会在每次模板使用时都重新编译模板

string $template_dir
模板文件目录,默认为当前目录
可使用全局变量$_CONFIG['template_dir']设置

string $temp_dir
模板编译保存目录,默认为/tmp/
可使用全局变量$_CONFIG['smarttemplate_compiled']设置
注意:确保PHP对该目录可写

string $cache_dir
输出缓存目录,默认为/tmp/
可使用全局变量$_CONFIG['smarttemplate_ cache']设置
注意:确保PHP对该目录可写

int $cache_lifetime
默认输出缓存周期
可使用全局变量$_CONFIG[' cache_lifetime ']设置
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

基本方法
SmartTemplate::assign()

void assign ( string PLACEHOLDER, mixed CONTENT )
or
void assign ( array CONTENT )
给模板占位符(PLACEHOLDER)或者列表(CONTENT)赋值. 可以使用散列数组或者标量



复制内容到剪贴板
代码:
<?php

    $template  =  new SmartTemplate('template.html');

    $text  =  'Sample Text';
    $template->;assign( 'TITLE', $text );

    $template->;output();

?>;



模板(template.html):


复制内容到剪贴板
代码:
<html>; {TITLE} </html>;



输出:


复制内容到剪贴板
代码:
<html>; Sample Text </html>;





例子2: 多个标量赋值

复制内容到剪贴板
代码:
<?php

    $template  =  new SmartTemplate('user.html');

    $template->;assign( 'NAME',  'John Doe' );
    $template->;assign( 'GROUP', 'Admin'    );
    $template->;assign( 'AGE',   '42'       );

    $template->;output();

?>;




模板(user.html):


复制内容到剪贴板
代码:
Name: {NAME}
Group: {GROUP}
Age:   {AGE}



输出:


复制内容到剪贴板
代码:
Name:  John Doe
Group: Admin
Age:   42
例子3: 使用数组给多个标量赋值
复制内容到剪贴板
代码:
<?php

    $user  =  array(
                 'NAME'  =>; 'John Doe',
                 'GROUP' =>; 'Admin',
                 'AGE'   =>; '42',
              );

    $template  =  new SmartTemplate('user.html');

    $template->;assign( $user );

    $template->;output();

?>;
模板(user.html):
复制内容到剪贴板
代码:
Name:  {NAME}
Group: {GROUP}
Age:   {AGE}
输出:
复制内容到剪贴板
代码:
Name:  John Doe
Group: Admin
Age:   42
例子4: 命名空间
复制内容到剪贴板
代码:
<?php

    $admin  =  array(
                   'NAME'  =>; 'John Doe',
                   'AGE'   =>; '42',
               );
    $guest  =  array(
                   'NAME'  =>; 'Roger Rabbit',
                   'AGE'   =>; '16',
               );

    $template  =  new SmartTemplate('users.html');

    $template->;assign( 'admin', $admin );
    $template->;assign( 'guest', $guest );

    $template->;output();

?>;
模板(user.html): 占位符(PLACEHOLDER)对应数组,“.”对应数组“[]”
复制内容到剪贴板
代码:
Admin Name: {admin.NAME}
Admin Age:  {admin.AGE}

Guest Name: {guest.NAME}
Guest Age:  {guest.AGE}
输出:
复制内容到剪贴板
代码:
Admin Name: John Doe
Admin Age:  42

Guest Name: Roger Rabbit
Guest Age:  16
例子5: 使用数组命名空间
复制内容到剪贴板
代码:
<?php

    $users  =  array(
                   'admin' =>; array(
                       'NAME'  =>; 'John Doe',
                       'AGE'   =>; '42',
                   ),
                   'guest' =>; array(
                       'NAME'  =>; 'Roger Rabbit',
                       'AGE'   =>; '16',
                   ),
               );

    $template  =  new SmartTemplate('users.html');

    $template->;assign( $users );

    $template->;output();

?>;
模板(user.html): 占位符(PLACEHOLDER)对应数组,“.”对应数组“[]”
复制内容到剪贴板
代码:
Admin Name: {admin.NAME}
Admin Age:  {admin.AGE}

Guest Name: {guest.NAME}
Guest Age:  {guest.AGE}
输出:
复制内容到剪贴板
代码:
Admin Name: John Doe
Admin Age:  42

Guest Name: Roger Rabbit
Guest Age:  16
例子6: 命名空间, 3个部分
复制内容到剪贴板
代码:
<?php

    $template  =  new SmartTemplate('template.html');

    $content['world']['europe']['germany']  =  'DE';

    $template->;assign( 'top_level_domain', $content );

    $template->;output();

?>;
模板(template.html): 占位符(PLACEHOLDER)对应数组,“.”对应数组“[]”
复制内容到剪贴板
代码:
<html>; German TLD: {top_level_domain.world.europe.germany} </html>;
输出:
复制内容到剪贴板
代码:
<html>; German TLD: DE </html>;
例子7: 列表赋值
复制内容到剪贴板
代码:
<?php

    $links  =  array(
                   array(
                       'TITLE' =>; 'PHP',
                       'URL'   =>; 'http://www.php.net/',
                   ),
                   array(
                       'TITLE' =>; 'Apache',
                       'URL'   =>; 'http://www.php.net/',
                   ),
                   array(
                       'TITLE' =>; 'MySQL',
                       'URL'   =>; 'http://www.mysql.com/',
                   ),
               );

    $template  =  new SmartTemplate('links.html');
    $template->;assign( 'links', $links );
    $template->;output();

?>;
模板(links.html): 结构名称lnks对应数组
复制内容到剪贴板
代码:
<html>;
<h3>; Sample Links </h3>;

<!-- BEGIN links -->;

    <a href="{URL}">; {TITLE} </a>;

<!-- END links -->;

</html>;
输出:
复制内容到剪贴板
代码:
<html>;
<h3>; Sample Links </h3>;

    <a href="http://www.php.net/">; PHP </a>;

    <a href="http://www.apache.org/">; Apache </a>;

    <a href="http://www.mysql.com/">; MySQL </a>;

</html>;
Example 8: 使用数组于多个命名空间
复制内容到剪贴板
代码:
<?php

    $title  =  'Sample Links';  //  Page Title

    $target =  '_blank';        //  The Same Target for all links

    $links  =  array(
                   array(
                       'TITLE' =>; 'PHP',
                       'URL'   =>; 'http://www.php.net/',
                   ),
                   array(
                       'TITLE' =>; 'Apache',
                       'URL'   =>; 'http://www.php.net/',
                   ),
                   array(
                       'TITLE' =>; 'MySQL',
                       'URL'   =>; 'http://www.mysql.com/',
                   ),
               );

    $template  =  new SmartTemplate('links.html');

    $template->;assign( 'TITLE', $title );
    $template->;assign( 'TARGET', $target );
    $template->;assign( 'links',  $links  );

    $template->;output();

?>;
注意:
TITLE 与 links..TITLE 使用不同的命名空间!
TARGET 不是 links 数组的成员. 如果使用在 BEGIN..END 块之内, 他必须被引用为 {parent.TARGET} 或者 {top.TARGET}.
其他可能的用法:
{top.TITLE}, {parent.parent.PAGE_ID}, {top.users.ADMIN}, 等等..
模板(links.html):
复制内容到剪贴板
代码:
<html>;
<h3>; {TITLE} </h3>;

<!-- BEGIN links -->;

    <a target='{parent.TARGET}' href="{URL}">; {TITLE} </a>;

<!-- END links -->;

</html>;
输出:
复制内容到剪贴板
代码:
<html>;
<h3>; Sample Links </h3>;

    <a target="_blank" href="http://www.php.net/">; PHP </a>;

    <a target="_blank" href="http://www.apache.org/">; Apache </a>;

    <a target="_blank" href="http://www.mysql.com/">; MySQL </a>;
</html>;
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate::append()
void append ( string PLACEHOLDER, mixed CONTENT )
追加内容给模板占位符. 可以使用散列数组或者标量.
例子1 (列表):



复制内容到剪贴板
代码:
<?php

    $page  =  new SmartTemplate('links.html');

    $page->;append('links' =>; array(
                                 'TITLE' =>; 'PHP',
                                 'URL'   =>; 'http://www.php.net/'
                             ));
    $page->;append('links' =>; array(
                                 'TITLE' =>; 'Apache',
                                 'URL'   =>; 'http://www.apache.org/'
                             ));
    $page->;append('links' =>; array(
                                 'TITLE' =>; 'MySQL',
                                 'URL'   =>; 'http://www.mysql.com/'
                             ));
    $page->;output();

?>;



模板(links.html): 列表追加为行


复制内容到剪贴板
代码:
<html>;
<h3>; Sample Links </h3>;

<!-- BEGIN links -->;

    <a href="{URL}">; {TITLE} </a>;

<!-- END links -->;

</html>;



输出:


复制内容到剪贴板
代码:
<html>;
<h3>; Sample Links </h3>;

    <a href="http://www.php.net/">; PHP </a>;

    <a href="http://www.apache.org/">; Apache </a>;

    <a href="http://www.mysql.com/">; MySQL </a>;

</html>;



例子2 (标量):


复制内容到剪贴板
代码:
<?php

    $page  =  new SmartTemplate('template.html');

    $page->;append('TITLE' =>; 'Hello ');
    $page->;append('TITLE' =>; 'World ');
    $page->;append('TITLE' =>; '!');

    $page->;output();

?>;



模板(template.html): 标量为内容的追加




复制内容到剪贴板
代码:
<html>; {TITLE} </html>;



输出:

复制内容到剪贴板
代码:
<html>; Hello World ! </html>;
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplateutput()
void output ()
解析模板并输出结果.
例子:



复制内容到剪贴板
代码:
<?php

    $page  =  new SmartTemplate('template.html');
    $page->;assign('TITLE' =>; 'Sample Title');

    $page->;output();

?>;
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate::result()
string result ()
解析模板并返回结果.
例子:





复制内容到剪贴板
代码:
<?php

    $page  =  new SmartTemplate('template.html');
    $page->;assign('TITLE' =>; 'Sample Title');

    $output  =  $page->;result();

    echo 'Output page: ' . $output;

?>;
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate::use_cache
void use_cache ( [mixed key] )
激活内建的输出缓存. 判断当前执行的脚本 (判断依据$_SERVER[REQUEST URI]) 是否在确定的时间内执行过. 如果执行过, use_cache 将返回缓存的页面给浏览器并且中止运行.
如果没有一个有效的输出句柄可以使用,use_cache将激活PHP输出缓存,并且返回数据到执行它的脚本. 下面的脚本执行时, use_cache 捕获所有输出到浏览器的内容,并保存到缓存目录. 缓存的每一个文件名称是唯一的,他根据当前执行的脚本文件名称,GET参数(REQUEST_URI)以及可选得参数来自东设定.
如果脚本有一些重要的工作,例如记录日志等,那么应该在use_cache 之前调用你的代码.
例子:



复制内容到剪贴板
代码:
<?php

    $page  =  SmartTemplate('template.html');
    $page->;cache_dir       =  '/tmp/';  //  Where to store cache files
    $page->;cache_lifetime  =  120;      //  Keep cache for 120 seconds
    $page->;use_cache();                 //  Activate ouput cache

    //
    //  Assemble Page Content
    //

    $page->;output();

?>;
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

SmartTemplate::debug()
void debug ()


激活内建调试器. Debug 能够代替或者内嵌在 output . 他列出了指定的变量及其内容的详细列表, 编译后的模板和模板的原来结构.

Debug 对于确定和排除模板中的错误非常有用.
What ever it takesNot for the destination
It's on my way It's on my way
All my colorful days
Never lose my passionIt's on my way

TOP

 414 12
发新话题