第5天 smarty技术

2019-11-02  本文已影响0人  zphphp

https://www.smarty.net/
https://www.smarty.net/docs/zh_CN/

1. smarty概述

smarty是目前使用最多的一个模板引擎
什么是模板引擎?
通过代码说明:
举例子,没有使用模板引擎的时候,写代码的方式:
需求:查询数据库的用户列表,并在页面中显示出来


image.png
image.png

在公司开发项目的时候,是有分工的
如果按照上面编写代码的话,

  1. 不便于维护,前端的人员不懂php的语法
  2. 这样写的话,也不符合现在最流行的MVC模式
    按照MVC的规范,分为3层


    image.png

使用smarty模板引擎,将php分配给html文件的数据,显示出来
模板引擎的核心就是,将php代码(业务逻辑代码) 和 数据显示 相分离

2. smarty入门案例

  1. 下载smarty


    image.png
  2. 解压


    image.png

3. 将libs核心类库拷贝到我们的项目目录中,为了和其他的类库区分,将其重命名为:smarty


image.png
  1. 将smarty里面的Smarty.class.php 引入到我们的php文件,并实例化


    image.png

入门案例:

  1. 先指定将变量分配到哪个模板文件中
  2. 再分配数据
  3. 显示


    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

替换模板中标签:


image.png

4. 模板中的变量来源

(1)最常见的是php文件分配过来的变量

(标量、数组、对象)

(2)还可以使用配置文件的变量

什么是配置文件呢?

现在有3张图片

image.png

如果一天,图片的路径变化了,我们需要将所有img标签里面的src属性的值都替换
这样做效率是比较低的
我们可以通过配置文件修改,只需要改一下配置,所有的图片路径都会跟着变化
在smarty中,使用配置文件(系统)

  1. 先告诉smarty我的配置文件在哪里


    image.png
  2. 定义配置文件里面的信息


    image.png
  3. 在模板中使用配置文件里面定义的数据、信息
    (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变量

image.png

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
  1. 在父级模板声明被继承以及能够被重写的部分
    通过block标签声明,默认是被字模板重写


    image.png

3. 在子级模板中继承父级模板的内容,并重写

首先声明继承的是哪个模板

extends声明


image.png
  1. block标签默认重写父级模板的内容,我们可以通过 append、prepend属性

设置追加写


image.png

literal标签,告诉smarty,literal包起来的内容,不使用smarty解析


image.png
image.png

8. smarty的缓存

1. 简单复习:

PDO数据库扩展

  1. 开启扩展、重启Apache
  2. new PDO()
  3. 执行增删改查
    Smarty模板引擎
  4. 下载smarty类库
  5. new Smarty;
  6. 分配数据:assign
  7. 显示内容:display
    需求:
    我有一数据库phone,两张表:goods、category
    将商品表的商品信息(id、商品名称、商品价格)查询并显示成一格列表
    步骤:
  8. 命令DAOPDO这个类去查询数据


    image.png
  1. 命令smarty显示数据


    image.png
    image.png

2. smarty的缓存

先查看一下IE浏览器的历史记录文件


image.png

思考?ie浏览器为什么要将这些文件保存到本地?

便于下次再访问该文件的时候,提高速度

3. 缓存图例:

(1)使用缓存以前的代码是这样写的:

image.png

缺点就是:
每次请求,都要请求数据库,众所周知,数据库不在本地,可能在美国、香港、杭州
所以这样的效率、执行速度是比较慢的
考虑将第一次请求查询到的数据保存到本地,这样,当用户下次访问 或者 其他用户访问goods_list.php文件的时候,直接读取缓存的文件,速度更快
具体实现:

  1. 首先,在smarty中开启缓存,有三个步骤:
    步骤1:直接将caching属性设置为1,就表示开启
    步骤2:设置缓存的时间,过期之后销毁
    步骤3:设置缓存文件的保存目录
  2. 测试一下,在浏览器访问:goods_list.php


    image.png

访问之后,会在我们项目的cache目录生成一个缓存文件:


image.png

(2)开启缓存之后的流程图

image.png

4. 局部不缓存

举例说明:股票、价格等时时变化的数据能缓存吗?不能
(1)概念:
一个网页大部分是可以缓存,当然一些小的地方(价格、时间等)这些时时变化的数据是不能缓存的,使用局部不缓存实现
(2)代码实现insert标签:
在smarty中,局部不缓存是通过{insert}标签实现,原理就是{insert}每次都会执行
语法格式:
{insert name=”函数名”}
这样,每次都会执行该函数
insert插入的函数不能随便写,有如下规范:
(1)文件命名规范:

image.png

函数命名规范:


image.png

参数规范:


image.png

在自定义函数里面如何接受传递的参数呢?


image.png

接下来通过id获取商品价格


image.png

测试一下:


image.png

(2)单模板多缓存

  1. 创建一些测试数据
    创建一个小说表:novel
    id title
create table novel(id int primary key auto_increment,title varchar(30))en
gine myisam default charset utf8;
image.png
  1. 在php文件中拿到所有数据


    image.png

给模板分配过去:


image.png

模板显示:


image.png

测试一下:


image.png
image.png

不管传递的参数是 0 1 2 返回的结果都是
安娜卡列尼娜
思考,什么原因?
就是因为开启了缓存,每次请求都是读取的缓存的内容


image.png

如何实现,一个模板根据传递参数的不同,生成多个缓存文件

通过smarty的单模板多缓存实现

在display()的时候设置,如果传递第二个参数,就表示先查看缓存目录里面有没有根据该参数生成的缓存,如果没有则创建一个,如果有,则直接读取缓存内容


image.png

优化:

  1. 既然已经有缓存文件了,就不需要在去数据库查询了


    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
上一篇下一篇

猜你喜欢

热点阅读