Smarty.php
来源:原创
时间:2016-07-23
作者:脚本小站
分类:代码笔记
<?php
//==============================================================
//--------------------使用Smarty模板基本步骤-------------------
/*
使用Smarty前的工作:
将Smarty中的libs文件夹拷贝到服务器目录下,其他文件可
以删除,在libs文件夹中只用到Smarty.class.php文件,但其他
文件在此类中用到不可删除。在libs目录同级的目录当下还要创
建模板目录、编译目录还有被包含文件即配置文件init.inc.php,
在配置文件中将要创建Smarty对象与使用Smarty对象前的一些设
置。
注意事项:
在以路径方式访问模板、CSS、JS、图片等文件时,路径都
要以主程序文件(index.php)为基目录去调用其他文件。
在模板中以{include file=""}形式加载文件,将以Smarty
对象中指定的模板目录为基目录。
*/
//将网站根目录做成绝对地址,以便在任何目录下都可找到。
define("ROOT",pathinfo(__FILE__,PATHINFO_DIRNAME));
//包含Smarty
include_once ROOT."/libs/Smarty.class.php";
//创建Smarty类
$tpl = new Smarty;
//指定模板目录
$tpl->template_dir = ROOT ."/tpl";
//指定编译目录
$tpl->compile_dir = ROOT ."/com";
//配置文件目录
$tpl->config_dir = ROOT ."/configs";
//修改默认分隔符
$tpl->left_delimiter='{';
$tpl->right_delimiter='}';
//要在模板输出的变量
$title="This is a title";
$content="This is body contents";
//分配变量
$tpl->assign("title",$title);
$tpl->assign("content",$content);
//设定模板
$tpl->display("test.html");
//==============================================================
//--------------------------注释--------------------------------
//模板中使用的的注释
{* 注释内容 *}
//==============================================================
//---------------------分配与访问数组--------------------------
//---------------------一维数组----------------------------
//在php中分配数组
$tpl->assign("arr",array("hello","how"));
//在模板中访问数组
{$arr[0]}
{$arr[1]}
//----------------------二维数组---------------------------
//在php中分配数组
$tpl->assign("arr",array(array("a","b"),array("c","d")));
//在模板中访问二维数组
{$arr[0][0]}
{$arr[0][1]}
{$arr[1][0]}
{$arr[1][1]}
//-----------------------关联数组--------------------------
//----------------------------------------------------------
//在php中分配数组
$tpl->assign("arr",array("one"=>"Hello","two"=>"How"));
//在模板中访问关联数组,用点的形式
{$arr.one}
{$arr.two}
//----------------------------------------------------------
//----------------------二维关联数组-----------------------
$tpl->assign("arr",array("one"=>array("one"=>"Hello")));
{$arr.one.two}
//------------------------混合模式-------------------------
{$arr.one[0]}
{$arr[0].one}
//==============================================================
//----------------------分配与使用对象-------------------------
//在php中分配
$tpl->assign("per",new person("Stephen",10));
//在模板中调用属性与方法
{$per->name}
{$per->age}
{$per->say()}
//==============================================================
//----------------------分配并直接运算-------------------------
//在分配
$tpl->assign("num1",10);
$tpl->assign("num2",20);
//在模板中直接运算
{$num1+$num2}
//==============================================================
//------------------用配置文件修改文件属性--------------------
/*此功能用于动态修改模板中标签的样式,在模板中加入{con
fig_load file="view.conf"}语句来加载配置文件,在php程序
文件中(如初始化文件init.inc.php)用 $tpl->configs_dir="con
figs";来指定配置文件存放目录。*/
//1.配置文件view.conf文件中的内容
border=10
tbwidth=800
color=red
//配置文件目录修改方法,指定配置文件存放目录
$tpl->configs_dir="configs";
//2.模板文件内容
<html>
//(1).在模板中加载配置文件
{config_load file="view.conf"}
//(2).用{#xxx#}这种方式修改表格等的属性
<table border="{#border#}" width="{#tbwidth#}" bgcolor="{#color#}">
<tr><td>xxx</td></tr>
</table>
</html>
//------------------为配置文件分区域-----------------------
//在配置文件中用 [区域名] 形式加入区域
//view.conf文件中
//公共区域
border=10
tbwidth=500
//区域一
[One]
border=30
tbwidth=300
//区域二
[Two]
border=20
tbwidth=400
//在模板文件中修改参数 section="区域"
{config_load file="view.conf" section="One"}
//==============================================================
//-------------------在模板中直接使用的变量-------------------
//$_GET["page"]在模板中直接使用,形式如下
{$smarty.get.page}
//$_SESSION["username"]="This is a username";
{$smarty.session.username}
//等等
{$smarty.post.page}
{$smarty.cookies.username}
{$smarty.server.SERVER_NAME}
{$smarty.env.PATH}
{$smarty.request.username}
//-------------------在模板中直接使用的常量---------------
{$smarty.const.HOST} //主机名
{$smarty.const.__FILE__} //正在使用的编译文件
{$smarty.server.SCRIPT_FILENAME} //正在访问的脚本文件名
//--------------------在模板中访问配置文件-----------------
/*访问配置文件,用法同{#border#},如:<tr bgcolor="<#co
lor#>">与<tr bgcolor="<$smarty.config.border>">效果相同*/
{$smarty.config.border}
//--------------------获取当前服务器的时间-----------------
//当前服务器的时间戳
{$smarty.now}
//使用变量调解器将时间戳转换为年月日格式
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
//===================在模板中使用php的函数=====================
//-----------------------注册函数---------------------------
/*先在php中将函数写好,再在函数的上面使用$tpl->register_
function("modName","funName")方法将函数注册(即为函数在模板
中分配使用该函数的使用名)。在模板中写上{modName one ="a"
two = "b"}即可调用该函数,此种调用函数的方式是以数组形式
传入参数,其中one、two为传入函数的关联数组的键名,a、b为
键值。还可以将分配在模板中的变量作为参数传入函数*/
//php文件中写入的内容
require_once "../init.inc.php";
$tpl->register_function("Hello","demo");
function demo($args){
return $args['one'].$args['two'].$args['three'];
}
$Hello = "Hello";
$tpl->assign("one",$Hello);
$tpl->display("Test.html");
/*模板中调用函数的写法,其中$one为从php中
分配到模板的变量,在此作为参数传入函数*/
{Hello one="$one is shit " two=2 three=3}
//输出内容为:Hello is shit 22333
//-----------------------注册块标记------------------------
/*用法同注册函数,不同点在于注册块属于双标记{hello color
="red"}One More Time{hello},且标签中的内容在函数中是用
另一个形参来接收,形如function Hello($args,$contents,&$a,
&$b){}其中$contents用来接收标记块之间的内容,&$a与&$b为引
用传值Smarty会传入参数。*/
//注册块标记,将Test函数注册为Hello名
$tpl->register_block("Hello","Test");
/*第一个参数用来接收标签属性,第二个传标签中的属性,
预留两个变量,采用引用传值*/
function Test($args,$content,&$a,&$b){
echo $args['red'].$args['size'].$args['num'].$content;
}
//在模板中使用快标记,并传入参数
{Hello num=5 color="red" size="7"}
//在内容中可加入变量
Hello---{$Hello}---Hello<br>
{/Hello}
//------------------用插件的形式写函数---------------------
/*在模板中也可以用插件的形式调用函数,在smarty插件目录下
自定义一个函数文件在模板中即可调用该函数。不同的插件有
不同的命名规则,以function开头的为函数文件,modifier开头
的为变量调解器文件,以block开头的为块函数文件。操作流程
如下:*/
//插件目录 Smarty/libs/plugins
//函数的插件文件命名规则:function.Name.php
//函数名的书写规范:function smarty_function_Name(){}
//传入函数的参数:参数数组,预留变量
function smarty_function_Hello($args,&$smarty){
print_r($args);
}
//在模板中直接调用函数
{Hello num=6 color="red" size=7 content="Hello"}
//-------------------插件形式加入块------------------------
//插件目录 Smarty/libs/plugins
//块函数文件命名规则:block.Name.php
//块函数命名规范:function smarty_block_Hello(){}
//传入函数的参数:参数数组,块中内容,预留变量
function smarty_block_Hello($args,$content,&$smarty){
print_r($args);
echo $content;
}
//在模板中直接调用函数
{Hello num=6 color="red" size=7}
Hello--{$hello}--Hello<br>
{/Hello}
//--------------------------------------------------------------
//--------------------Smarty中的自定义函数---------------------
/*自定义函数即Smarty提供已定义好的函数,如下拉框标签{html
_select_date}直接调用即可,而且可以任意修改任意添加。更多
内容详见手册(函数中有常用的功能)*/
//==============================================================
//----------------------变量调解函数---------------------------
/*变量调解器可以使数据直接在模板中处理,不必在程序中处理
完成后再分配到模板,采用插件方式与采用分配函数方式都可以,
本例采用插件方式*/
//插件目录 Smarty/libs/plugins
//命名规则:modifier.Name.php
//模块文件书写规范如下
//函数参数:任意参数
function smarty_modifier_todx($Hello,$Hello1,$Hello2){}
//在模板中使用变量调解器
//调用形式:{分配的变量|函数名:"参数1":"参数2":"参数3"}
{$str|todx:"Hello":"Hello1":"Hello2"}
//组合使用变量调解器,函数在前的先调用
{$str|todx:"Hello":"How"|demo:"Hello"}
//Smarty中自带的函数调解器,详见手册
truncate
upper
//==============================================================
//-----------------------Smarty内建函数-------------------------
/*Smarty内建函数和自定义函数类似,都可以再模板中直接使用
不同的是内建函数不可以修改删除等操作,自定义函数可以修改
删除等。*/
//----------------------常用内建函数------------------------
//此标签可以在模板中直接使用php代码
{php}/*php的任何程序*/{/php}
/*在模板中包含子模板或文件:子模板中的变量,只要向主模
板中分配子模板变量即可。用include加载模板时被加载的文件
成为此模板的一部分。*/
{include file="header.tpl"}
//从配置文件中加载变量
{config_load file="colors.conf"}
/*此标签将一个内容保存,在需要的地方将其输出。标签之间
为要保存的内容,name为输出时用的调用名,用$Smarty.captu
re.调用名,来调用输出。*/
{capture name="Hello"}/*各种内容*/{/capture}
//输出调用
{$smarty.capture.Hello}
//---------------模板中的if elseif else语句----------------
//将变量分配给模板
$tpl->assign("var",1);
/*在模板中的书写格式:如果if后面的变量为真,则if中的内
容才会执行,同php中的 if($var==1){} */
{if $var == 1} //开始标签
Hello<br>
{elseif $var == 2} //不支持 if else
Hello2<br>
{else}
Hello3<br>
{/if} //结束标签
//-------------模板中的foreach foreachelse-----------------
//在php中分配数组
$tpl->assign("arr",$array);
/*
{foreach}标签的作用是来遍历数组,
在模板中的书写格式:
from = $arr $arr为分配的数组,
item = "" 为数组值
key = "" 为数组下标
name = "" 为该循环的名字,用于访问该循环 key="" 与name=""可省略
*/
//同 foreach($arr as $key=>$var)
{foreach from=$arr item="var" key="key" name="Hello"}
{$key}=>{$var}
{foreachelse}
not arr<br>
{/foreach}
//遍历二维关联数组
{foreach from=$article item="data" }
{$data.article}
{$data.artId}
{/foreach}
//name的作用为访问foreach循环中的某些变量
//循环的总次数,循环内外都可使用
{$smarty.foreach.Hello.total}
//当前循环执行的次数即行号,循环内使用
{$smarty.foreach.Hello.iteration}
//循环的第一次为真,循环内使用
{$smarty.foreach.Hello.first}
//循环的最后一次为真,循环内使用
{$smarty.foreach.Hello.last}
//双重循环写法
{foreach from=$arr item="row" }
{foreach from=$row item="col" }
{$col}
{/foreach}
{/foreach}
//----------------模板中的section遍历数组------------------
//section优点:效率要比使用foreach高,功能比foreach多
//section缺点:无法遍历关联数组
/*section特点:section只能决定循环的次数,遍历数组的方式
还是去直接访问数组*/
/*参数:loop="" 要循环的数组; name="Hello"该数组的临时名
字用于访问该数组; max=""循环的次数;start=""开始遍历的条
数,step=""每次遍历跳过的步骤*/
{section loop=$arr name="Hello" max="10" start="5" step="2"}
//输出数组全部
{$arr[Hello]}<br>
//输出数组的单个值
{$arr[Hello].id}
{$arr[Hello].name}
{$arr[Hello].price}
{sectionelse}
not data<br>
{/section}
/*index索引的功能:每遍历一次数组输出一次索引序号,如果
设置了step=""的值,则索引的序号的跳步数同step的值*/
{section loop=$arr name="hello" step="2"}
//输出的索引序号同遍历所跳的数相同如:1 4 7...
{$smarty.section.Hello.index}
//每次遍历数组输出一个数字即行号1 2 3 4...
//rownum 是iteration的别名
{$smarty.section.Hello.iteration}
{$arr[Hello].id}
{$arr[Hello].name}
{$arr[Hello].price}<br>
{/section}
//==============================================================
//---------------------Smarty的缓存技术------------------------
//Smarty的缓存技术同网页静态化
/*此段代码放在初始化文件中*/
//1.开启缓存(开发阶段勿开)
$tpl->caching=0; //0表示关闭,1表示开启
//2.指定缓存文件目录
$tpl->cache_dir=ROOT."/cache";
//3.指定缓存的时间
$tpl->cache_lifetime=60; //单位秒
/*注意:对于分页结构的网页需要对每个网页进行缓存,
$tpl->display("模板","缓存id")中的第二个参数为网页缓存
的id,可根据网页不同的页面有不同的url将缓存id设置为网
页的url */
$tpl->display("test.html","cacheId");
//对整个网站进行缓存
$tpl->display("test.html",$_SERVER["REQUEST_URI"]);
/*一般情况下,当程序执行到$tpl->display("","")这一步时
才知道网页是否已经缓存,若没有缓存再执行缓存,但是前
面的程序已经执行,并没有提高程序的执行效率,所以要在
未执行前面的程序时首先判断是否已有该网页的缓存。在程
序执行数据库操作时如果跳过此操作可以节省程序执行时间
,程序在执行数据库操作时速度最慢*/
//判断网页对应的cacheId(如Url)网页是否已有缓存
$tpl->is_cached("test.html","cacheId");
//先判断模板是否已有缓存,若没有再执行分配数据
if(!$tpl->is_cached("test.html","cacheId")){
$tpl->assign("var",$Hello);
}
$tpl->display("test.html","cacheId");
//---------------------局部缓存----------------------------
/*将php中的分配数据代码$tpl->assign("","")写在判断缓存
代码if(!is_cached("","")){}的外面,在模板中加入
{nocache}{/nocache}标签,在此模板中的内容将不会缓存
但{nocached}标签系统并没有提供,需要自己写*/
//注册方式写{nocached}块标签
$tpl->register_block("nocache","ncache");
//参数:参数,缓存的内容,false(注意:表示经过块的不缓存)
function ncache($param,$content,false){
return $content;
}
//插件形式加入{nocache}块
/*1.在 Smarty/libs/plugins 目录下加入block.nocache.php文件,
在文件中写入内容如下*/
/*参数:函数的参数(标签属性),缓存内容(标签中的内容),传
入引用*/
function smarty_block_nocache($param,$content,&$s){
return $content;
}
//2.将Smarty中的Smarty_Compiler.class.php中的712行改为
if($tag_command=="nocache")//判断是nocache块的不缓存
$this->_plugins['block'][$tag_command] =
array($plugin_func, null, null, null, false);
else
$this->_plugins['block'][$tag_command] =
array($plugin_func, null, null, null, true);
//-----------------------清除缓存--------------------------
//清除模板缓存
$tpl->clear_all_cache();
//清除某个模板缓存
$tpl->clear_cache("Hello.html");
//清除单个缓存
$tpl->clear_cache("Hello.html","cacheId");
//==============================================================
//--------------------------------------------------------------