Smarty模版引擎技术全新整理(推荐初学使用理论较多)
2016-04-24 20:17
387 查看
Smarty模版引擎技术
=================================================================================================
一、什么是smarty模版引擎?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是smarty?
Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,使php程序员只专注于php代码的编写,网页美工只专注于网页的美化。
没有模版引擎时出现的问题?
(1).html中php代码比重越来越大;
(2).页面的数量越来越多;
(3).程序设计与美工设计分工不明确。
传统的php文件:
1. php代码跟html混编,不利于程序员和美工的分工
2. 数据的传递,同一页面传递,php数据在页面中的显示需要使用php标记
比如:<?php echo $username?> index.php
采用模版引擎后:
1.php代码与html代码分离开,php代码放在一个单独的php文件中,html代码放在一个单独的html文件中
2.数据传递,首现php中的数据先给了模版引擎,然后模版引擎再把接收到的数据给模版文件显示。
3.模版文件中不再有php代码或者说php标记的出现,模版中显示的数据都是通过模版引擎的标记显示出来的
index.php smarty模版引擎 index.html
目前php的模版引擎很多,为什么要使用smarty模版引擎?
1.一般的模版引擎,如,phplib都是在建立模版对象时取得要解析的模版,然后把变量套入后,再通过parse()这个方法来解析模版,最后再将网页输出,总结成一句话,那句是每次执行的时候都要重新解析一遍
2.对于smarty模版引擎来说,不必在程序里再做parse()这样的操作了,smarty会自动帮我们做,而且已经编译过的网页,如果在没有改动的情况下,smarty会跳过重新编译的动作而直接去执行编译过的网页,以节省编译时间。
Smarty的其它优点:
1.速度快:相对于其它的模版引擎而言
2.编译型:采用smarty编写的程序在运行时会编译成一个非模版技术的php文件。这个文件采用了php与html混合的方式,在下一次访问模版时将web请求直接转换到这个文件中,而无需重新编译(在模版文件没有改动的情况下)
3.缓存技术:它可以将用户最终看到的html网页缓存成一个静态的html网页。当用户开启缓存时,可以设置缓存时间,在缓存文件没到期之前,将用户的请求直接转换到这个静态的缓存文件,相当于调用了一个静态的html文件。
4.模版中可以使用流程控制语句。
不适合使用smarty的地方
1.需要实时更新的内容,例如:股票显示,它需要经常对数据进行更新
2.小项目。
Smarty模版引擎运作流程。
①在php程序运行时,初始化smarty模版引擎
②smarty模版引擎读取模版文件(.html或tpl文件)
③在读取模版文件的时候,smarty模版引擎会自动判断该模版文件是否需要重新编译。
④如果不需要重新编译,则直接进行模版变量替换。
⑤如果是第一次执行此程序文件或者说模版被改动了,那么就需要重新编译后再进行模版变量替换。
⑥最终执行的是编译后的php文件。
⑦输出结果到浏览器。
=================================================================================================
二、一个简单的使用smarty模版引擎技术的小例子
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
到官方网站去下载smarty模版引擎压缩包
官网:http://www.smarty.net
解压此压缩包,发现其下有一个libs文件夹,将libs文件夹重命名为smarty,
并移动到网站根目录下的libs文件夹
打开smarty引擎libs文件夹,里面有如下文件:
sysplugins:系统插件目录
plugins:外部插件
debug.tpl:输出debug调试信息输出的模板
Smarty.class.php: smarty模版引擎核心类文件,要使用smarty模版引擎,首先要引入该文件
SmartyBC.class.php:
搭建Smarty模板示例:在使用smarty之前,首现需要对核心类文件(Smarty.class.php)进行配置。
1. 将libs库目录复制过来。
2. 创建一个模板目录templates模板文件存放目录
创建一个configs配置文件目录
3. 编写index.php文件(入口文件)做Smarty导入和创建
//1.导入Smarty类
require("libs/Smarty.class.php");
//2.创建对象
$smarty = new Smarty();
//3.初始化信息
$smarty->left_delimiter="<{"; //重新定义Smarty模板的左定界符
$smarty->right_delimiter="}>"; //重新定义Smarty模板的右定界符
//静态缓存
$smarty->caching=true; //是否开启静态缓存 true(开启)
$smarty->cache_lifetime=5; //设置缓存时间 (5表示缓存5秒钟)
//4.放置变量:
$smarty->assign("name","zhangsan");//向Smarty模板中放置变量name值为张三
$smarty->assign("date",date("Y-m-d H:i:s"));//为模板放一个时间
//5.加载模板:
$smarty->display("index.tpl");
4.使用浏览器访问index.php,将会创建目录templates_c和cache目录
5. 最后的结构:
根目录
|--libs //Smarty库
| |--Smarty.class.php
|--templates //模板目录
| |--index.tpl
|--templates_c //模板编译目录
|--cache //模板静态缓存目录(注意需开启缓存)
|--configs //配置文件目录
|--index.php //php文件(入口)
相对路径:在程序文件中引入外部文件或设置目录时都是以本文件为基础的
比如:要在index.php文件中引入Smarty.class.php文件,因为Smarty.class.php文件位于libs/smarty文件夹下,而index.php文件又跟libs文件夹同级,所以应该这样引入:
include_once “libs/smarty/Smarty.class.php”;
简单的分析一下Smarty.class.php核心类文件
它是一个类文件:类是由属性(变量)和方法构成
类的名称:Smarty
主要属性或变量:
$template_dir: 模版目录,主要用来存放模版文件,如:.html文件、.tpl文件
$compile_dir: 编译目录,主要用来存放编译后的php文件,即混编方式的文件
$config_dir: 配置目录,主要用来存放公共的配置文件
$cache_dir: 缓存目录,主要用来存放缓存文件
$left_delimiter: 左边界符
$right_delimiter: 右边界符
$caching 是否开启缓存
$cache_lifetime 定制缓存时间
主要方法:
assign():主要用来将php中的标量类型的数据赋值给模版变量。
display():主要用来显示指定的模版文件
=================================================================================================
三、使用smarty模版引擎的步骤:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一步:引入smarty核心类文件并创建一个smarty实例对象:
include_once “libs/smarty/Smarty.class.php”;
$smarty=new Smarty();
第二步:对核心类中属性或变量的配置
$smarty->template_dir=”./templates”;
$smarty->compile_dir=”./templates_c”;
$smarty->config_dir=”./configs”;
$smarty->caching=false;
$smarty->cache_dir=”./cache”;
$smarty->left_delimiter=”{”;
$smarty->right_delimiter=”}”;
第三步:给模版变量赋值
$smarty->assign(“模版变量”,”值(变量|数组)”);
比如:$smarty->assign(“username”,”张三”);
第四步:显示对应的模版文件
$smarty->display(“模版文件名”);
比如:$smarty->display(“index.html”);
第五步:在模版文件中使用smarty的左右边界符将模版变量显示出来
<html>
<head></head>
<body>
用户名:{$username}
</body>
</html>
=================================================================================================
四、Smarty应用之模版变量:分三种来源
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
从php中分配的变量
1. 格式:$smarty->assign(“模版变量”,”值(变量|数组)”);
2. 例如:$username=”小三”;
//将php变量分配给模版变量
$smarty->assign(“username”,$username);
3. 在模版文件中通过左右边界符来显示模版变量
例如:{$username}
{$smarty}保留变量
1.使用保留变量可访问页面请求变量:get、post、server、request、session等
例如:页面请求变量:
{$smarty.get.username} //相当于在php文件中访问$_GET[‘username’]
{$smarty.post.username} //相当于在php文件中访问$_POST[‘username’]
{$smarty.session.username}//相当于在php文件中访问$_SESSION[‘username’]
{$smarty.cookie.username}//相当于在php文件中访问$_COOKIE[‘username’]
{$smarty.request.username}//相当于在php文件中访问$_REQUEST[‘username’]
{$smarty.server.REMOTE_ADDR} //相当于在php文件中访$_SERVER[‘REMOTE_ADDR’]
2.使用保留变量可访问常量:const
{$smarty.const.__FILE__}
3.使用保留变量可读取配置文件的变量:config
{$smarty.config.username}
读取配置文件中的变量
1. 配置文件应放在$smarty->config_dir=”./configs”指定的目录下面
2. 配置文件的后缀名为 .conf
3. 配置文件:myself.conf
#全局配置变量
title=“调用配置文件”
bgcolor=“red”
border=5
type=“计算机”
name=“php从入门到精通”
#局部变量
[login]
username=“用户名”
password=“密 码”
4. 一个配置变量占一行,并且后面没有以分号结尾
5. 模版中引用配置文件中的变量
首先要加载配置文件:
//加载配置文件,但是只能将全局变量加载进来
{config_load file=“my.conf”}
//如果要加载局部变量,需要使用section属性指定特定的节
{config_load file=“my.conf” section=“login”}
模版文件中引用配置文件中变量的方法:
//第一种:需要使用两个#
比如:{#title#}
//使用{$smarty}保留变量
比如:{$smarty.config.bgcolor}
=================================================================================================
五、Smarty变量操作符或变量调节器
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是smarty的变量操作符?
1.smarty模版引擎中有内置的一些函数,这些函数主要用来修饰或调节变量,
我们称之为变量操作符或变量调节器,变量操作符主要用于操作变量,
它可以帮助我们完成许多比较实用的功能,
比如:首字母大写、拆分、替换、截取等等,
这些功能通过smarty模版引擎可以很容易的在模版文件中实现,
而不必再在php文件中通过php的内置函数去处理,这样的话就减少了php的代码量
如何使用smarty的变量操作符?
1.语法中使用 “|” 来应用变量操作符,多个参数用 ”:” 分隔开来
比如: 在模版文件中使用变量操作符截取前十个字符
{$name|truncate:10}
2.常见的smarty变量操作符
capitalize [首字母大写]
count_characters [计算字符数]
cat [连接字符串]
count_paragraphs [计算段落数]
count_sentences [计算句数]
count_words [计算词数]
date_format [时间格式]
default [默认]
escape [转码]
indent[缩进]
lower[小写 ]
nl2br[换行符替换成<br />]
regex_replace[正则替换]
replace[替换]
spacify[插空]
string_format[字符串格式化]
strip[去除(多余空格)]
strip_tags[去除html标签]
truncate[截取]
upper[大写]
wordwrap[行宽约束]
3.使用smarty变量操作符的例子
例如:
日期:{$smarty.new|date_format:”%Y-%m-%d”}
变量中的字符数(包括空格):{$str|count_characters:true}
多个变量操作符修饰一个变量:{$str|nl2br|upper|cat:”张三”}
模版变量+“张三”:{$str1|cat:”张三”}
缩进四个空白字符,并使用*来代替:{$str2|indent:4:”*”}
把变量中的”hello”替换为“world”:{$str3|replace:”hello”,”world”}
=================================================================================================
六、Smarty模版引擎的内置函数(或标记)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
foreach标记
1.foreach标记处理数组
在模版中必须使用成对的foreach标签遍历数组中的数据,
而且必须设置from和item两个属性
格式:{foreach from=$users item=user key=key}
2.foreach标记的属性
(1)from:待循环数组的名称
(2)item:当前元素的变量名称
(3)key:当前元素的键名
(4)name:该循环的名称
3.foreachelse子标记
(1)当from属性指定的数组为空时,则输出foreachelse区域中的内容
(2)foreachelse必须与foreach一起使用
(3)foreachelse没有结束标记
4.使用案例:
//循环一维数组:aaa为数组中当前元素的变量名称
{foreach from=$user item=aaa}
{$aaa}
{/foreach}
//循环二维数组:如果users代表多个用户,那么user就代表当前用户
{foreach from=$users item=user}
姓名:{$user.username}
性别:{$user.sex}
{/foreach}
//foreachelse子标记的用法:
{foreach from=$users item=user}
姓名:{$user.username}
性别:{$user.sex}
{foreachelse}
暂时没有数据
{/foreach}
include标记
1.在模版文件中包含子模版
格式:{include file=“模版文件路径”}
2.例如
(1)包含公共头部文件: {include file=“header.html”}
(2)包含公共尾部文件: {include file=“footer.html”}
3.两个比较使用的特性:
(1)可在include标记中传入可选的assign属性,将导入的子模版内容不再当
前模版中输出,而是赋值给assign属性指定的变量。
例如:{include file=“header.html” assign=“header”}
(2)可以在引入子模版的同时向其传递各种属性
例如:{include file=“header.html” title=“头部文件”}
if标记
1.常跟条件修饰符一块使用
2.常见的条件修饰符
(1) eq:相等 neq:不等
(2) mod:求模 gt:大于
(3) is even:是否是偶数 not:非
(4) ge:大于等于 lt:小于
(5) lte:小于等于
(6) ==:相等 !=:不相等
(7) >:大于 <:小于
(8)<=:小于等于 >=:大于等于
3.使用
(1)模版文件中使用smarty模版引擎的if条件语句
{if $name eq ‘admin’}
<font color=“red”>管理员登录</font>
{else}
<font color=“red”>你没有登录权限</font>
{/if}
(2)模版文件中使用smarty模版引擎的if条件语句
{if $quanxian eq ‘admin’}
<font color=“red”>管理员登录</font>
{elseif $name eq ‘xiaosan’}
<font color=“red”>普通会员登录</font>
{else}
<font color=“red”>你没有登录权限</font>
{/if}
literal标记
1.literal文本的处理技巧
literal中的数据将被当作文本处理,此时模版将忽略其内部的所有字符信息
该特性用于显示有可能包含大括号等字符信息的javascript脚本
2.例如:literal标记中的所以字符信息将被当作文本来处理
{literal}<script>…</script>{/literal}
section标记
1.section标记处理数组
在模版中必须使用成对的section标签遍历数组中的数据,而且必须设置name和loop两个属性
格式:{section name=i step=2 start=2 max=10 loop=$users}
2.section标记的属性:
(1)name:指定该循环的名称,当需要在section循环内输出变量时,必须在变量后加上中括号,中括号中必须包含name变量
(2)loop:循环变量的名称
(3)start:循环执行的初始索引位置
(4)step:该值决定循环的步长,例如:step=2将之遍历下标为0、2
、4等元素
(5)max:设定最大循环次数,比如:max=2,代表最多循环2次
(6)show:决定是否显示该循环,默认值为1-显示循环 0-禁止循环
3.section循环区域中可以调用的变量
在section循环中有一些可供调用的变量名,用来访问该循环中一些特殊的值,而且在循环中必须通过smarty保留变量$smarty进行访问
格式:{$smarty.foreach.foreachname.varname}
(1)first:当前section循环在第一次执行时该变量的值为true
(2)last:当前section循环在最后一次执行时该变量的值为true
(3)rownum:循环的行数,与iteration变量差不多
(4)index:显示当前循环的索引
(5)iteration:显示循环的次数
4.sectionelse字标记
(1)当loop属性指定的数组为空时,则输出sectionelse区域中的内容
(2)sectionelse必须与section一起使用
(3)sectionelse没有结束标记
格式:
{section name=i loop=$users}
{$users[i].username}
{sectionelse}
<div><font color=“red”>暂时没有数据</font></div>
{/section}
=================================================================================================
七、Smarty缓存的应用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.设置缓存
(1)$smarty->caching=true; //开启缓存
(2)$smarty->cache_dir=“./cache”;//设置缓存目录
(3)$smarty->cache_lifetime=7*24*60*60;//设置缓存时间
(4)$smarty->display(“index.html”);
2.每个页面多个缓存
比如:发布文章的时候,使用同一模版时会生成不同的页面显示。如果开启缓存,则通过同一个模版生成的多篇文章(多个实例)都需要被缓存,smarty实现这个比较容易,只需要在调用display()方法时,通过在第二个可选参数中提供一个值,这个值是为每一篇文章(或实例)指定的一个唯一的标识符,有几个不同的标识符就有几个不同的缓存。
比如:$smarty->display(“news.html”,$_GET[‘newid’]);
3.怎样判断某个文件被缓存了?
(1) $smarty->is_cached(“index.html”);
(2) $smarty->is_cached(“news.html”,$_GET[‘newsid’]);
4.缓存的清除
(1) $smarty->clear_all_cache(); //清除所有缓存
(2) $smarty->clear_cache(‘index.tpl’); // 清除某一模版的缓存
(3) $smarty->clear_cache(‘index.tpl’,cache_id); // 清除指定缓存号的缓存
5.局部缓存
1. insert函数默认是不缓存的,并且这个属性不能修改
2. 模版文件中:<div>{insert name=“get_time”}</div>
3. php文件中:
function insert_get_time(){
return date(“Y-m-d H:i:s”);
}
4. 注意:方法的前缀必须是insert
=================================================================================================
Smarty模板的使用
=================================================================================================
一、安装与测试:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 将Smarty-2.6.25.zip包中的libs文件拷出来。在创建一些目录:
根目录
|--libs
| |--Smarty.class.php
|--templates
| |--a.tpl
|--templates_c
|--cache
|--configs
|--init.inc.php
|--a.php
|
|--admin
|--aa.php
2.在init.inc.php文件中:
<?php
//Smarty的核心配置(安装配置):
require_once("./libs/Smarty.class.php");
$tpl = new Smarty();
$tpl->template_dir = "./templates"; //指定模板路径
$tpl->compile_dir = "./templates_c";//指定编译后路径
$tpl->config_dir = "./configs"; //指定配置文件路径
$tpl->caching = 0; //是否释放采用静态缓存,建议开发时为0(不采用),运行时为1.
$tpl->cache_lifetime = 60*60*24*7; //保存静态缓存时间。(一周)
$tpl->left_delimiter = "<{"; //指定模板开始定界符
$tpl->right_delimiter= "}>"; //指定模板结束定界符
?>
3. 在a.php中写入
<?php
require_once("init.inc.php");
//做内容替换
$tpl->assign("title","第一个Smarty模板测试");
$tpl->assign("content","欢迎使用Smarty模板!");
//导入
$tpl->display("a.tpl");
?>
4. 在a.tpl文件中
<html>
<head>
<title><{$title}></title>
</head>
<body>
<h2><{$title}></h2>
<{$content}>
<body>
</html>
5.测试:使用浏览器访问a.php文件。
注意事项:
1. 图片导入路径的使用,要以访问的php文件为相对路径。
2. Smarty模板(tpl文件)文件存在模板路径的子目录下。如:tmplates/aa/b.tpl
那么就是在a.php中,使用$tpl->display("aa/b.tpl");
3. 当tpl模板页被分割成几个小tpl页时,可以使用include导入:
如 <{include file="aa/head.tpl"}>
4. 当使用Smarty模板的php页面分目录存储时:
使用绝对路径:
在init.inc.php文件中:
$path="D:/Program Files/AppServ/www/lamp10/php_smarty";
require_once($path."/libs/Smarty.class.php");
$tpl = new Smarty();
$tpl->template_dir = $path."/templates"; //指定模板路径
$tpl->compile_dir = $path."/templates_c";//指定编译后路径
$tpl->config_dir = $path."/configs"; //指定配置文件路径
$tpl->caching = 0; //是否释放采用静态缓存,建议开发时为0(不采用),运行时为1.
$tpl->cache_lifetime = 60*60*24*7; //保存静态缓存时间。(一周)
$tpl->left_delimiter = "<{"; //指定模板开始定界符
$tpl->right_delimiter= "}>"; //指定模板结束定界符
二、模板设计者篇
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、基本语法
a、模板注释被*号包围,例如 {* this is a comment *} ,而且客户不可见
2、变量:
a、从PHP分配的变量 :
Table of Contents[内容列表] Hello {$firstname}
Associative arrays[关联数组] {$Contacts.phone.home}<br>
Array indexes[数组下标] {$Contacts[2][0]}<br>
Objects[对象] email: {$person->email}<br>
b、从配置文件引用的变量:
# 在配置文件定义变量:
如:在configs目录下创建一个配置文件foo.conf.
在文件中写入:
;以下是全局配置信息
mytitle=我的Smarty模板练习
bodycolor=#cccccc
;以下局部配置信息(区块)
[one]
aa=11111111
bb=22222222
[two]
cc=33333333
dd=44444444
# 在tpl模板页(如1.tpl)中使用<{config_load file="foo.conf" section="two"}>
即可使用标签输出 <{#mytitle#}> 输出:"我的Smarty模板练习". <{#cc#}>
# {$smarty}保留变量可以被用于访问一些特殊的模板变量.
例如:<{$smarty.get.id}> <==> $_GET["id"]; (PHP中)
<{$smarty.session.loginuser}> <==> $_SESSION["loginuser"];
还有:env、cookie request
<{$smarty.now}> 时间戳
当前系统时间:<{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}>
在php中定义:define("WTO","国际世贸组织");
可在tpl中: 输出常量:<{$smarty.const.WTO}>
输出配置文件信息:<{$smarty.config.mytitle}>相当于:<{#mytitle#}>
三、 变量调节器:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.系统提供的调节器:
capitalize [首字符大写]
cat [连接字符串]
count_characters [字符计数]
count_paragraphs [计算段数]
count_sentences [计算句数]
count_words [计算词数]
*date_format [格式化日期]
default [默认值]
escape [转义]
indent [缩进]
lower [小写]
*nl2br [换行符替换成 <br />]
regex_replace [正则替换]
*replace [替换]
spacify [插空]
string_format [字符串格式化]
strip [去除(多余空格)]
strip_tags [去除html标签]
*truncate [截取]
*upper [大写]
wordwrap [行宽约束]
2.自定义调节器(采用插件文件方式):
2.1 在smarty模板的libs/plugins/目录下创建调节器:
调节器文件名:modifier.调节器名.php
注意:若是自定义的的调节器不在libs/plugins/目录下,需要使用下面Smarty的方法追加。
如: smarty->addPluginsDir("./libs/myplugins");//追加一个插件目录的方式
注意清除编译缓存目录
2.2 在这个文件里的函数名:
function smarty_modifier_调节器函数名(参数列表...){ //..... }
例如:
/**
* 自定义调节器:字符串截取函数
* 参数:
* $str:表示被截取的字符串
* $len:保留字串的长度值。默认值:10
*/
function smarty_modifier_mystr($str,$len=10){
if(strlen($str)>$len){
return substr($str,0,$len)."...";
}else{
return $str;
}
}
注意:在使用是,要按函数的参数顺序来。
2.3 使用{$str|调节器名}
练习:自定义一个调节器:myfont($str,$size,$color)
如:{$str|myfont:7:"red"} =>输出: <font size="7" color="red">$str</font>
3. 自定义调节器(采用注册调节器方式):
除了上面的方法外还有一个方式可以定义一个变量的调节器
使用Smarty的一个方法:registerPlugin("modifier","调节器名", "被指定的函数名");
例如:$smarty->registerPlugin("modifier","mystrlen","strlen");//注册一个调节器的函数。
使用:{$str|mystrlen} //输出str字串的长度
4. 组合调节器:
{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}
四、Smarty的函数
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
格式:{函数名 属性1="值1" 属性2="值2" }
{/函数名}
1. Smarty内置的函数
*{$var=} 简写模板中定义变量(同assign),{$name='Bob'}{$user.name="Bob"}{$users[]="Bob"}
{append} 在模板执行期间建立或追加模板变量数组。
*{assign} 在模板中定义并变量,并赋值
{block} 用来定义一个命名的模板继承源区域。
{call} 用来调用{function}标签定义的模板函数
{capture} 用来捕获模板输出的数据并将其存储到一个变量里,而不是将它们输出到页面。
*{config_load} 载入配置文件:用来从配置文件中加载config变量(#variables#)到模版。
{debug} 跳转到调试控制页面。
{extends} 标签用在模板继承中子模版对父模板的继承。
*{for} 简单的循环
*{foreach},{foreachelse}
格式:{foreach $list as [$k=>]$v}
//输出$k / $v
{/foreach}
{function} 用来在模板中创建函数,可以像调用插件函数一样调用它们。
*{if},{elseif},{else}
*{include} 包含其他模板
{include_php} 在Smarty新版本中已被废弃,还是用你自己编写的php脚本或插件函数来代替它吧!
{insert} 标签类似于{include}标签,不同之处是即使打开caching,{insert}所包含的内容也不会被缓存,每次调用模板都会执行{insert}。
该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域。
{ldelim},{rdelim} 用来转义模版定界符,默认值为“{”和“}”。
*{literal} 标签区域内的数据将按字面意思处理,代表性地是用在javascript/css语块周围
{nocache} 用来禁止模版块缓存,每个{nocache}应与{/nocache}成对出现。
{php} 已被Smarty弃用,不应再使用。还是用你自己编写的php脚本或插件函数来代替它吧!
*{section},{sectionelse}
{while}
2. Smarty扩展函数(Smarty自定义的)
{counter}
{cycle}
{eval}
{fetch}
{html_checkboxes}
{html_image}
{html_options}
{html_radios}
{html_select_date}
{html_select_time}
{html_table}
{mailto}
{math}
{textformat}
3. 自定义函数
3.1 使用定义函数插件
3.2 使用注册函数方式
//注册
格式:$smarty->registerPlugin("function","注册别名","函数名");
如:
$smarty->registerPlugin("function","fundemo","demo");
function demo(){
return "<h3>注册式自定义函数测试</h3>";
}
$smarty->registerPlugin("function","mytime","time");
使用:
<{fundemo}>
<{mytime}>
4. 如何在模板中使用自定义的函数:
第一种:使用register_function注册函数的方式:特点针对于某些模板的使用
在PHP文件中:
//自定义函数
function myfun($a){
if(empty($a[color])){
$a[color]="#FFFFFF";
}
if(empty($a[size])){
$a[size]=4;
}
echo "<font color='{$a[color]}' size='{$a[size]}'>#####################</font><br/>";
}
//注册函数
$tpl->register_function("fun","myfun");
在模板中:使用
<{fun color="red" size=7 }>
<{fun color="blue" size=5 }>
<{fun color="green" size=3 }>
<{fun}>
第二种方式:采用Samrty插件式的定义函数。特点不用注册,而且所有模板页都可以使用。
在Samrty模板的libs/plugins/目录下定义:
注意:1.文件名必须是: function.自定义函数名.php
如:function.mytable.php
2.在文件里:函数名必须是: funciton smarty_function_自定义函数名(参数名,&$smarty){...}
如:
<?php
/**
* 自定义绘制表格函数mytable,
* 参数$p数组中
* rows:表的行数. 默认2行
* cols:表的列数。默认2列
* content:表格填充内容:默认:"*"
*/
function smarty_function_mytable($p,&$smarty){
if(empty($p[rows])){
$p[rows]=2;
}
if(empty($p[cols])){
$p[cols]=2;
}
if(empty($p[content])){
$p[content]="*";
}
//开始绘制表格
$table ="<table width=60% border=1>";
for($i=0;$i<$p[rows];$i++){ //循环行
$table.="<tr>";
for($j=0;$j<$p[cols];$j++){ //循环列
$table.="<td>{$p[content]}</td>";
}
$table.="</tr>";
}
$table.="</table>";
return $table;
}
?>
3. 使用:<{mytable rows="10" cols="10" content="###"}><br/>
<{mytable}>
5. 自定义块状函数:
<?php
//定义块状函数:
function do_translation ($params, $content, $smarty, &$repeat, $template){
if (isset($content)){
$lang = $params["lang"]; // do some translation with $content
return $translation;
}
}
//注册到Smarty模板中
$smarty->registerPlugin("block","translate", "do_translation");
?>
使用
Where the template is:{translate lang="br"}Hello, world!{/translate}
五、Smarty的缓存技术
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 缓存的基本操作(整个缓存)
$smarty->caching=true; //开启缓存
$smarty->cache_lifetime =5;//缓存时间5秒
2. 局部不缓存
使用{nocache}函数
<h3>缓存时间:<{$smarty.now}><h3>
<{nocache}>
<h3>不缓存时间:<{$smarty.now}><h3>
<{/nocache}>
<h3>缓存时间:<{$smarty.now}><h3>
3. 优化缓存(不操作底层来使用缓存)
//获取数据库信息并缓存5秒。(当6.html不是很有效缓存文件时才执行数据查询)
if(!$smarty->isCached("6.html")){
$m = new Model("stu");
$stulist = $m->findAll(); //获取所有学生信息
$smarty->assign("stulist",$stulist);
$smarty->assign("time",time());
}
$smarty->display("6.html");
4. 同一个模板,产生不同缓存(解决内容详情页的缓存(因为模板只有一个))
//获取数据库信息并缓存5秒。(当6.html不是很有效缓存文件时才执行数据查询)
if(!$smarty->isCached("6.html",$_SERVER["REQUEST_URI"])){
$m = new Model("stu");
$stulist = $m->findAll(); //获取所有学生信息
$smarty->assign("stulist",$stulist);
$smarty->assign("time",time());
}
$smarty->display("6.html",$_SERVER["REQUEST_URI"]);
Smarty模板学习要掌握的内容:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 作用,用途、原理(执行过程)
2. Smarty的搭建
3. Smarty的基本语法
4. 调节器的使用和自定义
5. 函数的使用和自定义
6. 块(成对的定界符)的使用和自定义
{foreach}
{/foreach}
7. 缓存技术
8. (新)模板继承
=================================================================================================
一、什么是smarty模版引擎?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是smarty?
Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,使php程序员只专注于php代码的编写,网页美工只专注于网页的美化。
没有模版引擎时出现的问题?
(1).html中php代码比重越来越大;
(2).页面的数量越来越多;
(3).程序设计与美工设计分工不明确。
传统的php文件:
1. php代码跟html混编,不利于程序员和美工的分工
2. 数据的传递,同一页面传递,php数据在页面中的显示需要使用php标记
比如:<?php echo $username?> index.php
采用模版引擎后:
1.php代码与html代码分离开,php代码放在一个单独的php文件中,html代码放在一个单独的html文件中
2.数据传递,首现php中的数据先给了模版引擎,然后模版引擎再把接收到的数据给模版文件显示。
3.模版文件中不再有php代码或者说php标记的出现,模版中显示的数据都是通过模版引擎的标记显示出来的
index.php smarty模版引擎 index.html
目前php的模版引擎很多,为什么要使用smarty模版引擎?
1.一般的模版引擎,如,phplib都是在建立模版对象时取得要解析的模版,然后把变量套入后,再通过parse()这个方法来解析模版,最后再将网页输出,总结成一句话,那句是每次执行的时候都要重新解析一遍
2.对于smarty模版引擎来说,不必在程序里再做parse()这样的操作了,smarty会自动帮我们做,而且已经编译过的网页,如果在没有改动的情况下,smarty会跳过重新编译的动作而直接去执行编译过的网页,以节省编译时间。
Smarty的其它优点:
1.速度快:相对于其它的模版引擎而言
2.编译型:采用smarty编写的程序在运行时会编译成一个非模版技术的php文件。这个文件采用了php与html混合的方式,在下一次访问模版时将web请求直接转换到这个文件中,而无需重新编译(在模版文件没有改动的情况下)
3.缓存技术:它可以将用户最终看到的html网页缓存成一个静态的html网页。当用户开启缓存时,可以设置缓存时间,在缓存文件没到期之前,将用户的请求直接转换到这个静态的缓存文件,相当于调用了一个静态的html文件。
4.模版中可以使用流程控制语句。
不适合使用smarty的地方
1.需要实时更新的内容,例如:股票显示,它需要经常对数据进行更新
2.小项目。
Smarty模版引擎运作流程。
①在php程序运行时,初始化smarty模版引擎
②smarty模版引擎读取模版文件(.html或tpl文件)
③在读取模版文件的时候,smarty模版引擎会自动判断该模版文件是否需要重新编译。
④如果不需要重新编译,则直接进行模版变量替换。
⑤如果是第一次执行此程序文件或者说模版被改动了,那么就需要重新编译后再进行模版变量替换。
⑥最终执行的是编译后的php文件。
⑦输出结果到浏览器。
=================================================================================================
二、一个简单的使用smarty模版引擎技术的小例子
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
到官方网站去下载smarty模版引擎压缩包
官网:http://www.smarty.net
解压此压缩包,发现其下有一个libs文件夹,将libs文件夹重命名为smarty,
并移动到网站根目录下的libs文件夹
打开smarty引擎libs文件夹,里面有如下文件:
sysplugins:系统插件目录
plugins:外部插件
debug.tpl:输出debug调试信息输出的模板
Smarty.class.php: smarty模版引擎核心类文件,要使用smarty模版引擎,首先要引入该文件
SmartyBC.class.php:
搭建Smarty模板示例:在使用smarty之前,首现需要对核心类文件(Smarty.class.php)进行配置。
1. 将libs库目录复制过来。
2. 创建一个模板目录templates模板文件存放目录
创建一个configs配置文件目录
3. 编写index.php文件(入口文件)做Smarty导入和创建
//1.导入Smarty类
require("libs/Smarty.class.php");
//2.创建对象
$smarty = new Smarty();
//3.初始化信息
$smarty->left_delimiter="<{"; //重新定义Smarty模板的左定界符
$smarty->right_delimiter="}>"; //重新定义Smarty模板的右定界符
//静态缓存
$smarty->caching=true; //是否开启静态缓存 true(开启)
$smarty->cache_lifetime=5; //设置缓存时间 (5表示缓存5秒钟)
//4.放置变量:
$smarty->assign("name","zhangsan");//向Smarty模板中放置变量name值为张三
$smarty->assign("date",date("Y-m-d H:i:s"));//为模板放一个时间
//5.加载模板:
$smarty->display("index.tpl");
4.使用浏览器访问index.php,将会创建目录templates_c和cache目录
5. 最后的结构:
根目录
|--libs //Smarty库
| |--Smarty.class.php
|--templates //模板目录
| |--index.tpl
|--templates_c //模板编译目录
|--cache //模板静态缓存目录(注意需开启缓存)
|--configs //配置文件目录
|--index.php //php文件(入口)
相对路径:在程序文件中引入外部文件或设置目录时都是以本文件为基础的
比如:要在index.php文件中引入Smarty.class.php文件,因为Smarty.class.php文件位于libs/smarty文件夹下,而index.php文件又跟libs文件夹同级,所以应该这样引入:
include_once “libs/smarty/Smarty.class.php”;
简单的分析一下Smarty.class.php核心类文件
它是一个类文件:类是由属性(变量)和方法构成
类的名称:Smarty
主要属性或变量:
$template_dir: 模版目录,主要用来存放模版文件,如:.html文件、.tpl文件
$compile_dir: 编译目录,主要用来存放编译后的php文件,即混编方式的文件
$config_dir: 配置目录,主要用来存放公共的配置文件
$cache_dir: 缓存目录,主要用来存放缓存文件
$left_delimiter: 左边界符
$right_delimiter: 右边界符
$caching 是否开启缓存
$cache_lifetime 定制缓存时间
主要方法:
assign():主要用来将php中的标量类型的数据赋值给模版变量。
display():主要用来显示指定的模版文件
=================================================================================================
三、使用smarty模版引擎的步骤:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一步:引入smarty核心类文件并创建一个smarty实例对象:
include_once “libs/smarty/Smarty.class.php”;
$smarty=new Smarty();
第二步:对核心类中属性或变量的配置
$smarty->template_dir=”./templates”;
$smarty->compile_dir=”./templates_c”;
$smarty->config_dir=”./configs”;
$smarty->caching=false;
$smarty->cache_dir=”./cache”;
$smarty->left_delimiter=”{”;
$smarty->right_delimiter=”}”;
第三步:给模版变量赋值
$smarty->assign(“模版变量”,”值(变量|数组)”);
比如:$smarty->assign(“username”,”张三”);
第四步:显示对应的模版文件
$smarty->display(“模版文件名”);
比如:$smarty->display(“index.html”);
第五步:在模版文件中使用smarty的左右边界符将模版变量显示出来
<html>
<head></head>
<body>
用户名:{$username}
</body>
</html>
=================================================================================================
四、Smarty应用之模版变量:分三种来源
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
从php中分配的变量
1. 格式:$smarty->assign(“模版变量”,”值(变量|数组)”);
2. 例如:$username=”小三”;
//将php变量分配给模版变量
$smarty->assign(“username”,$username);
3. 在模版文件中通过左右边界符来显示模版变量
例如:{$username}
{$smarty}保留变量
1.使用保留变量可访问页面请求变量:get、post、server、request、session等
例如:页面请求变量:
{$smarty.get.username} //相当于在php文件中访问$_GET[‘username’]
{$smarty.post.username} //相当于在php文件中访问$_POST[‘username’]
{$smarty.session.username}//相当于在php文件中访问$_SESSION[‘username’]
{$smarty.cookie.username}//相当于在php文件中访问$_COOKIE[‘username’]
{$smarty.request.username}//相当于在php文件中访问$_REQUEST[‘username’]
{$smarty.server.REMOTE_ADDR} //相当于在php文件中访$_SERVER[‘REMOTE_ADDR’]
2.使用保留变量可访问常量:const
{$smarty.const.__FILE__}
3.使用保留变量可读取配置文件的变量:config
{$smarty.config.username}
读取配置文件中的变量
1. 配置文件应放在$smarty->config_dir=”./configs”指定的目录下面
2. 配置文件的后缀名为 .conf
3. 配置文件:myself.conf
#全局配置变量
title=“调用配置文件”
bgcolor=“red”
border=5
type=“计算机”
name=“php从入门到精通”
#局部变量
[login]
username=“用户名”
password=“密 码”
4. 一个配置变量占一行,并且后面没有以分号结尾
5. 模版中引用配置文件中的变量
首先要加载配置文件:
//加载配置文件,但是只能将全局变量加载进来
{config_load file=“my.conf”}
//如果要加载局部变量,需要使用section属性指定特定的节
{config_load file=“my.conf” section=“login”}
模版文件中引用配置文件中变量的方法:
//第一种:需要使用两个#
比如:{#title#}
//使用{$smarty}保留变量
比如:{$smarty.config.bgcolor}
=================================================================================================
五、Smarty变量操作符或变量调节器
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是smarty的变量操作符?
1.smarty模版引擎中有内置的一些函数,这些函数主要用来修饰或调节变量,
我们称之为变量操作符或变量调节器,变量操作符主要用于操作变量,
它可以帮助我们完成许多比较实用的功能,
比如:首字母大写、拆分、替换、截取等等,
这些功能通过smarty模版引擎可以很容易的在模版文件中实现,
而不必再在php文件中通过php的内置函数去处理,这样的话就减少了php的代码量
如何使用smarty的变量操作符?
1.语法中使用 “|” 来应用变量操作符,多个参数用 ”:” 分隔开来
比如: 在模版文件中使用变量操作符截取前十个字符
{$name|truncate:10}
2.常见的smarty变量操作符
capitalize [首字母大写]
count_characters [计算字符数]
cat [连接字符串]
count_paragraphs [计算段落数]
count_sentences [计算句数]
count_words [计算词数]
date_format [时间格式]
default [默认]
escape [转码]
indent[缩进]
lower[小写 ]
nl2br[换行符替换成<br />]
regex_replace[正则替换]
replace[替换]
spacify[插空]
string_format[字符串格式化]
strip[去除(多余空格)]
strip_tags[去除html标签]
truncate[截取]
upper[大写]
wordwrap[行宽约束]
3.使用smarty变量操作符的例子
例如:
日期:{$smarty.new|date_format:”%Y-%m-%d”}
变量中的字符数(包括空格):{$str|count_characters:true}
多个变量操作符修饰一个变量:{$str|nl2br|upper|cat:”张三”}
模版变量+“张三”:{$str1|cat:”张三”}
缩进四个空白字符,并使用*来代替:{$str2|indent:4:”*”}
把变量中的”hello”替换为“world”:{$str3|replace:”hello”,”world”}
=================================================================================================
六、Smarty模版引擎的内置函数(或标记)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
foreach标记
1.foreach标记处理数组
在模版中必须使用成对的foreach标签遍历数组中的数据,
而且必须设置from和item两个属性
格式:{foreach from=$users item=user key=key}
2.foreach标记的属性
(1)from:待循环数组的名称
(2)item:当前元素的变量名称
(3)key:当前元素的键名
(4)name:该循环的名称
3.foreachelse子标记
(1)当from属性指定的数组为空时,则输出foreachelse区域中的内容
(2)foreachelse必须与foreach一起使用
(3)foreachelse没有结束标记
4.使用案例:
//循环一维数组:aaa为数组中当前元素的变量名称
{foreach from=$user item=aaa}
{$aaa}
{/foreach}
//循环二维数组:如果users代表多个用户,那么user就代表当前用户
{foreach from=$users item=user}
姓名:{$user.username}
性别:{$user.sex}
{/foreach}
//foreachelse子标记的用法:
{foreach from=$users item=user}
姓名:{$user.username}
性别:{$user.sex}
{foreachelse}
暂时没有数据
{/foreach}
include标记
1.在模版文件中包含子模版
格式:{include file=“模版文件路径”}
2.例如
(1)包含公共头部文件: {include file=“header.html”}
(2)包含公共尾部文件: {include file=“footer.html”}
3.两个比较使用的特性:
(1)可在include标记中传入可选的assign属性,将导入的子模版内容不再当
前模版中输出,而是赋值给assign属性指定的变量。
例如:{include file=“header.html” assign=“header”}
(2)可以在引入子模版的同时向其传递各种属性
例如:{include file=“header.html” title=“头部文件”}
if标记
1.常跟条件修饰符一块使用
2.常见的条件修饰符
(1) eq:相等 neq:不等
(2) mod:求模 gt:大于
(3) is even:是否是偶数 not:非
(4) ge:大于等于 lt:小于
(5) lte:小于等于
(6) ==:相等 !=:不相等
(7) >:大于 <:小于
(8)<=:小于等于 >=:大于等于
3.使用
(1)模版文件中使用smarty模版引擎的if条件语句
{if $name eq ‘admin’}
<font color=“red”>管理员登录</font>
{else}
<font color=“red”>你没有登录权限</font>
{/if}
(2)模版文件中使用smarty模版引擎的if条件语句
{if $quanxian eq ‘admin’}
<font color=“red”>管理员登录</font>
{elseif $name eq ‘xiaosan’}
<font color=“red”>普通会员登录</font>
{else}
<font color=“red”>你没有登录权限</font>
{/if}
literal标记
1.literal文本的处理技巧
literal中的数据将被当作文本处理,此时模版将忽略其内部的所有字符信息
该特性用于显示有可能包含大括号等字符信息的javascript脚本
2.例如:literal标记中的所以字符信息将被当作文本来处理
{literal}<script>…</script>{/literal}
section标记
1.section标记处理数组
在模版中必须使用成对的section标签遍历数组中的数据,而且必须设置name和loop两个属性
格式:{section name=i step=2 start=2 max=10 loop=$users}
2.section标记的属性:
(1)name:指定该循环的名称,当需要在section循环内输出变量时,必须在变量后加上中括号,中括号中必须包含name变量
(2)loop:循环变量的名称
(3)start:循环执行的初始索引位置
(4)step:该值决定循环的步长,例如:step=2将之遍历下标为0、2
、4等元素
(5)max:设定最大循环次数,比如:max=2,代表最多循环2次
(6)show:决定是否显示该循环,默认值为1-显示循环 0-禁止循环
3.section循环区域中可以调用的变量
在section循环中有一些可供调用的变量名,用来访问该循环中一些特殊的值,而且在循环中必须通过smarty保留变量$smarty进行访问
格式:{$smarty.foreach.foreachname.varname}
(1)first:当前section循环在第一次执行时该变量的值为true
(2)last:当前section循环在最后一次执行时该变量的值为true
(3)rownum:循环的行数,与iteration变量差不多
(4)index:显示当前循环的索引
(5)iteration:显示循环的次数
4.sectionelse字标记
(1)当loop属性指定的数组为空时,则输出sectionelse区域中的内容
(2)sectionelse必须与section一起使用
(3)sectionelse没有结束标记
格式:
{section name=i loop=$users}
{$users[i].username}
{sectionelse}
<div><font color=“red”>暂时没有数据</font></div>
{/section}
=================================================================================================
七、Smarty缓存的应用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.设置缓存
(1)$smarty->caching=true; //开启缓存
(2)$smarty->cache_dir=“./cache”;//设置缓存目录
(3)$smarty->cache_lifetime=7*24*60*60;//设置缓存时间
(4)$smarty->display(“index.html”);
2.每个页面多个缓存
比如:发布文章的时候,使用同一模版时会生成不同的页面显示。如果开启缓存,则通过同一个模版生成的多篇文章(多个实例)都需要被缓存,smarty实现这个比较容易,只需要在调用display()方法时,通过在第二个可选参数中提供一个值,这个值是为每一篇文章(或实例)指定的一个唯一的标识符,有几个不同的标识符就有几个不同的缓存。
比如:$smarty->display(“news.html”,$_GET[‘newid’]);
3.怎样判断某个文件被缓存了?
(1) $smarty->is_cached(“index.html”);
(2) $smarty->is_cached(“news.html”,$_GET[‘newsid’]);
4.缓存的清除
(1) $smarty->clear_all_cache(); //清除所有缓存
(2) $smarty->clear_cache(‘index.tpl’); // 清除某一模版的缓存
(3) $smarty->clear_cache(‘index.tpl’,cache_id); // 清除指定缓存号的缓存
5.局部缓存
1. insert函数默认是不缓存的,并且这个属性不能修改
2. 模版文件中:<div>{insert name=“get_time”}</div>
3. php文件中:
function insert_get_time(){
return date(“Y-m-d H:i:s”);
}
4. 注意:方法的前缀必须是insert
=================================================================================================
Smarty模板的使用
=================================================================================================
一、安装与测试:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 将Smarty-2.6.25.zip包中的libs文件拷出来。在创建一些目录:
根目录
|--libs
| |--Smarty.class.php
|--templates
| |--a.tpl
|--templates_c
|--cache
|--configs
|--init.inc.php
|--a.php
|
|--admin
|--aa.php
2.在init.inc.php文件中:
<?php
//Smarty的核心配置(安装配置):
require_once("./libs/Smarty.class.php");
$tpl = new Smarty();
$tpl->template_dir = "./templates"; //指定模板路径
$tpl->compile_dir = "./templates_c";//指定编译后路径
$tpl->config_dir = "./configs"; //指定配置文件路径
$tpl->caching = 0; //是否释放采用静态缓存,建议开发时为0(不采用),运行时为1.
$tpl->cache_lifetime = 60*60*24*7; //保存静态缓存时间。(一周)
$tpl->left_delimiter = "<{"; //指定模板开始定界符
$tpl->right_delimiter= "}>"; //指定模板结束定界符
?>
3. 在a.php中写入
<?php
require_once("init.inc.php");
//做内容替换
$tpl->assign("title","第一个Smarty模板测试");
$tpl->assign("content","欢迎使用Smarty模板!");
//导入
$tpl->display("a.tpl");
?>
4. 在a.tpl文件中
<html>
<head>
<title><{$title}></title>
</head>
<body>
<h2><{$title}></h2>
<{$content}>
<body>
</html>
5.测试:使用浏览器访问a.php文件。
注意事项:
1. 图片导入路径的使用,要以访问的php文件为相对路径。
2. Smarty模板(tpl文件)文件存在模板路径的子目录下。如:tmplates/aa/b.tpl
那么就是在a.php中,使用$tpl->display("aa/b.tpl");
3. 当tpl模板页被分割成几个小tpl页时,可以使用include导入:
如 <{include file="aa/head.tpl"}>
4. 当使用Smarty模板的php页面分目录存储时:
使用绝对路径:
在init.inc.php文件中:
$path="D:/Program Files/AppServ/www/lamp10/php_smarty";
require_once($path."/libs/Smarty.class.php");
$tpl = new Smarty();
$tpl->template_dir = $path."/templates"; //指定模板路径
$tpl->compile_dir = $path."/templates_c";//指定编译后路径
$tpl->config_dir = $path."/configs"; //指定配置文件路径
$tpl->caching = 0; //是否释放采用静态缓存,建议开发时为0(不采用),运行时为1.
$tpl->cache_lifetime = 60*60*24*7; //保存静态缓存时间。(一周)
$tpl->left_delimiter = "<{"; //指定模板开始定界符
$tpl->right_delimiter= "}>"; //指定模板结束定界符
二、模板设计者篇
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、基本语法
a、模板注释被*号包围,例如 {* this is a comment *} ,而且客户不可见
2、变量:
a、从PHP分配的变量 :
Table of Contents[内容列表] Hello {$firstname}
Associative arrays[关联数组] {$Contacts.phone.home}<br>
Array indexes[数组下标] {$Contacts[2][0]}<br>
Objects[对象] email: {$person->email}<br>
b、从配置文件引用的变量:
# 在配置文件定义变量:
如:在configs目录下创建一个配置文件foo.conf.
在文件中写入:
;以下是全局配置信息
mytitle=我的Smarty模板练习
bodycolor=#cccccc
;以下局部配置信息(区块)
[one]
aa=11111111
bb=22222222
[two]
cc=33333333
dd=44444444
# 在tpl模板页(如1.tpl)中使用<{config_load file="foo.conf" section="two"}>
即可使用标签输出 <{#mytitle#}> 输出:"我的Smarty模板练习". <{#cc#}>
# {$smarty}保留变量可以被用于访问一些特殊的模板变量.
例如:<{$smarty.get.id}> <==> $_GET["id"]; (PHP中)
<{$smarty.session.loginuser}> <==> $_SESSION["loginuser"];
还有:env、cookie request
<{$smarty.now}> 时间戳
当前系统时间:<{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}>
在php中定义:define("WTO","国际世贸组织");
可在tpl中: 输出常量:<{$smarty.const.WTO}>
输出配置文件信息:<{$smarty.config.mytitle}>相当于:<{#mytitle#}>
三、 变量调节器:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.系统提供的调节器:
capitalize [首字符大写]
cat [连接字符串]
count_characters [字符计数]
count_paragraphs [计算段数]
count_sentences [计算句数]
count_words [计算词数]
*date_format [格式化日期]
default [默认值]
escape [转义]
indent [缩进]
lower [小写]
*nl2br [换行符替换成 <br />]
regex_replace [正则替换]
*replace [替换]
spacify [插空]
string_format [字符串格式化]
strip [去除(多余空格)]
strip_tags [去除html标签]
*truncate [截取]
*upper [大写]
wordwrap [行宽约束]
2.自定义调节器(采用插件文件方式):
2.1 在smarty模板的libs/plugins/目录下创建调节器:
调节器文件名:modifier.调节器名.php
注意:若是自定义的的调节器不在libs/plugins/目录下,需要使用下面Smarty的方法追加。
如: smarty->addPluginsDir("./libs/myplugins");//追加一个插件目录的方式
注意清除编译缓存目录
2.2 在这个文件里的函数名:
function smarty_modifier_调节器函数名(参数列表...){ //..... }
例如:
/**
* 自定义调节器:字符串截取函数
* 参数:
* $str:表示被截取的字符串
* $len:保留字串的长度值。默认值:10
*/
function smarty_modifier_mystr($str,$len=10){
if(strlen($str)>$len){
return substr($str,0,$len)."...";
}else{
return $str;
}
}
注意:在使用是,要按函数的参数顺序来。
2.3 使用{$str|调节器名}
练习:自定义一个调节器:myfont($str,$size,$color)
如:{$str|myfont:7:"red"} =>输出: <font size="7" color="red">$str</font>
3. 自定义调节器(采用注册调节器方式):
除了上面的方法外还有一个方式可以定义一个变量的调节器
使用Smarty的一个方法:registerPlugin("modifier","调节器名", "被指定的函数名");
例如:$smarty->registerPlugin("modifier","mystrlen","strlen");//注册一个调节器的函数。
使用:{$str|mystrlen} //输出str字串的长度
4. 组合调节器:
{$articleTitle}
{$articleTitle|upper|spacify}
{$articleTitle|lower|spacify|truncate}
{$articleTitle|lower|truncate:30|spacify}
{$articleTitle|lower|spacify|truncate:30:". . ."}
四、Smarty的函数
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
格式:{函数名 属性1="值1" 属性2="值2" }
{/函数名}
1. Smarty内置的函数
*{$var=} 简写模板中定义变量(同assign),{$name='Bob'}{$user.name="Bob"}{$users[]="Bob"}
{append} 在模板执行期间建立或追加模板变量数组。
*{assign} 在模板中定义并变量,并赋值
{block} 用来定义一个命名的模板继承源区域。
{call} 用来调用{function}标签定义的模板函数
{capture} 用来捕获模板输出的数据并将其存储到一个变量里,而不是将它们输出到页面。
*{config_load} 载入配置文件:用来从配置文件中加载config变量(#variables#)到模版。
{debug} 跳转到调试控制页面。
{extends} 标签用在模板继承中子模版对父模板的继承。
*{for} 简单的循环
*{foreach},{foreachelse}
格式:{foreach $list as [$k=>]$v}
//输出$k / $v
{/foreach}
{function} 用来在模板中创建函数,可以像调用插件函数一样调用它们。
*{if},{elseif},{else}
*{include} 包含其他模板
{include_php} 在Smarty新版本中已被废弃,还是用你自己编写的php脚本或插件函数来代替它吧!
{insert} 标签类似于{include}标签,不同之处是即使打开caching,{insert}所包含的内容也不会被缓存,每次调用模板都会执行{insert}。
该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域。
{ldelim},{rdelim} 用来转义模版定界符,默认值为“{”和“}”。
*{literal} 标签区域内的数据将按字面意思处理,代表性地是用在javascript/css语块周围
{nocache} 用来禁止模版块缓存,每个{nocache}应与{/nocache}成对出现。
{php} 已被Smarty弃用,不应再使用。还是用你自己编写的php脚本或插件函数来代替它吧!
*{section},{sectionelse}
{while}
2. Smarty扩展函数(Smarty自定义的)
{counter}
{cycle}
{eval}
{fetch}
{html_checkboxes}
{html_image}
{html_options}
{html_radios}
{html_select_date}
{html_select_time}
{html_table}
{mailto}
{math}
{textformat}
3. 自定义函数
3.1 使用定义函数插件
3.2 使用注册函数方式
//注册
格式:$smarty->registerPlugin("function","注册别名","函数名");
如:
$smarty->registerPlugin("function","fundemo","demo");
function demo(){
return "<h3>注册式自定义函数测试</h3>";
}
$smarty->registerPlugin("function","mytime","time");
使用:
<{fundemo}>
<{mytime}>
4. 如何在模板中使用自定义的函数:
第一种:使用register_function注册函数的方式:特点针对于某些模板的使用
在PHP文件中:
//自定义函数
function myfun($a){
if(empty($a[color])){
$a[color]="#FFFFFF";
}
if(empty($a[size])){
$a[size]=4;
}
echo "<font color='{$a[color]}' size='{$a[size]}'>#####################</font><br/>";
}
//注册函数
$tpl->register_function("fun","myfun");
在模板中:使用
<{fun color="red" size=7 }>
<{fun color="blue" size=5 }>
<{fun color="green" size=3 }>
<{fun}>
第二种方式:采用Samrty插件式的定义函数。特点不用注册,而且所有模板页都可以使用。
在Samrty模板的libs/plugins/目录下定义:
注意:1.文件名必须是: function.自定义函数名.php
如:function.mytable.php
2.在文件里:函数名必须是: funciton smarty_function_自定义函数名(参数名,&$smarty){...}
如:
<?php
/**
* 自定义绘制表格函数mytable,
* 参数$p数组中
* rows:表的行数. 默认2行
* cols:表的列数。默认2列
* content:表格填充内容:默认:"*"
*/
function smarty_function_mytable($p,&$smarty){
if(empty($p[rows])){
$p[rows]=2;
}
if(empty($p[cols])){
$p[cols]=2;
}
if(empty($p[content])){
$p[content]="*";
}
//开始绘制表格
$table ="<table width=60% border=1>";
for($i=0;$i<$p[rows];$i++){ //循环行
$table.="<tr>";
for($j=0;$j<$p[cols];$j++){ //循环列
$table.="<td>{$p[content]}</td>";
}
$table.="</tr>";
}
$table.="</table>";
return $table;
}
?>
3. 使用:<{mytable rows="10" cols="10" content="###"}><br/>
<{mytable}>
5. 自定义块状函数:
<?php
//定义块状函数:
function do_translation ($params, $content, $smarty, &$repeat, $template){
if (isset($content)){
$lang = $params["lang"]; // do some translation with $content
return $translation;
}
}
//注册到Smarty模板中
$smarty->registerPlugin("block","translate", "do_translation");
?>
使用
Where the template is:{translate lang="br"}Hello, world!{/translate}
五、Smarty的缓存技术
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 缓存的基本操作(整个缓存)
$smarty->caching=true; //开启缓存
$smarty->cache_lifetime =5;//缓存时间5秒
2. 局部不缓存
使用{nocache}函数
<h3>缓存时间:<{$smarty.now}><h3>
<{nocache}>
<h3>不缓存时间:<{$smarty.now}><h3>
<{/nocache}>
<h3>缓存时间:<{$smarty.now}><h3>
3. 优化缓存(不操作底层来使用缓存)
//获取数据库信息并缓存5秒。(当6.html不是很有效缓存文件时才执行数据查询)
if(!$smarty->isCached("6.html")){
$m = new Model("stu");
$stulist = $m->findAll(); //获取所有学生信息
$smarty->assign("stulist",$stulist);
$smarty->assign("time",time());
}
$smarty->display("6.html");
4. 同一个模板,产生不同缓存(解决内容详情页的缓存(因为模板只有一个))
//获取数据库信息并缓存5秒。(当6.html不是很有效缓存文件时才执行数据查询)
if(!$smarty->isCached("6.html",$_SERVER["REQUEST_URI"])){
$m = new Model("stu");
$stulist = $m->findAll(); //获取所有学生信息
$smarty->assign("stulist",$stulist);
$smarty->assign("time",time());
}
$smarty->display("6.html",$_SERVER["REQUEST_URI"]);
Smarty模板学习要掌握的内容:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 作用,用途、原理(执行过程)
2. Smarty的搭建
3. Smarty的基本语法
4. 调节器的使用和自定义
5. 函数的使用和自定义
6. 块(成对的定界符)的使用和自定义
{foreach}
{/foreach}
7. 缓存技术
8. (新)模板继承
相关文章推荐
- VirtualBox中centos网络配置
- java/android 设计模式学习笔记(1)---单例模式
- LeetCode 226. Invert Binary Tree C语言
- PE结构
- 1042. Shuffling Machine (20)
- java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)
- RedHat Enterprise Linux5关于中文显示乱码问题解决
- 【USACO题库】4.1.3 Fence Loops篱笆回路
- C++第4次作业
- java/android 设计模式学习笔记目录
- Java之单例模式(饿汉式、懒汉式)
- 面试题12:打印1到最大的n位数
- html关于强制显示、隐藏浏览器的滚动条
- 信息系统项目管理师
- POJ_2100_Graveyard_Design_(尺取法)
- 树的子结构
- 人生没有如果
- 关于异常“The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine”的处理
- JavaEE编程技术(JSP/Servlet)
- 143. Reorder List