一、模板引擎简介
什么是模板?所谓模板就是指无PHP代码,只有HTML+CSS+JS。
什么是模板引擎?模板引擎主要工作就是对我们的模板(界面)与业务逻辑(PHP代码)相分离的一种解决方案。
二、如何去开发一个模板引擎
如何将PHP与HTML分离出来,想以前学过那些文件操作函数。
demo03.php demo03.html
三、封装自己的模板引擎
思路:
1、首先进行html页面与php页面分离
2、分配变量到模板页面
3、输出显示
';
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模板
smarty是基于PHP开发的PHP模板引擎,他提供了逻辑与外在内容的分离
1、smarty的特点
以下不适用于模板引擎
2、smarty下载和安装
下载smarty
文件说明:
demo:系统提供的实例文件
libs:核心文件
3、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、编译原理
如何判断模板文件是否改变?
文件在系统中的表现形式有三个时间:
创建时间:ctime
修改时间:mtime
访问时间:atime
判断是否改变的依据是采用修改时间,判断修改时间是否有改变,改变就是模板发生了变化,否则就没改变
smarty开发流程
1)把libs核心文件包含到我们当前项目中,并改名为smarty
2)创建业务逻辑页面PHP页面和HTML模板页面
3)在PHP中,包含Smarty.class.php文件到当前页面
4)实例化对象
5)分配变量到模板文件assign($name,$value)
6)显示输出display($file)
smarty开发流程图
6、smarty中相关属性和方法
1、左右定界符
2、相关方法
assign($name,$value)
解析:assign函数分配变量到模板文件,$name标记名 $value赋的值
display($file)
解析:显示并输出相应的模板$file代表模板文件路径
3、常用路径设置
由于很多自定义系统不想采用默认的设置路径,那么可以通过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);
模板页
{$title}
{*一维数组的调用方法*}
lamp中的l:{$lamp[0]}
lamp中的a:{$lamp[1]}
lamp中的m:{$lamp[2]}
lamp中的p:{$lamp[3]}
{*二维数组的调用方法*}
{$person[0]['age']}---{$person[0]['address']}
{*对象的调用方法*}
{$user->speak()}
2.2、从配置文件中读取变量
语法:{config_load file ="file.conf"}
file:配置文件路径
调用的方法:{#变量名#} 或 {$smarty.config.变量名}
2.3在模板文件中创建
{assign var='变量名称' value='变量的值'}
{变量 = 变量值}
扩展
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’}
4、变量调节器
什么是变量调节器实际上就是一些函数,这些函数的功能就是对变量进行格式化
{$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转
{$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:'
'} 行宽约
5、系统内建函数
1capture
语法:
{capture var="content"}
内容
{/capture}
作用:捕获一部分内容或变量,赋值给content
调用方式:{$smarty.capture.content}
2config_load
配置文件
全局变量直接通过
{config_load file="配置文件路径"}
调用方式:{#变量名#}
局部变量调用方式:
{config_load file="配置文件路径" section="节的名称"}
3foreach(采用PHP语法进行遍历)
4foreach(采用smarty中的语法进行遍历)
语法:
{foreach from=数组 key=键 name=名称 item=内容}
{foreachelse}
{/foreach}
参数说明:
from:要遍历的数组名称,必选
item:要遍历的内容或选项,必选
key:代表数组的索引键值
name:该foreach的名称
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 循环的总次数
5、include 函数
{include file='var' assign='var' [var...]}
文件包含,同时可以通过assign进行变量传递
6、include_php
{include_php file='var' assign='var' once='true|false'}
7、if elseif else
语法:
{if}
{elseif}
{else}
{/if}
8、literal
语法:
{literal}
.....
{/literal}
9、section sectionelse
{section name=名称 loop=循环数组 start=开始(0) step=步阶(1) max=最大循环次数}
{sectionelse}
{/section}
参数:
name:代表section名称,在循环过程中,会作为索引,必选
loop:代表循环数组,由其来确定循环的次数,必选
start:默认从第几个元素开始遍历
step:每次循环次数,默认是1
max:最大循环次数
一维数组的遍历:
二维数组的遍历:
10strip函数
{strip}
....
{/strip}
功能及应用:去除任何位于{strip}{/strip}标记数据中记录的首尾空格和回车,这样可以保证模板容易理解且不用担心多余的空格导致问题
11counter
{counter start=0 skip=2 print=false}
{counter}
{counter}
主要功能:进行计数
12cycle
实现轮显效果
参数说明:
values='参数1,参数2,参数3,...参数n'
每次循环时,第一条采用参数1,第二条采用参数2,....
六、系统自定义函数
1、{debug}
功能:开启调试窗口
2、fetch
{fetch file="file" assign="var"}
功能:载入文件到当前文件,并赋值给var变量
输出是采用{$var}
3、html_image
{html_image file="pumplink.png"}
参数file:文件路径
功能:显示图片
4、html_table
{html_table loop=$data cols=4 table_attr="border=0"}
参数:
loop:要遍历的数组名
cols:每行显示多少列
table_attr:附加属性
5、html_checkboxes
{html_checkboxes name='cust' value=$cust_ids checked=$customer_id output=$cust_names separator="
"}
参数:
name 复选框的名称
values 数组元素,复选框的值
checked 被选中的元素,数组
output 要显示的文字效果,数组
separator 复选框之间的分割符
6、html_options
参数:
values 要显示的值,数组
selected 要选中的下拉选项,数组
output 输出的文字,数组
7、html_radios
{html_radios values=$cust_ids checked=$customer_id output=$cust_names separator="
"}
七、程序篇
1、常量
SMARTY_DIR
代表包含Smarty.class.php文件的路径,也就是说哪个文件包含Smarty.class.php,那么它就会自动到该目录下寻找相应的文件夹(如plugins)。
2、常用的变量
$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 分配变量到模板文件(引用)
append 追加数据到数组,过程分为两步
第一是追加数据到数组中
第二分配变量到模板文件中(也就不需要assign赋值了)
appendByRef 追加元素地址到数组中
clearAllAssign 清除所有赋值变量
clearAssign 清除指定变量的值
clearCache 清理缓存
configLoad 载入配置文件
clearConfig 清除配置文件信息
display 执行输出并显示指定页面
fetch 载入文件到字符串
如何在smarty模拟静态页技术?
templateExists 判断模板是否存在
七、缓存
1、smarty中的缓存设置
$smarty->setCacheDir($cache_dir) 设置缓存目录,不设置默认cache文件中
$smarty->caching=true 开启缓存机制caching=true,默认为false
编译目录代码
缓存目录代码
为什么说缓存要快于编译?因为编译文件,只是把标签替换成PHP代码,如数据库访问,而我们缓存文件,是直接把数据都结果或值放入php文件中,所以不需要去读取数据库,那么速度更快一些。
缓存优势:
缓存文件是从哪里来的?由编译文件生成的
编译文件是从哪里来的?访问PHP,通过Smarty调用html模板生成的。
缓存在什么时候会重新生成?1)时间过期
2)缓存删除
3)编译文件改变的时候
4)模板改变
2、缓存在smarty中的工作流程
3、缓存检测
我们读取数据库中的文章,如果采用以前的方法,那么每次都要重复的读取数据库。我如何通过缓存机制,来避免这个问题解决思路:我们可以不可以把数据库中数据缓存到我们的缓存文件中,那么下次在去访问同一页面时,将直接读取缓存文件。
$smarty->clearCache('tpl.tpl') 清除指定模板缓存文件
$smarty->clearAll() 清除所有缓存文件
注:这两个功能不开启缓存也可以使用
4、缓存的存储方式
我们的smarty缓存是存储在服务器的
5、局部缓存
使用方法:
$smarty->assign('var','value',true)
6、单页面多缓存
当我们第一次访问show.php?id=1时,以后每次请求都自动获取到了id=1这条数据库记录
$smarty->caching=true
$smarty->display('tpl',$id)
参数
最后那个参数,必须是唯一的,能区别所有的连接不同
7、缓存集合
八、过滤器
中国政府是一个好政府。如何把该段输出的文字中的“政府”两字换成”**”
过滤器的种类有三种:
Prefilters:预过滤器
Postfilters:后过滤器
Outputfilters:输出过滤器
用法:
$smarty->registerFilter($type,callback)
$type:过滤器类型(pre,post,output)
callback:自定义函数