美文网首页
第5天 smarty技术

第5天 smarty技术

作者: zphphp | 来源:发表于2019-11-02 12:23 被阅读0次

    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

    相关文章

      网友评论

          本文标题:第5天 smarty技术

          本文链接:https://www.haomeiwen.com/subject/drvcbctx.html