(笔记)php-smarty模板引擎

<h1>一、模板引擎简介</h1>
<blockquote>什么是模板?</blockquote>所谓模板就是指无PHP代码,只有HTML+CSS+JS。
<blockquote>什么是模板引擎?</blockquote>模板引擎主要工作就是对我们的模板(界面)与业务逻辑(PHP代码)相分离的一种解决方案。
<h1>二、如何去开发一个模板引擎</h1>
如何将PHP与HTML分离出来,想以前学过那些文件操作函数。
demo03.php demo03.html


demo03.php

demo03.html

<h1>三、封装自己的模板引擎</h1>
思路:
1、首先进行html页面与php页面分离
2、分配变量到模板页面
3、输出显示

<?php
class Template{
    //定义一个数组来接受数据
    private $data = array();
    //定义html(模板)路径
    //定义标签的左右标识符
    public $left_limiter = '<{';
    public $right_limiter = '}>';
    public $Template_dir="./";//./表示当前路径
        /**
         * 自定义模板框架*/
    /**
     * 定义一个方法来分离html和php代码
     * @param $name 表示标签
     * @param $value 表示替换的值*/
    public function assign($name,$value) {
        $this->data[$name]=$value;
    }
    //显示内容
    public function display($file){
        //获取html文件
        $str = file_get_contents($this->Template_dir.$file);
        
        foreach($this->data as $key=>$val){
            
            $str = str_replace($this->left_limiter.$key.$this->right_limiter, $val, $str);
        }
        echo $str;
        
    }
}

?>

下面我们讲smarty模板


四、smarty模板

<blockquote>smarty是基于PHP开发的PHP模板引擎,他提供了逻辑与外在内容的分离</blockquote>

1、smarty的特点

<li>速度:相对于其他模板引擎,smarty可以提供更快响应速度</li><li>编译型:把模板文件替换成一个HTML+PHP混合样式的PHP文件,当下模板没有改变,将自动转向导编译文件</li><li>缓存技术:实际上是把最终显示的页面文件,在一定的缓存时间内,生成静态html文件,当我们访问访问模板文件,将直接转向到静态页面html</li><li>插件技术:该模板引擎,可以自定义(函数),非常灵活</li>
<blockquote>以下不适用于模板引擎</blockquote>
<li>实时更新 比如:股票,天气预报</li>

2、smarty下载和安装

下载smarty

文件减压后

文件说明:
demo:系统提供的实例文件
libs:核心文件

3、libs目录分析

libs目录
libs目录说明:
plugins:自定义插件文件夹
sysplugins:系统插件文件夹
debug.tpl:调试模板
Smarty.class.php:Smarty3.0中的核心类文件
$martyBC.class.php:向后兼容类,Smarty2.0版本

4、Smarty配置

1)复制libs文件夹到项目目录下,改名为smarty方便以后使用
2)配置系统默认文件夹,虽然运行过程,系统可以自动生成,但是,建议大家手动创建文件夹,如果在linux中,对我们的目录没有写权限的,所以要先建好相应的目录,目录参考smarty.class.php中


创建目录的文件
创建的目录:
templates:定义默认模板文件夹
templates_c:定义编译目录
cache:定义缓存文件夹
configs:定义默认配置文件夹

5、编译原理

<blockquote>如何判断模板文件是否改变?</blockquote>

文件在系统中的表现形式有三个时间:
创建时间:ctime
修改时间:mtime
访问时间:atime

判断是否改变的依据是采用修改时间,判断修改时间是否有改变,改变就是模板发生了变化,否则就没改变

编译原理图

smarty开发流程
1)把libs核心文件包含到我们当前项目中,并改名为smarty
2)创建业务逻辑页面PHP页面和HTML模板页面
3)在PHP中,包含Smarty.class.php文件到当前页面
4)实例化对象
5)分配变量到模板文件assign($name,$value)
6)显示输出display($file)
smarty开发流程图
demo01.php

demo01.html

6、smarty中相关属性和方法

1、左右定界符


左右定界符

修改左右定界符

Paste_Image.png

2、相关方法

assign($name,$value)
解析:assign函数分配变量到模板文件,$name标记名 $value赋的值
display($file)
解析:显示并输出相应的模板$file代表模板文件路径

