PHP模板引擎smarty详细介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP模板引擎smarty详细介绍
<?php
/*
⼀、什么是smarty?
smarty是⼀个使⽤PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,
⽬的就是要使⽤PHP程序员同美⼯分离,使⽤的程序员改变程序的逻辑内容不会影响到美⼯的页⾯设计,美⼯重新修改页⾯不会影响到程序的程序逻辑,这在多⼈合作的项⽬中显的尤为重要。
⼆、smarty优点:
1. 速度:采⽤smarty编写的程序可以获得最⼤速度的提⾼,这⼀点是相对于其它的模板引擎技术⽽⾔的。
2. 编译型:采⽤smarty编写的程序在运⾏时要编译成⼀个⾮模板技术的PHP⽂件,这个⽂件采⽤了PHP与HTML混合的⽅式,在下⼀次访问模板时将WEB请求直接转换到这个⽂件中,⽽不再进⾏模板重新编译(在源程序没有改动的情况下)
3. 缓存技术:smarty选⽤的⼀种缓存技术,它可以将⽤户最终看到的HTML⽂件缓存成⼀个静态的HTML页,当设定smarty的cache属性为true时,在smarty设定的cachetime期内将⽤户的WEB请求直接转换到这个静态的HTML⽂件中来,这相当于调⽤⼀个静态的HTML⽂件。
4. 插件技术:smarty可以⾃定义插件。
插件实际就是⼀些⾃定义的函数。
5. 模板中可以使⽤if/elseif/else/endif。
在模板⽂件使⽤判断语句可以⾮常⽅便的对模板进⾏格式重排。
三、不适合使⽤smarty的地⽅:
1. 需要实时更新的内容。
例如像股票显⽰,它需要经常对数据进⾏更新,这类型的程序使⽤smarty会使模板处理速度变慢。
2. ⼩项⽬。
⼩项⽬因为项⽬简单⽽美⼯与程序员兼于⼀⼈的项⽬,使⽤smarty会丧失php开发迅速的优点。
四、smarty⽬录结构及版本
打开smarty的官⽅⽹站,/download.php。
下载Smarty 3.1.12。
有tar.gz和zip分别适⽤于linux和windows版本。
下载好后Smarty-stable-3.1.12解压缩会得到⼀个 Smarty-3.1.12 ⽂件夹,⾥⾯有两个主要⽂件夹demo和libs
demo⽂件夹为⽰例⽂件夹,⾥⾯包含默认⽂件夹结构,是我们要进⾏编写程序代码的主要⽂件夹。
demo⾥⽂件夹的名称都是smarty默认的⽬录结构名称,可以通过改smarty对应属性值,再把⽂件夹名改成我们想要的名称。
libs为smarty代码源⽂件夹,⼀般不动。
/libs/Smarty.class.php #主⽂件
/libs/sysplugins/ #内部plugin
/libs /plugins/ #外部plugin,可⾃由扩充
/demo/cahce/ #放置缓存⽂件
/demo/configs / #放置可以载⼊的配置⽂件
/demo/templates/ #放置模板⽂件
/demo/templates_c/ #放置对模板编译后的⽂件
可以把解压得到的 Smarty-3.1.12 ⽂件夹名改成我们想要的项⽬名,demo也可以改成我们想要的具体存放编码的⽂件夹的名称
2、调试Smarty-3.1.12
创建⾃⼰的⽂件,在demo⽂件夹下创建index.php。
在templates⽬录中创建模板index.tpl
(⼏乎可以是任何⽂本⽂件的扩展名,常⽤的是tpl,php,html,不建议使⽤后两者,因为可以从浏览器直接访问⽽不安全。
可以对apache的httpd.conf进⾏设置,禁⽌直接访问.tpl⽂件。
或者将templats⽬录放在⽹站⽂档树之外。
)
*/
//index.php代码
require('../libs/Smarty.class.php');
$smarty = new Smarty;
//在调⽤的模板⾥可以通过{$name}来输出name的值zhang,{}为这⾥的smarty分界符
$smarty->assign('name','zhang');
//调⽤模板tpl⽂件⾥不能执⾏PHP语句块
$smarty->display('templates/index.tpl');
/*
index.tpl页⾯内容
<html>
<body>
<span>你好, {$name}</span>
</body>
</html>
*/
/*
Smarty编译时的处理过程是源php⽂件->模板⽂件(可能调⽤多个或多次)->源php⽂件。
也就是说不影响原php⽂件的其他处理和输出。
所以smarty模板⽂件可以是完整的html,也可以是其中⼀部分。
smarty处理过程
smarty将php源⽂件,⾸先编译成中间⽂件(也是php),如果启⽤缓存,再根据编译⽂件⽣成缓存⽂件(也是php),需要缓存的部分全部是硬编码。
之后的每次访问都会访问编译⽂件(如果编译⽂件已经存在),⼀次编译多次调⽤(可以是单⽂件的多次,也可以是多⽂件的多次),如果启⽤缓存且有缓存⽂件⽽且没有过期,则直接访问缓存⽂件,跳过编译⽂件。
编译⽂件⼀经⽣成,就不会被⾃动更新,除⾮模板⽂件或者配置⽂件更改。
源php⽂件修改是不会引发重新编译的。
⼀旦编译⽂件重新⽣成,缓存⽂件也必然重新⽣成。
*/
//Smarty允许有两种特殊的编译设置存在:
//1、任何时候都不⾃动重新编译(上线阶段):只有没有该⽂件的编译⽂件时才⽣成,模板⽂件或者配置⽂件的更改,不会引发重新编译。
$smarty->setCompile_check(false);//默认为true,false表⽰任何时候都不在⽂件发⽣变更的情况下⽣成编译⽂件,除了⽆编译⽂件。
$smarty->getCompile_check();//获得当前编译检查的设置
//2、任何时候都重新编译(调试阶段):任何时候都重新编译。
$smarty->setForce_compile(true);//默认为false,true表⽰每次都重新编译(启⽤缓存的话,每次都重新缓存)
$smarty->getForce_compile();//获得当前强制编译的设置
//开启缓存
$smarty->setCaching(true);
$smarty->getCaching();//获取当前缓存状态,默认是false关闭的
$smarty->setcache_lifetime(60);//设置缓存时间单位秒
//{*模版⽂件*}
//{nocache}
//{$name}
//{/nocache}
//{*如果开启缓存的话放在nocache标签内的变量不会缓存,每次读取PHP源⽂件的值*}
/*
smarty分界符
在模板⽂件中,区分普通html代码和smarty代码靠的是分界符。
默认是 {} ,但可能会与js和css相冲突。
可以进⾏变更。
在3.0中模板标签将不⽀持空格,如{ $abc }在Smarty2中可以识别的,但是3.0⾥头就不⾏了,必须这样{$abc},这样是为了能够更好的⽀持javascript和css。
*/
$smarty->left_delimiter = "{"; //左分界符,2.0属性,3.0沿⽤
$smarty->right_delimiter = "}";
/*
分界符就相当于PHP的echo,分界符中的值都将输出,除⾮赋值等操作
smarty tpl⽂件中分界符中两个**之间的内容为注释内容如
tpl⽂件:
{*这是模板注释内容*}
*/
//设置缓存⽬录路径,不设默认"cache"
$smarty->setCacheDir("cache");
//获取缓存⽬录路径
$smarty->getCacheDir();
//设置配置⽬录路径,不设默认"configs"
$smarty->setConfigDir("configs");
//添加配置⽬录路径,所有路径将会以数组形式保存,调⽤⽂件时将在所有路径中查找
$smarty->addConfigDir("configs/test");
//获取配置⽬录路径的数组
$smarty->getConfigDir();
//设置插件⽬录路径,不设默认"plugins"
$smarty->setPluginsDir("plugins");
//添加插件⽬录路径,所有路径将会以数组形式保存,调⽤⽂件时将在所有路径中查找,plugins⽂件夹⾥放的就是可以在前台或后台按不同规则调⽤的函数的存储⽂件,⽂件名及函数名的命名按不同调⽤规则有不同写法要求
$smarty->addPluginsDir("plugins/test");
//获取插件⽬录路径的数组
$smarty->getPluginsDir();
//设置模板⽬录路径,不设默认"templates"
$smarty->setTemplateDir("templates");
//添加模板⽬录路径,所有路径将会以数组形式保存,调⽤⽂件时将在所有路径中查找
$smarty->addTemplateDir("templates/test");
//获取模板⽬录路径的数组
$smarty->getTemplateDir();
//设置编译⽬录路径,不设默认"templates_c"
$smarty->setCompileDir("templates_c");
//获取编译⽬录路径
$smarty->getCompileDir();
/*
我们可以建不同的php源⽂件⽂件夹,把编写的php⽂件按⼀定的分类放在不同的⽂件夹中。
然后在每个⽂件夹中都创建⼀个⾃定义的config⽂件,在config⽂件中创建⼀个新的$smarty = new Smarty 对象
然后把所有不同的⽂件夹的php⽂件的缓存,配置⽂件,插件,模版,编译⽬录都设置到同⼀个缓存,配置⽂件,插件,模版,编译⽬录
让该⽂件夹下所有PHP源⽂件都引⽤该配置⽂件即可获取相同配置
*/
//模版变量
$arr = array(array("zhang","li"),'a'=>array("liu","wang"),array("ming","yi"));
$smarty->assign("testArr", $arr);
//设置模版变量,为将要调⽤的模版提供变量,在接下来调⽤的模版中可以通过{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}来访问具体某数组元素
//在模版中可以直接通过 {$testArr = "testValue" scope="global"} 来更改传过来的模板变量的值(如果不存在则在模板中创建并设置该模版变量),scope属性是标注模板变量使⽤范围的可不写
//在模版中更改或创建成其他数组 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其他类似PHP中创建数组⽅式
//php源⽂件可通过 $smarty->getTemplateVars("testArr") 获取指定模版变量,如要获取模板中改变或创建的模版变量,在模板中创建或更改其值时必须加上scope属性并把值设置为scope="global"或scope="parent"
class A{
function aa($nam){
echo $nam;
}
}
$smarty->assign("obj", new A);
//设置的模版变量是对象时在模版页可以如下这样调⽤,给模版传类对象时也是传址
//{$obj->aa('my name is y')}
//Smarty可以识别嵌⼊在双引号中的模版变量,只要此变量只包含数字、字母、下划线。
但貌似只⽀持能直接转换成字符串的模版变量
$smarty->assign("testStr", "this is testStr");
//模板中可通过{"$testStr OK !"}来访问
/*
tpl模板包含模板
模板⽂件:
{include file="header.tpl"}
header.tpl内容:
<span>这是顶部内容!!,欢迎你,{$name}</span>
模板包含模板也可以是这样格式
{include file="header.tpl" testVar="这是顶部内容"}
header.tpl则可以通过{$testVar}使⽤调⽤页包含时传来的模板变量
header.tpl内容:
<span>{$testVar},欢迎你,{$name}</span><hr />
*/
/*
可以预先规定⼀系列的变量与值的对应,并放在配置⽂件中,在使⽤时载⼊。
配置⽂件默认放在configs⽂件夹中,可以⾃定义修改⽂件夹名。
*/
/*
#模板test.conf⽂件:
#键对应的值可以不⽤引号括起来
title = Welcome to Smarty!!
cutoff_size = 40
[china]
language = chinese
[england]
language = english
#[china],[england]为标签,未设置标签的键值为全局的只要调⽤该配置⽂件就可以在模版中使⽤,设置了标签的键值只有在调⽤配置⽂件时指定了对应标签才可以使⽤
#在PHP源⽂件调⽤配置⽂件语句$smarty->configLoad('test.conf', $sections = 'england');该语句下⾯调⽤的模版才可以使⽤该配置⽂件,通过$sections属性指定使⽤哪个标签下的键和值
#$sections参数可以不写,默认值为null,$smarty->configLoad('test.conf')则只使⽤全局的键值,⽽不能使⽤标签下的键值
#在模版下通过{config_load file="test.conf" section="china" scope="global"}语句调⽤配置⽂件
#section属性可以不写,默认是null,scope属性必须写{config_load file="test.conf" scope="global"}
#section属性可赋三种值
#local 只有当前模版可以使⽤该配置⽂件
#parent 只有当前模版引⼊该配置⽂件语句后包含的模版中,或在php源⽂件中smarty对象调⽤该配置⽂件后调⽤的模版中可以使⽤该配置⽂件中的键值
#global 测试效果和parent相同
#在模版中通过{#language#}来使⽤键值,也可以通过{$nguage}来访问配置⽂件键值
#PHP源⽂件中可以使⽤$smarty->getConfigVars('language')或$smarty->getConfigVariable('language')来获取键
值,$smarty->getConfigVars('language')获取的还可能是数组
*/
/*
tpl⽂件中常⽤函数
tpl⽂件:
<!--将capture标签括起的页⾯显⽰内容存在capture指定的testCapture中 -->
<!--当达到指定条件时可通过 {$smarty.capture.testCapture} 将内容输出出来 -->
{capture name="testCapture"}
{include file="f1.tpl"}
{/capture}
{if true}
{$smarty.capture.testCapture}
{/if}
{if $name == "wang"}
Welcome wang.
{elseif $name == "zhang"}
Welcome zhang.
{else}
Welcome, whatever you are.
{/if}
{*操作符可以是 ==,>= 等也可以是 eq,ne等*}
{for $x=0; $x<count($testArr); $x++}
{$x}
{/for}
{*for循环,类似PHP代码*}
{$x=0}
{while $x<count($testArr)}
{$x++}
{/while}
{*While循环,也类似PHP代码。
*}
<!--name和key属性可不写-->
{foreach name="testForeach" from=$testArr key=arId item=arVal}
{$arId}对应的值为:{$arVal}
<br>
{$smarty.foreach.testForeach.index} <!--(循环内部使⽤)显⽰当前循环的索引,如果数组为空,返回-1--> {$smarty.foreach.testForeach.iteration} <!--(循环内部使⽤)显⽰当前的循环次数-->
{$smarty.foreach.testForeach.first} <!--(循环内部使⽤)如果为第⼀次循环,返回true--> {$st} <!--(循环内部使⽤)如果为最后⼀次循环,返回true--> {$smarty.foreach.testForeach.total} <!-(循环内外部使⽤)显⽰循环的总次数-->
<br>
{foreachelse} <!--$testArr数组变量没有值时(0个元素)执⾏。
-->
$testArr is null
{/foreach}
{*也可以如下两种类PHP格式*}
{foreach $testArr as $n}
{$n}
{/foreach}
{foreach $testArr as $key=>$n}
{$key}
{/foreach}
{$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]}
{section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true}
{$smarty.section.testSection.index}- <!--当前循环到的数组的键值-->
{$sectionArr[testSection]}- <!--当前循环到的数组的元素值-->
{$smarty.section.testSection.iteration}-<!--当前section循环的次数,从1计起-->
<br/>
{sectionelse}
$sectionArr is null
{/section}
<!--section循环适⽤于纯int型键值的数组-->
<!--给loop赋⼀个要循环的数组,start指定从数组指定键值开始循环,step指定数组下次循环的键值与本次循环键值之差,max 指定循环最⼤次数,show指定是否循环false的话直接跳到执⾏sectionelse-->
<!--Section的内置变量与foreach 相同-->
*/
/*
tpl模板⽂件:
{literal}
<script type="text/javascript">
function a(){
alert("this is script");
}
a();
</script>
{/literal}
{*
literal 标签区域内的数据将被当作⽹页html⽂本处理,此时模板将忽略且不分析其内部的所有字符信息。
该特性⽤于显⽰有可能包含⼤括号等字符信息的 js、css 。
当这些信息处于 {literal}{/literal} 标签中时,模板引擎将不分析它们,⽽直接显⽰。
*}
*/
//PHP⽂件:
//$smarty->setDebugging(true);//对后续调⽤的模板进⾏调试。
//$smarty->getDebugging();//得到当前是否进⾏调试,默认false
//或在需要调试的模版中写⼊{debug}
/*
模板⽂件:
smarty3.0⽀持了模版继承系统,例如
f1.tpl:
<html>
<body>
{block name='top'} f1.header<br />{/block}
{block name='middle'} f1.middle<br />{/block}
{block name='buttom'} f1.buttom<br />{/block}
</body>
</html>
f2.tpl:
{extends file="f1.tpl"}
{block name='top'} f2.header<br />{/block}
{block name='other'} it can`t be show <br />{/block}
{*
如果f2.tpl中没有block标签,或f2.tpl中没有和f1.tpl中相同命名的block标签,则f2.tpl完整引⼊显⽰f1.tpl中所有内容包括block标签的内容,⽽f2.tpl中所有内容将忽略
如果f2.tpl中有和f1.tpl中同名block标签,则在f2.tpl显⽰时f2.tpl中block标签内容将覆盖f1.tpl中同名block标签的内容,在f2.tpl页⾯显⽰时,内容仍将按f1.tpl设置的格式位置显⽰,f2.tpl其他所有⽂本包括未同名的block标签及其内容都将被忽略,不显⽰。
block标签的内容只会覆盖⽗模版中同名block标签的内容,或在⼦模版中显⽰,在本页⾯中如果没有调⽤⽗模版或⽗模版中没有要覆盖的同名block标签,block标签内容在本页⾯中不显⽰
这种继承⽀持多⽂件,多重继承,意味着可以⽆限的继承下去
*}
{fetch file="" assign="testAssign"}
{$testAssign}
{fetch file=""}
{*fetch可以引⽤外部http,ftp的页⾯,如指定assign的值则把引⽤的内容存在指定名的变量中,否则在哪有fetch在哪显⽰*}
*/
//php页⾯:
//调⽤模版也可以使⽤此⽅法,在输出前做⼀些处理
//$output = $smarty->fetch("index.tpl");
//do something with $output here对将要输出的内容进⾏处理
//echo $output;//然后将模板输出
/*
模板中提交表单
<form name="input" action="file.php" method="post">
action属性可以直接写要提交到的php⽂件名,或者不写空action=""则提交到调⽤该模板的php⽂件中
*/
//连接数据库
mysql_connect("localhost","root","root");
mysql_select_db("test");
$smarty->assign('webDir',$_SERVER['DOCUMENT_ROOT']);//$_SERVER['DOCUMENT_ROOT']为当前项⽬⽂件夹的绝对路径
//配置JQuery的src路径最好写绝对路径或写要运⾏⽂件能找到该JQuery的相对路径因为要编译成编译⽂件,⽽编译后的⽂件和原路径环境不⼀样
>
<script type="text/javascript" src="http://localhost/Smarty/demo/JS/jquery-1.7.2.min.js"></script>。