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}
原文地址:https://www.cnblogs.com/nyxd/p/5362774.html