3、常用路径设置
<li>setTemplateDir()</li><li>setCompileDir()</li><li>setConfigDir()</li><li>setCacheDir()</li>
由于很多自定义系统不想采用默认的设置路径,那么可以通过set方法来定义目录结构


自定义目录结构

五、设计篇

1、注释

语法:{*注释代码*}
注释示例代码

2、变量
2.1、从PHP中分配的变量

$smarty->assign('title',$title);
//2、分配一维数组变量到模板
$lamp = array('linux','Apache','Mysql','PHP');
$smarty->assign('lamp',$lamp);
//3、分配二维数组到模板
$person = array(
    array('name'=>'ly','age'=>'20','address'=>'cz'),
    array('name'=>'ly','age'=>'20','address'=>'cz'),
    array('name'=>'ly','age'=>'20','address'=>'cz')
);
$smarty->assign('person',$person);
//4、分配对象到模板
class Person{
    public $name;
    public function speak(){
        echo $this->name.'在说话...';
    }
}
$user = new Person();
$user->name = 'ly';
$smarty->assign('user',$user);

模板页

<html>
<body>
<h1>{$title}</h1>
<hr>
{*一维数组的调用方法*}
lamp中的l:{$lamp[0]}
<br/>
lamp中的a:{$lamp[1]}
<br/>
lamp中的m:{$lamp[2]}
<br/>
lamp中的p:{$lamp[3]}
<hr>
{*二维数组的调用方法*}
{$person[0]['age']}---{$person[0]['address']}
<hr>
{*对象的调用方法*}
{$user->speak()}
</body>
</html>

2.2、从配置文件中读取变量

语法:{config_load file ="file.conf"}

