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}
  • 相关阅读:
    用同余理解补码
    objenesis
    spring 事务处理
    SOCKS5 协议解析
    WebSocket 的鉴权授权方案
    加密解密基础问题:字节数组和16进制字符串的相互转换
    主机字节序 与 网络字节序
    RSA 理论
    分类算法----k近邻算法
    R语言统计分析应用与SAS、SPSS的比较
  • 原文地址:https://www.cnblogs.com/nyxd/p/5362774.html
Copyright © 2011-2022 走看看