Linfinity

Never say never.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php模板引擎--smarty

Posted on 2019-01-10 18:27  Linfinity  阅读(214)  评论(0)    收藏  举报

1、简介

含义:Smarty是PHP的一个引擎模板如Python的jinjia2模板引擎,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来。

目前模板引擎技术有很多Laravel框架(blade模板引擎)、ThinkPHP框架(自己的模板引擎技术)、Smarty模板引擎技术,虽然有很多模板引擎技术,但是原理都是一样的。

 

2、安装

在网上下载Smarty包直接将其解压,我们需要的仅仅是里面的libs文件夹。Libs文件里面都是库文件,我们不应该修改里面的任何内容。解压完毕后就直接将libs文件夹放入到我们需要使用的网站根目录。通常我们会把libs文件夹改名为smarty使用。

 

 3、使用

使用的话直接加载smarty里面的Smarty.class.php并实例化

template.php模板文件的代码

最终生成的编译文件会默认保存到templates_c这个目录(后期可以修改)

 

4、Smarty的变量来源

Smarty中的模板中变量的来源,有如下几种:

①smarty分配assign)过来的真实数据

 

②配置文件数据

首先定义一个配置文件保存图片的地址

说明由于该配置文件我们不会直接访问所以相对的路径应该是被谁引入出发点就是那个文件

其次,在html模板中要想使用配置文件,需要先加载配置文件

通过smarty对象的setConfigDir() 设置从哪个目录读取加载配置文件

输出

 

③smarty保留的变量

这些变量是smarty保留的内置的不需要声明加载可以直接使用

{$smarty.now},用来获得当前的时间戳

{$smarty.const.常量名},用来获得PHP文件中定义的常量

{$smarty.config},获得配置文件中的配置项

{$smarty.current_dir} ,当前文件所在的目录

 

PHP请求变量

html模板中,还可以获得PHP提供的http请求是携带的变量、PHP的环境变量等

 

 5、Smarty模板中变量调节器

介绍

变量调节器,就是对模板中的变量进行调节、修饰作用

例如:模板中可以使用{$smarty.now}获得当前的时间戳,用户看不懂时间戳的,所以我们需要对变量进行修饰,将其转换成日期格式就好了

 

如何使用:

语法{模板变量|修饰器:传递的参数}

 

变量调节器:

date_format:将时间戳转换成日期格式

 

 

capitalize:首字母大写

 

upper:字符串整体大写

 

count_characters:统计字符个数

 

default:默认值

如果变量为空字符串就可以使用默认值代替

 

indent:字符缩进

参数1:缩进的字符数量

参数2:默认显示空格,可以指定字符代替

 

 

escape: 用来转码的2个参数,默认采用实体转码,可以将其修改为url就会采用url转码

url转码之后的效果就是这样

 

truncate,字符串截取

参数1:截取的长度,

参数2:截取之后追加在字符串后面的字符,该追加的字符会被计算在截取的长度之内,例如:

 

注意:由于count_characters和truncate存在bug,一般不使用。。。

 

6、Smarty模板中流程控制语句

 

介绍

html模板中可以使用PHP的流程控制语句

foreach

for

if elseif  else

include

extends

block

literal

 

代码演示:

1foreach用来在模板中遍历数组语法格式

{foreach(遍历的数组 as $k=>$v)}

{foreachelse}

当遍历的数组为空的时候执行这里

{/foreach}

 

2for循环:

注意可以通过step属性设置步长值

 

3if、elseif、else的使用

注意结束符即可{/if}

 

4include,该标签是用来加载其他的模板文件的

哪里需要公共的代码在哪里include加载即可

 

5)extends模板继承

与jinjia2类似,注意语法即可

block标签还提供了2个参数:append表示追加在原来内容的后面,prepend追加到原来内容的前面

 

6literal,标签用来表示不采用smarty的语法去解析

比如我们的css

css里面的{},由于smarty的默认的占位符(标签)就是{}一看到花括号就去解析了,由于这里不需要smarty解析,所以我们就可以使用{literal}标签包起来

也可以通过修改smarty的默认占位符解决冲突。  

 

7、Smarty缓存

Smarty实现缓存:

再来访问一下

 

 

局部不缓存

介绍

局部不缓存,指的是网站中大部分使用缓存了,但是一些局部的地方(商品价格、天气情况、股票价格)不缓存

 

代码实现:

局部不缓存通过模板中的insert标签实现的,smarty看到insert标签的时候永远会执行即使该页面是缓存的看到insert标签之后还是会执行

Insert标签的使用需要遵循如下规范:

 

规范1:定义insert标签时:

name属性指向的是调用的函数

如果传递参数,通过键值对的形式传递

 

规范2getPrice函数文件的 命名规范

必须在smarty/plugins目录下定义

 

 

规范3:文件里面函数的命名规范

smarty_insert_函数名

 

单模板多缓存

介绍

单模板多缓存,一个模板生成多个缓存文件

Smartydisplay的时候生成了缓存文件后面读取的都是该缓存文件如何让一个模板生成多个缓存文件呢
需要通过display的第二个参数实现,会根据第二个参数创建对应的缓存文件

上面的代码中数据库是否执行,取决于目前是否存在缓存文件,通过smartyisCached()进行判断参数1:模板文件,参数2:创建单模板多缓存时的序号

 

 删除缓存

介绍

删除缓存有2个函数:

clearCache(),删除指定模板对应的缓存

clearAllCache(),删除所有的缓存

 

删除指定的缓存文件:

如果想删除一个模板对应的所有缓存文件不用传第二个参数

 

 

8、Smarty相关配置

设置模板、编译文件保存目录

介绍

通过setTemplateDirsetCompileDir两个方法分别设置模板文件在哪个目录编译文件在哪个目录

 

设置模板标签定界符

 

9、自定义模板引擎

<?php
//自定义的模板引擎
class MyTpl
{
    //该属性保存分配的数据
    private $tpl_vars = [];
    public function assign($k,$v)
    {
        $this->tpl_vars[$k] = $v;
    }
    public function display($filename)
    {
        //require_once 返回值是true、false
        //$file = require_once $filename;
        $content = file_get_contents($filename);
        
        //将里面的占位符替换成真实的数据
        foreach ($this->tpl_vars as $k=>$v){
            $content = str_replace('{$'.$k.'}', $v, $content);
        }
        //var_dump($new_content);
        //将替换好的内容写入到一个文件中
        $file = 'tpl_c/'.mt_rand(1000,9999).md5($filename).'.php';
        file_put_contents($file, $content);
        //显示新的文件的内容
        require_once $file;
    }
}
MyTPL.class.php