file:配置文件路径
调用的方法:{#变量名#} 或 {$smarty.config.变量名}


调用配置文件中的变量

2.3在模板文件中创建

{assign var='变量名称' value='变量的值'}
Paste_Image.png
{变量 = 变量值}
Paste_Image.png

扩展


Paste_Image.png

3、smarty中保留变量

$smarty.get.page相当于$_GET['page']
$smarty.post.page 相当于 $_POST['page']
$smarty.cookies.username 相当于 $_COOKIES['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.now|date_format:’%Y-%m-%d %H:%M:%S’}

Paste_Image.png

4、变量调节器
<blockquote>什么是变量调节器</blockquote>实际上就是一些函数,这些函数的功能就是对变量进行格式化

{$var|capitalize} 首字母大写
{$var|count_characters:true} 字符计数
{$var|cat:var2} 连接字符串
{$var|count_paragraphs} 段落计数
{$var|count_sentences} 句子计数
{$var|count_words} 计算词数
{$var|data_format:"%Y%m%d"} 时间格式化
{$var|default:"value"} 如果变量为空或为定义,那么采用默认值
{$var|escape} 编译转码
{$var|indent:10:"*"} 首行缩进,后面的参数表示每个缩进字符要放的字符
{$var|lower} 字符串小写
{$var|nl2br} \n转<br/>
{$var|regex_replace:"/[\t\n]/",""} 正则替换
{$var|spacify:"^^"} 在字符之间插入相应字符如^^
{$var|string_format:'%d'} 字符串格式化
{$var|strip:'*'} 去掉重复空格
{$var|strip_tags} 去除html标签
{$var|truncate:30:'...'}:字符串截取,注意,优缺点
{$var|upper} 大写
{$var|wordwrap:30:'<br>'} 行宽约
实例代码

5、系统内建函数

1capture

语法:
{capture var="content"}
内容
{/capture}

作用:捕获一部分内容或变量,赋值给content
调用方式:{$smarty.capture.content}


capture 实例代码

2config_load
配置文件


配置文件

全局变量直接通过
{config_load file="配置文件路径"}
调用方式:{#变量名#}

局部变量调用方式:
{config_load file="配置文件路径" section="节的名称"}


局部变量调用

3foreach(采用PHP语法进行遍历)
采用PHP语法进行遍历

4foreach(采用smarty中的语法进行遍历)
语法:
{foreach from=数组 key=键 name=名称 item=内容}
{foreachelse}
{/foreach}
参数说明:
from:要遍历的数组名称,必选
item:要遍历的内容或选项,必选
key:代表数组的索引键值
name:该foreach的名称
采用smarty中的语法进行遍历

<li>二维数组遍历</li>


二维数组遍历

<li>二维数组遍历有两种方式:</li>


二维数组遍历的两种方式
foreach--附加属性
$smarty.foreach.name.index @index 下标0
$smarty.foreach.name.iteration @iteration 迭代(当前是第几次循环),默认从1开始
$smarty.foreach.name.first @first bool当时第一次该值为真
$smarty.foreach.name.last @last bool当时最后一次该值为真
$smarty.foreach.name.show @show 数据显示true显示数据,false不显示数据
$smarty.foreach.name.total @total 循环的总次数
foreach附加属性实例

5、include 函数

{include file='var' assign='var' [var...]}

文件包含,同时可以通过assign进行变量传递


图解

实例代码

6、include_php

{include_php file='var' assign='var' once='true|false'}
include_php实例代码

7、if elseif else

语法:
{if}
{elseif}
{else}
{/if}
实例代码

8、literal

语法:
{literal}
    .....
{/literal}
literal

9、section sectionelse

{section name=名称 loop=循环数组 start=开始(0) step=步阶(1) max=最大循环次数}
{sectionelse}
{/section}
参数:
name:代表section名称,在循环过程中,会作为索引,必选
loop:代表循环数组,由其来确定循环的次数,必选
start:默认从第几个元素开始遍历
step:每次循环次数,默认是1
max:最大循环次数

一维数组的遍历:


section

二维数组的遍历:


二维数组的遍历

10strip函数
{strip}
    ....
{/strip}

功能及应用:去除任何位于{strip}{/strip}标记数据中记录的首尾空格和回车,这样可以保证模板容易理解且不用担心多余的空格导致问题
11counter

{counter start=0 skip=2 print=false}
{counter}<br>
{counter}<br>
主要功能:进行计数
counter

12cycle

<tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}"/>
实现轮显效果
参数说明:
values='参数1,参数2,参数3,...参数n'
每次循环时,第一条采用参数1,第二条采用参数2,....
cycle

六、系统自定义函数

1、{debug}
功能:开启调试窗口


Paste_Image.png

2、fetch

{fetch file="file" assign="var"}
功能:载入文件到当前文件,并赋值给var变量
输出是采用{$var}
fetch实例代码

3、html_image

{html_image file="pumplink.png"}
参数file:文件路径
功能:显示图片
html_image

4、html_table

{html_table loop=$data cols=4 table_attr="border=0"}
参数:
loop:要遍历的数组名
cols:每行显示多少列
table_attr:附加属性
html_table

5、html_checkboxes

{html_checkboxes name='cust' value=$cust_ids checked=$customer_id output=$cust_names separator="<br/>"}
参数:
name 复选框的名称
values 数组元素,复选框的值
checked 被选中的元素,数组
output 要显示的文字效果,数组
separator 复选框之间的分割符

6、html_options

<select name=customer_id>   
{html_options values=$cust_ids selected=$customer_id output=$cust_names} 
</select>
参数:
values 要显示的值,数组
selected 要选中的下拉选项,数组
output 输出的文字,数组

7、html_radios

{html_radios values=$cust_ids checked=$customer_id output=$cust_names separator="<br />"} 
Paste_Image.png

七、程序篇

1、常量
SMARTY_DIR
代表包含Smarty.class.php文件的路径,也就是说哪个文件包含Smarty.class.php,那么它就会自动到该目录下寻找相应的文件夹(如plugins)。
2、常用的变量
<li>$template_dir</li><li>$compile_dir</li><li>$config_dir</li><li>$cache_dir</li><li>$left_delimiter</li><li>$right_delimiter</li>


常用的变量
$caching            缓存 bool类型的值,true默认false
$cache_lifetime     缓存过期时间,默认单位为秒
$debugging      开启调试
debugging,应用在php文件中
功能:只能调试php中的变量信息
{debug},应用在模板文件中
功能:无论是php分配的变量或自定义的变量都可以进行调试
$php_handling       主要应用就是{php}{/php},在Smarty3.0版本之前,如果想使用php标签,那么必须开启php_handing=true;

3、常用方法

assign 分配变量到模板文件
assignByRef 分配变量到模板文件(引用)
Paste_Image.png
Paste_Image.png
append 追加数据到数组,过程分为两步
第一是追加数据到数组中
第二分配变量到模板文件中(也就不需要assign赋值了)
appendByRef 追加元素地址到数组中
clearAllAssign 清除所有赋值变量
clearAssign 清除指定变量的值
Paste_Image.png
clearCache 清理缓存
configLoad 载入配置文件
clearConfig 清除配置文件信息
display 执行输出并显示指定页面
fetch 载入文件到字符串

<blockquote>如何在smarty模拟静态页技术?</blockquote>


Paste_Image.png

templateExists 判断模板是否存在


Paste_Image.png

七、缓存

1、smarty中的缓存设置

$smarty->setCacheDir($cache_dir) 设置缓存目录,不设置默认cache文件中
$smarty->caching=true 开启缓存机制caching=true,默认为false

Paste_Image.png

编译目录代码
编译目录代码

缓存目录代码
缓存目录代码

<blockquote>为什么说缓存要快于编译?</blockquote>因为编译文件,只是把标签替换成PHP代码,如数据库访问,而我们缓存文件,是直接把数据都结果或值放入php文件中,所以不需要去读取数据库,那么速度更快一些。
缓存优势:
<li>速度要更快</li><li>减少服务器I/O开销,减小服务器的压力</li><li>减小对服务器数据库的压力</li>
<blockquote>缓存文件是从哪里来的?</blockquote>由编译文件生成的
<blockquote>编译文件是从哪里来的?</blockquote>访问PHP,通过Smarty调用html模板生成的。
<blockquote>缓存在什么时候会重新生成?</blockquote>1)时间过期
2)缓存删除
3)编译文件改变的时候
4)模板改变
2、缓存在smarty中的工作流程
工作流程

