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');
  1. 相关属性

思考:为什么我们要设置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
在这里插入图片描述

  1. 相关方法

因为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');
  1. Smarty中常用的两个方法

Assign(模板变量名称,

Display(模板名称)

  1. 注意事项

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

五、系统内置函数

1、capture内建函数

作用是捕获一段内容。

实例代码:

<!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>
  1. foreach内建函数

作用:遍历从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 变量值

3、系统中保留变量

s m a r t y . g e t . p a g e 相 当 于 smarty.get.page 相当于 smarty.get.page_GET[page]

s m a r t y . p o s t . p a g e 相 当 于 smarty.post.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}

4、变量调节器

变量调节器的作用:变量调节器主要是对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} 将变量中你的换行符转化为

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

{$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}

5、变量调节器组合应用

    {*变量调节器的综合应用*}
    {$var10|nl2br|truncate:120:'***'|lower}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值