zoukankan      html  css  js  c++  java
  • Smarty模板引擎技术

    Smarty模板引擎技术

    • 什么是模板引擎?
    • 什么是Smarty模板引擎?
    • 为何选择Smarty模板引擎?
    • 如何使用Smarty模板引擎?

    一、历史背景

    场景一:回顾之前编写PHP项目的方式

    //链接数据的操作

    //构造sql语句

    //执行sql语句
    $res = mysql_query($sql);
    ?>
    <table>
    <?php
    while($row = mysql_fetch_assoc($res)){
    ?>
    <tr>
    <td><?php echo $row['goods_name']?></td>
    </tr>
    <?php
    }
    ?>
    </table>

     

    分析:这样的写法的好或者不好的地方在哪里?

     

    优点:执行效率高。

    缺点:代码组织混乱,维护成本高,几乎无法重构(重构基本要重写)。

     

    场景二:那些年,我做过的项目。

     

    在外面的做开发工作,并不是,程序员觉得项目开发完毕了就结束了,往往一个项目开发要经历多次修改和优化。

     

     

    因为一直在使用混编的方式进行开发项目,只要界面一修改,就等于项目除了固定功能部分之外的代码就得重新写。

     

    既然功能都是固定的,那么有没有什么办法,让我们的前端和后台进行分离,前端修改不会影响后端。

     

     

     

    二、模板引擎概述

    1、什么是模板引擎

    • 模板引擎,是指利用某种模板语言将页面制成模板,再依据业务逻辑将该模板语言翻译成业务数据,从而生成最终展示页面。其目的就是要把页面(HTML)与业务数据(PHP)实现彻底分离。(模板引擎可以将我们php项目的前端和后端的开发分离)。
    • 业界主流的开源cms中对模板引擎的使用是很广泛的,如业界知名cms:dedecms,discuz,phpcms,echop等。

    2、感受模板引擎

    通过在html中使用标签的方式,就可以达到不用修改php 代码情况下,完成制作一个网站。

     

    那么?这样的原理是怎么样的?

     

    3、模板引擎核心原理

    所有的模板引擎底层实现都是基于这个原理实现,不管他有多强大多复杂,最基本的核心实现思路都是一致的。

     

    4、封装模板引擎

    为什么要封装?为了实现代码的重用,以更优雅的方式组织代码。

     

     

     

     

    三、Smarty模板引擎

    1、什么是Smarty模板引擎

    Smarty是一个基于PHP开发的PHP模板引·擎。它提供了逻辑与外在内容的分离。(实现了php项目的前端和后台开发的分离)

     

     

    一个叫名字叫做Smarty,且使用php编写的模板引擎。

    2、如何获取Smarty模板引擎

    Smarty官网: http://www.smarty.net/

     

    3、lib目录详解

     

    Plugings    拓展插件目录

    Sysplugins    Smarty系统插件目录

    AutoLoader.php    自动载入类

    Debug.tpl    Smarty提示信息模板

    Smarty.class.php    Smarty3.0入口文件(兼容2.0)

    SmartyBC.class.php    Smarty2.0入口文件

     

    4、为什么要选择Smarty模板引擎

    从技术背景角度来说:Smarty是由php官方开发团队开发和维护。

    • 速度        相对于其他模板引擎,Smarty模板引擎的执行效率更高。
    • 编译型        第一次访问项目,Smarty模板引擎会生成一个编译文件,第二次访问时会判断项目的模板文件是否被修改,如果没有修改,就执行编译文件。
    • 缓存技术    当项目的缓存文件在生命周期内,那么Smarty在执行的时候会直接执行缓存文件
    • 插件技术:当Smarty内部功能不够使用的时候,允许开发者自定义拓展插件
    • 语句自由 if/elseif/else/endif:标签语法很简单。

     

    编译速度     <     缓存速度 < 静态化

     

    什么情况下使用Smarty模板引擎?那么什么情况下使用Smarty引擎不好?

    • 在数据不常更新修改,非实时更新的项目可以使用Smarty模板引擎:管理系统,内容管理系统等
    • 在数据实时更新的项目中使用不好:金融类型项目,数据时时更新类项目。

     

    5、部署Smarty四步走

    第一步:复制lib目录至虚拟主机目录

    第二步:修改lib文件夹名为Smarty

    第三步:创建templates文件夹

    第四步:创建templates_c文件夹

    6、使用Smarty模板引擎七步走

    第一步:在虚拟主机目录下创建一个index.php文件

    第二步:在index.php文件中引入

    第三步:Smarty类并实例化

    第四步:在templates文件中创建一个index.html文件

    第五步:在index.php文件中使用assign方法配置变量

    第六步:在index.php文件夹中使用display方法加载模板

    第七步:在index.html模板文件中编写Smarty标签

     

    7、Smarty模板引擎的执行原理

    我们访问了index.php,通过在index.php文件中分配的变量,在html中显示出来。

    那么这中间发生了什么?

     

    • 当第一次访问index.php的时候,Smarty模板引擎会自动在templates_c文件夹中创建一个display()方法所指定的模板的缓存文件。
    • 当第二次访问index.php的时候,会判断display()方法指定的模板文件是否被修改,如果被修改了,则重新生成这个模板文件的编译文件,如果没有被修改则直接执行这个编译文件

     

    如何判断模板文件被修改呢?

    在unix系统和windows 系统中文件一般都有三个时间:

     

    创建时间 修改时间    访问时间

     

     

    我们通过判断模板文件的修改时间来确定是否被修改,从而判断是否执行或者重新生成编译文件。

     

     

    那么如何直观的理解这个执行过程呢?

    8、一张图理解Smarty执行流程

     

     

    四、Smarty中常用的属性与方法

     

    1. 常用属性

    <?php
    include "Smarty/Smarty.class.php";
    //
    实例化SMarty
    $Smarty = new Smarty();
    $name = '
    我是小明';
    $PHP = 'PHP
    是世界上最好的语言';
    //
    修改左定界符
    $Smarty->left_delimiter = '<{';
    //
    修改右定界符
    $Smarty->right_delimiter = '}>';
    //
    修改模板文件路径
    $Smarty->template_dir = './view';
    //
    修改的编译路径
    $Smarty->compile_dir ='./compile';
    $Smarty->assign('name',$name);
    $Smarty->assign('PHP',$PHP);
    $Smarty->display('demo.php');

    2、相关属性

    思考:为什么我们要设置templates和templates_c两个文件夹

    答:这些目录都是由Smarty中的下面几个属性决定的。

    • template_dir        模板文件目录
    • complile_dir        编译文件目录
    • config_di    r        配置文件目录
    • cache_dir        缓存文件目录

    示例代码:

    <?php
    include "Smarty/Smarty.class.php";
    //
    实例化SMarty
    $Smarty = new Smarty();
    $name = '
    我是小明';
    $PHP = 'PHP
    是世界上最好的语言';
    //
    修改左定界符
    $Smarty->left_delimiter = '<{';
    //
    修改右定界符
    $Smarty->right_delimiter = '}>';
    //
    修改模板文件路径
    $Smarty->template_dir = './view';
    //
    修改的编译路径
    $Smarty->compile_dir ='./compile';
    $Smarty->assign('name',$name);
    $Smarty->assign('PHP',$PHP);
    $Smarty->display('demo.php');

    在Smarty3.0中,这四个属性都是private私有的,那么为什么可以在类外部修改私有属性?

    在PHP中有魔术方法__set

    3、相关方法

    因为Smarty3.0是为了兼容Smarty2.0版本,允许通过属性的方式来设置相关属性。

    但是为了迎合Smarty3.0开发规范,我们一般通过使用相关方法对相关属性的设置。。

    • setTemplateDir()        设置模板文件目录
    • setCompileDir()        设置编译文件目录
    • setConfigDir()            设置配置文件目录
    • setCacheDir()            配置缓存文件目录

    示例代码:

    <?php
    include "Smarty/Smarty.class.php";
    //
    实例化SMarty
    $Smarty = new Smarty();
    $name = '
    我是小明';
    $PHP = 'PHP
    是世界上最好的语言';
    //
    修改左定界符
    $Smarty->left_delimiter = '<{';
    //
    修改右定界符
    $Smarty->right_delimiter = '}>';
    //
    修改模板的路径
    $Smarty->setTemplateDir('./tmp');
    //
    修改编译文件的路径
    $Smarty->setCompileDir('./c');
    $Smarty->assign('name',$name);
    $Smarty->assign('PHP',$PHP);
    $Smarty->display('index.tpl');

    4、Smarty中常用的两个方法

    Assign(`模板变量名称`,`值`)

    Display(`模板名称`)

    5、注意事项

    • 一般在使用Smarty做项目的时候,如果templates_c文件不存在,那么会自动创建,但是在linux环境中因为文件权限的问题,。
    • Display方法指定的模板文件,不一定是.html 结尾的,使用任何文本文件都可以。

    如在ecshop项目中的    .tpl后缀。

    五、系统内置函数

    1capture内建函数

    作用是捕获一段内容。

    实例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Smarty
    模板引擎</title>
    </head>
    <body>
    {capture name='PHP'}
    PHP
    是世界上最好的语言
    我是一段被捕获的内容
    {/capture}
    {$smarty.capture.PHP}
    </body>
    </html>

     

     

     

    1. config_load内建函数

    基本语法:{config_load file=`配置文件的名称`}

    参数详解:file    在configs文件夹中的配置文件

    示例代码:

    {config_load file="config.conf" }
    {#name#}
    <hr/>
    {#age#}
    <hr/>
    {#sex#}

    Configs/config.conf文件

    示例代码:

    name = 王小明
    [class1]
    name =
    王二明
    [class2]
    name =
    王大明
    [class3]

    sheji_01.tpl代码

    {config_load file="config.conf" }
    {#name#}
    <br/>
    {config_load file="config.conf" section="class1"}
    {#name#}
    {config_load file="config.conf" section="class2"}
    <br/>
    {$smarty.config.name}
    1. include内建函数

    一般网站的页面设计大概分为三部分:头部文件,内容文件,底部文件

    在Smarty中我们可以使用include函数实现,将我们的页面精细化拆分。

    基本语法:{include file=模板文件名称}

    参数说明:模板文件在templates文件夹中。

    示例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Smarty
    模板引擎
    </title>
    </head>
    <body>
    {include file="header.tpl"}
    {include file="content.tpl"}
    {include file="footer.tpl"}
    </body>
    </html>

     

    4foreach内建函数

    作用:遍历从PHP中分配来的数组

    示例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Smarty
    模板引擎</title>
    </head>
    <body>
    {foreach $arr as $a}
    {$a}
    <hr/>
    {/foreach}
    </body>
    </html>

    六、设计篇

    1、模板注释

    {*我是注释内容*}

    2、模板变量

    php文件中分配过来的变量

    $Smarty->assign('name',$name);
    				

    从配置文件中读取的变量

    {config_load file="config.conf"}
    {#name#}
    <hr/>
    {#sex#}
    <hr/>
    {#age#}

    在模板文件中直接定义的变量

    {assign var="class" value="PHP15"}
    {$class}

    参数说明:var    变量的名称

             Value    变量的值

    1. 系统中保留变量

    $smarty.get.page        相当于$_GET[page]    

    $smarty.post.page     相当于$_POST[page]

    $smarty.cookies.username $_COOKIE[username]

    $smarty.server.SERVER_NAME $_SERVER[SERVER_NAME]

    $smarty.env.Path $_ENV[PATH]

    $smarty.session.id $_SESSION[id]

    $smarty.request.username $_REQUEST[username]

    {$smarty.now}                代表获取当前时间戳

    {$smarty.const}                 获取一个常量

    {$smarty.capture}                获取捕获内容

    {$smarty.config}             获取配置文件

    {$smarty.current_dir}            当前项目工作路径

    {$smarty.version}                当前Smarty版本

    {$smarty.ldelim} ó {ldelim}        左定界符

    {$smarty.rdelim} ó {rdelim}        右定界符

    实例代码:获取配置文件变量的两种方法

    {config_load file="config.conf" }
    {#name#}
    {$smarty.config.name}
    <hr/>
    {$smarty.config.age}
    <hr/>
    {$smarty.config.sex}
    1. 变量调节器

    变量调节器的作用:变量调节器主要是对Smarty变量进行格式化。

    基本格式:{变量名称|变量调节器:参数1:参数2|变量调节器2:参数1:参数2}

    在Smarty中有21中变量调节器:

    {$var|capitalize}            将变量中的单词首字母大写

    {$var|count_characters:true}计算变量中的字符串,如果参数为true的话,那么将空格也计算在内。

    {$var|cat:var2}                 链接变量

    {$var|count_paragraphs}    计算变量中的段落数量

    {$var|count_sentences}        计算变量中的句子数量

    {$var|count_words}         计算变量中的单词量

    {$var|date_format:"%Y%m%d"}    格式化日期

    {$var|default:"value"}        默认值

    {$var|escape}                    转码

    {$var|indent:10:"*"}            缩进

    {$var|lower}                    将变量中的所有单词转化为小写

    {$var|nl2br}                    将变量中你的换行符转化为<br>

    {$var|regex_replace:"/[ ]/":""}    正则替换

    {$var|replace:"aa":"bb"}        字符串替换

    {$var|spacify:"^^"}            插空操作

    {$var|string_format:"%d"} 字符串格式化 %d格式化为整型,%s格式化为字符串类型

    {$var|strip: "*"}                去空操作

    {$var|strip_tags}                去除变量中的HTML代码

    {$var|truncate:30:"…"}        字符串截取,将最后三个字符替换为三个点

    {$var|upper}                    将变量中的字母转化为大写

    {$var|wordwrap:30:"<br>"}    行宽约束

    示例代码:

    {*capitalize 将变量中的单词首字母转化为大写*}
    {$name|capitalize}
    <hr/>
    {*cat
    链接变量*}
    {$var1|cat:$var2:$var3}
    <hr/>
    {*
    格式化日期*}
    {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
    <hr/>
    {*
    转码*}
    {$var4|escape}
    <hr/>
    {*
    将变量中的单词转化为小写*}
    {$var5|lower}
    <hr/>
    {*
    将变量中的换行符转化为br*}
    {$var6|nl2br}
    <hr/>
    {*
    字符串替换
    {$var7|replace:'
    小明':'老王'}
    *}
    {*
    字符串截取*}
    {$var8|truncate:9:"***"}
    <hr/>
    {*
    将变量中的字母转化为大写*}
    {$var9|upper}

    6、变量调节器组合应用

    {*变量调节器的综合应用*}
    {$var10|nl2br|truncate:120:'***'|lower}
  • 相关阅读:
    hdu 4027 Can you answer these queries? 线段树
    ZOJ1610 Count the Colors 线段树
    poj 2528 Mayor's posters 离散化 线段树
    hdu 1599 find the mincost route floyd求最小环
    POJ 2686 Traveling by Stagecoach 状压DP
    POJ 1990 MooFest 树状数组
    POJ 2955 Brackets 区间DP
    lightoj 1422 Halloween Costumes 区间DP
    模板 有源汇上下界最小流 loj117
    模板 有源汇上下界最大流 loj116
  • 原文地址:https://www.cnblogs.com/nyxd/p/5362774.html
Copyright © 2011-2022 走看看