3、缓存检测
<blockquote>我们读取数据库中的文章,如果采用以前的方法,那么每次都要重复的读取数据库。我如何通过缓存机制,来避免这个问题</blockquote>解决思路:我们可以不可以把数据库中数据缓存到我们的缓存文件中,那么下次在去访问同一页面时,将直接读取缓存文件。

$smarty->clearCache('tpl.tpl') 清除指定模板缓存文件
$smarty->clearAll() 清除所有缓存文件

注:这两个功能不开启缓存也可以使用

Paste_Image.png

4、缓存的存储方式
我们的smarty缓存是存储在服务器的
缓存存储方式

5、局部缓存

局部缓存原理
使用方法:
$smarty->assign('var','value',true)
Paste_Image.png
Paste_Image.png
Paste_Image.png

6、单页面多缓存
当我们第一次访问show.php?id=1时,以后每次请求都自动获取到了id=1这条数据库记录

$smarty->caching=true
$smarty->display('tpl',$id)
参数
最后那个参数,必须是唯一的,能区别所有的连接不同


7、缓存集合

八、过滤器

<blockquote>中国政府是一个好政府。如何把该段输出的文字中的“政府”两字换成”**”</blockquote>

过滤器的种类有三种:
Prefilters:预过滤器
Postfilters:后过滤器
Outputfilters:输出过滤器
用法:
$smarty->registerFilter($type,callback)
$type:过滤器类型(pre,post,output)
callback:自定义函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • PHP 学习目录 ├─PHP视频教程 1 LAMP网站构建 │ ├─PHP教程 1.1.1 新版视频形式介绍│ ...
    曹渊说创业阅读 16,151评论 29 417
  • 1.PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用...
    黄花菜已凉阅读 3,536评论 1 6
  • 小王今年二十六岁,姣好的面容妆容精致,细腻的皮肤温润如玉,吹弹可破,一身紫红色包臀裙把她的身材衬得凹凸有致。看着镜...
    清浅光阴阅读 264评论 0 0
  • 首先创建一个网站; 选择一个ASP.NET的空网站; 点击项目右键添加新项 找到Web服务 这样便创建好WebSe...
    DoubleDog阅读 487评论 0 0
  • 在遭遇到已经发生的,不可更改的不幸时,我们不可以允许自己这样想:事情本来可以有另外的结局,更加不可以设想我们...
    姜小夕阅读 546评论 0 5