第5天 smarty技术
https://www.smarty.net/
https://www.smarty.net/docs/zh_CN/
1. smarty概述
smarty是目前使用最多的一个模板引擎
什么是模板引擎?
通过代码说明:
举例子,没有使用模板引擎的时候,写代码的方式:
需求:查询数据库的用户列表,并在页面中显示出来
image.png
image.png
在公司开发项目的时候,是有分工的
如果按照上面编写代码的话,
- 不便于维护,前端的人员不懂php的语法
-
这样写的话,也不符合现在最流行的MVC模式
按照MVC的规范,分为3层
image.png
使用smarty模板引擎,将php分配给html文件的数据,显示出来
模板引擎的核心就是,将php代码(业务逻辑代码) 和 数据显示 相分离
2. smarty入门案例
-
下载smarty
image.png -
解压
image.png
3. 将libs核心类库拷贝到我们的项目目录中,为了和其他的类库区分,将其重命名为:smarty
image.png
-
将smarty里面的Smarty.class.php 引入到我们的php文件,并实例化
image.png
入门案例:
- 先指定将变量分配到哪个模板文件中
- 再分配数据
-
显示
image.png
在模板中,如何使用php分配过来的变量呢?
通过模板标签实现显示的,默认的标签{$变量名} <?php ?>
image.png
能不能分配数组呢?
image.png
在模板中这样使用数组:
image.png
还可以分配对象到模板
image.png
image.png
3. smarty的原理:
我们刷新项目,发现多了一个templates_c目录
image.png
image.png
于是我们总结一下,smarty的原理:
php文件将html文件包含,生成一个混合的编译文件.show.html.php
自定义模板引擎:
需求:能够实现在php文件中分配变量,并能够在html模板中显示php分配过来的变量
我们这样设计:
成员方法1:分配变量的功能
成员方法2:显示模板的功能
思路分析:先将html模板文件加载到混合文件中,再将其中的{$name}
类型的数据替换
image.png
模板文件的内容:
image.png
替换模板中标签:
image.png
4. 模板中的变量来源
(1)最常见的是php文件分配过来的变量
(标量、数组、对象)
(2)还可以使用配置文件的变量
什么是配置文件呢?
现在有3张图片
image.png如果一天,图片的路径变化了,我们需要将所有img标签里面的src属性的值都替换
这样做效率是比较低的
我们可以通过配置文件修改,只需要改一下配置,所有的图片路径都会跟着变化
在smarty中,使用配置文件(系统)
-
先告诉smarty我的配置文件在哪里
image.png -
定义配置文件里面的信息
image.png -
在模板中使用配置文件里面定义的数据、信息
(1)先加载配置文件{config_load}
(2)通过{#配置名称#}
image.png
(3)还可以使用smarty的保留变量
{$smarty.now} 获得当前的时间戳
{$smarty.const.常量名} 获得常量的值
{$smarty.config.配置名} 获得配置文件中的配置信息
{$smarty.current_dir} 获得当前目录
image.png
5. smarty的一些常用配置
(1)修改模板、编译文件路径
有些公司会将template目录定义为tpl/tpls
将templates_c目录定义为tpls_c
模板文件的类型改为 .tpl
image.png
但是修改之后还应该告诉smarty,否则smarty找不到路径了
image.png
(2)修改模板标签式 {}
有时候可能会和JavaScript的语法冲突,所以通常会修改模板标签
image.png
6. smarty中的变量调节器
smarty中的变量调节器就是对某个变量的值,进行修改、格式化等处理
(1)date_format 格式化日期、时间
image.png
(2)capitalize 每个单词的首字母大写
image.png
image.png
(3)count_chararcters 统计每个单词的字符的个数
image.png
(4)default 如果没有定义变量、或者为空的时候,设置默认值
image.png
(5)escape 转码
默认是实体转码,将< > 等这些符号转换成html的实体符号
image.png
image.png
还可能会用到url转码
image.png
image.png
(6)indent:字符缩进,缩进的字符使用空白代替
image.png
image.png
(7)truncate:字符串截取
参数1:截取的长度
参数2:截取之后,追加的字符(...)
参数3:true截取精确到字符个数
参数4:true:截取到中间,false截取到末尾
image.png
image.png
7. 模板中使用流程语句
1. foreach循环
现在smarty3版本,
image.png
$data是循环的数组
$k $v分别是每循环一次获得的下标及元素的值
也兼容smarty2的语法
注意:from=循环的数组
每循环一次将数组的下标赋值给k变量,将数组的值赋值给v变量
foreachelse 标签指定如果没有查询到数据的时候,提示的信息
注意:嵌套在foreach标签里面,没有结束标记
image.png
if、elseif、else
image.png
for循环
<{for $i=1 to 10}>
step设置步长值
image.png
include:引入外部文件
一个网站通常会有公共的头部(logo、导航等)
公共的底部:(版权信息、联系我们等)
我们可以将这些公共的信息保存到一个公共的文件、谁需要谁加载
image.png
在模板中使用include标签引入
image.png模板继承
通常也是一个公共的模板,可以被其他模板继承并重写内容
1. 先定义一个父级模板、子级模板
image.png
-
在父级模板声明被继承以及能够被重写的部分
通过block标签声明,默认是被字模板重写
image.png
3. 在子级模板中继承父级模板的内容,并重写
首先声明继承的是哪个模板
extends声明
image.png
- block标签默认重写父级模板的内容,我们可以通过 append、prepend属性
设置追加写
image.png
literal标签,告诉smarty,literal包起来的内容,不使用smarty解析
image.png
image.png
8. smarty的缓存
1. 简单复习:
PDO数据库扩展
- 开启扩展、重启Apache
- new PDO()
- 执行增删改查
Smarty模板引擎 - 下载smarty类库
- new Smarty;
- 分配数据:assign
- 显示内容:display
需求:
我有一数据库phone,两张表:goods、category
将商品表的商品信息(id、商品名称、商品价格)查询并显示成一格列表
步骤: -
命令DAOPDO这个类去查询数据
image.png
-
命令smarty显示数据
image.png
image.png
2. smarty的缓存
先查看一下IE浏览器的历史记录文件
image.png
思考?ie浏览器为什么要将这些文件保存到本地?
便于下次再访问该文件的时候,提高速度
3. 缓存图例:
(1)使用缓存以前的代码是这样写的:
缺点就是:
每次请求,都要请求数据库,众所周知,数据库不在本地,可能在美国、香港、杭州
所以这样的效率、执行速度是比较慢的
考虑将第一次请求查询到的数据保存到本地,这样,当用户下次访问 或者 其他用户访问goods_list.php文件的时候,直接读取缓存的文件,速度更快
具体实现:
- 首先,在smarty中开启缓存,有三个步骤:
步骤1:直接将caching属性设置为1,就表示开启
步骤2:设置缓存的时间,过期之后销毁
步骤3:设置缓存文件的保存目录 -
测试一下,在浏览器访问:goods_list.php
image.png
访问之后,会在我们项目的cache目录生成一个缓存文件:
image.png
(2)开启缓存之后的流程图
4. 局部不缓存
举例说明:股票、价格等时时变化的数据能缓存吗?不能
(1)概念:
一个网页大部分是可以缓存,当然一些小的地方(价格、时间等)这些时时变化的数据是不能缓存的,使用局部不缓存实现
(2)代码实现insert标签:
在smarty中,局部不缓存是通过{insert}标签实现,原理就是{insert}每次都会执行
语法格式:
{insert name=”函数名”}
这样,每次都会执行该函数
insert插入的函数不能随便写,有如下规范:
(1)文件命名规范:
函数命名规范:
image.png
参数规范:
image.png
在自定义函数里面如何接受传递的参数呢?
image.png
接下来通过id获取商品价格
image.png
测试一下:
image.png
(2)单模板多缓存
- 创建一些测试数据
创建一个小说表:novel
id title
create table novel(id int primary key auto_increment,title varchar(30))en
gine myisam default charset utf8;
image.png
-
在php文件中拿到所有数据
image.png
给模板分配过去:
image.png
模板显示:
image.png
测试一下:
image.png
image.png
不管传递的参数是 0 1 2 返回的结果都是
安娜卡列尼娜
思考,什么原因?
就是因为开启了缓存,每次请求都是读取的缓存的内容
image.png
如何实现,一个模板根据传递参数的不同,生成多个缓存文件
通过smarty的单模板多缓存实现
在display()的时候设置,如果传递第二个参数,就表示先查看缓存目录里面有没有根据该参数生成的缓存,如果没有则创建一个,如果有,则直接读取缓存内容
image.png
优化:
-
既然已经有缓存文件了,就不需要在去数据库查询了
image.png
所以上面查询数据库之前,应该判断一下是否有缓存
完整代码novel.php:
<?php
header("Content-Type:text/html;charset=utf-8");
require './I_DAO.interface.php';
require './DAOPDO.class.php';
require './smarty/Smarty.class.php';
$option = array(
'host' => '127.0.0.1',
'dbname'=> 'php_3',
'user' => 'root',
'pass' => '',
'port' => 3306,
'charset'=> 'utf8'
);
//命令smarty分配数据到模板
$smarty = new Smarty();
//接收地址栏上传递的参数id
$id = isset($_GET['id'])?$_GET['id']:0;
//先判断如果没有缓存的时候才去数据库查询
if(!$smarty->isCached('novel.html',$id)){
//实例化PDO对象
$dao = DAOPDO::getSingleton($option);
//查询数据
$sql = "SELECT * FROM novel";
$result = $dao -> getAll($sql);
//根据参数从数组中获得该参数对应的小说 (一维数组)
$novel = $result[$id];
}
//开启缓存
$smarty -> caching = 1;
//设置缓存的有效期,单位是秒
$smarty -> cache_lifetime = 60;
//设置缓存文件的保存路径
$smarty -> setCacheDir('./cache/');
//设置模板目录
$smarty -> setTemplateDir('./tpls/');
$smarty -> assign("novel",$novel);
//命令smarty显示内容
$smarty -> display('novel.html',$id);
清除缓存:
$smarty -> clearCache() 删除具体某一个缓存文件
$smarty-> clearAllCache() 删除所有缓存
image.png