Files
cnblogs/dcrenl/php smarty模板引擎.html

405 lines
24 KiB
HTML
Raw Normal View History

2024-09-24 12:43:01 +08:00
<div class="cnblogs_code">
<pre>&lt;?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
一、什么是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的官方网站www.smarty.net/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目录放在网站文档树之外。
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">index.php代码</span>
<span style="color: #0000ff;">require</span>('../libs/Smarty.class.php'<span style="color: #000000;">);
</span><span style="color: #800080;">$smarty</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Smarty;
</span><span style="color: #008000;">//</span><span style="color: #008000;">在调用的模板里可以通过{$name}来输出name的值zhang{}为这里的smarty分界符</span>
<span style="color: #800080;">$smarty</span>-&gt;assign('name','zhang'<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">调用模板tpl文件里不能执行PHP语句块</span>
<span style="color: #800080;">$smarty</span>-&gt;display('templates/index.tpl'<span style="color: #000000;">);
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
index.tpl页面内容
&lt;html&gt;
&lt;body&gt;
&lt;span&gt;你好, {$name}&lt;/span&gt;
&lt;/body&gt;
&lt;/html&gt;
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
Smarty编译时的处理过程是源php文件-&gt;模板文件(可能调用多个或多次)-&gt;源php文件。。。
也就是说不影响原php文件的其他处理和输出。所以smarty模板文件可以是完整的html也可以是其中一部分。
smarty处理过程
smarty将php源文件首先编译成中间文件也是php如果启用缓存再根据编译文件生成缓存文件也是php,需要缓存的部分全部是硬编码。
之后的每次访问都会访问编译文件(如果编译文件已经存在),一次编译多次调用(可以是单文件的多次,也可以是多文件的多次),如果启用缓存且有缓存文件而且没有过期,则直接访问缓存文件,跳过编译文件。
编译文件一经生成就不会被自动更新除非模板文件或者配置文件更改。源php文件修改是不会引发重新编译的。一旦编译文件重新生成缓存文件也必然重新生成。
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">Smarty允许有两种特殊的编译设置存在
//1、 任何时候都不自动重新编译(上线阶段):只有没有该文件的编译文件时才生成,模板文件或者配置文件的更改,不会引发重新编译。</span>
<span style="color: #800080;">$smarty</span>-&gt;setCompile_check(<span style="color: #0000ff;">false</span>);<span style="color: #008000;">//</span><span style="color: #008000;">默认为true,false表示任何时候都不在文件发生变更的情况下生成编译文件除了无编译文件。</span>
<span style="color: #800080;">$smarty</span>-&gt;getCompile_check();<span style="color: #008000;">//</span><span style="color: #008000;">获得当前编译检查的设置
//2、任何时候都重新编译(调试阶段):任何时候都重新编译。</span>
<span style="color: #800080;">$smarty</span>-&gt;setForce_compile(<span style="color: #0000ff;">true</span>);<span style="color: #008000;">//</span><span style="color: #008000;">默认为false,true表示每次都重新编译启用缓存的话每次都重新缓存</span>
<span style="color: #800080;">$smarty</span>-&gt;getForce_compile();<span style="color: #008000;">//</span><span style="color: #008000;">获得当前强制编译的设置
//开启缓存</span>
<span style="color: #800080;">$smarty</span>-&gt;setCaching(<span style="color: #0000ff;">true</span><span style="color: #000000;">);
</span><span style="color: #800080;">$smarty</span>-&gt;getCaching();<span style="color: #008000;">//</span><span style="color: #008000;">获取当前缓存状态默认是false关闭的</span>
<span style="color: #800080;">$smarty</span>-&gt;setcache_lifetime(60);<span style="color: #008000;">//</span><span style="color: #008000;">设置缓存时间单位秒
//{*模版文件*}
//{nocache}
//{$name}
//{/nocache}
//{*如果开启缓存的话放在nocache标签内的变量不会缓存每次读取PHP源文件的值*}</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
smarty分界符
在模板文件中区分普通html代码和smarty代码靠的是分界符。默认是 {} 但可能会与js和css相冲突。可以进行变更。
在3.0中模板标签将不支持空格,如{ $abc }在Smarty2中可以识别的但是3.0里头就不行了,必须这样{$abc}这样是为了能够更好的支持javascript和css。
</span><span style="color: #008000;">*/</span>
<span style="color: #800080;">$smarty</span>-&gt;left_delimiter = "{"; <span style="color: #008000;">//</span><span style="color: #008000;">左分界符2.0属性3.0沿用</span>
<span style="color: #800080;">$smarty</span>-&gt;right_delimiter = "}"<span style="color: #000000;">;
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
分界符就相当于PHP的echo分界符中的值都将输出除非赋值等操作
smarty tpl文件中分界符中两个**之间的内容为注释内容如
tpl文件:
{*这是模板注释内容*}
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">设置缓存目录路径,不设默认"cache"</span>
<span style="color: #800080;">$smarty</span>-&gt;setCacheDir("cache"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取缓存目录路径</span>
<span style="color: #800080;">$smarty</span>-&gt;<span style="color: #000000;">getCacheDir();
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置配置目录路径,不设默认"configs"</span>
<span style="color: #800080;">$smarty</span>-&gt;setConfigDir("configs"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">添加配置目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找</span>
<span style="color: #800080;">$smarty</span>-&gt;addConfigDir("configs/test"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取配置目录路径的数组</span>
<span style="color: #800080;">$smarty</span>-&gt;<span style="color: #000000;">getConfigDir();
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置插件目录路径,不设默认"plugins"</span>
<span style="color: #800080;">$smarty</span>-&gt;setPluginsDir("plugins"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">添加插件目录路径所有路径将会以数组形式保存调用文件时将在所有路径中查找plugins文件夹里放的就是可以在前台或后台按不同规则调用的函数的存储文件文件名及函数名的命名按不同调用规则有不同写法要求</span>
<span style="color: #800080;">$smarty</span>-&gt;addPluginsDir("plugins/test"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取插件目录路径的数组</span>
<span style="color: #800080;">$smarty</span>-&gt;<span style="color: #000000;">getPluginsDir();
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置模板目录路径,不设默认"templates"</span>
<span style="color: #800080;">$smarty</span>-&gt;setTemplateDir("templates"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">添加模板目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找</span>
<span style="color: #800080;">$smarty</span>-&gt;addTemplateDir("templates/test"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取模板目录路径的数组</span>
<span style="color: #800080;">$smarty</span>-&gt;<span style="color: #000000;">getTemplateDir();
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置编译目录路径,不设默认"templates_c"</span>
<span style="color: #800080;">$smarty</span>-&gt;setCompileDir("templates_c"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取编译目录路径</span>
<span style="color: #800080;">$smarty</span>-&gt;<span style="color: #000000;">getCompileDir();
</span><span style="color: #008000;">/*</span><span style="color: #008000;">
我们可以建不同的php源文件文件夹把编写的php文件按一定的分类放在不同的文件夹中。
然后在每个文件夹中都创建一个自定义的config文件在config文件中创建一个新的$smarty = new Smarty 对象
然后把所有不同的文件夹的php文件的缓存配置文件插件模版编译目录都设置到同一个缓存配置文件插件模版编译目录
让该文件夹下所有PHP源文件都引用该配置文件即可获取相同配置
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">模版变量</span>
<span style="color: #800080;">$arr</span> = <span style="color: #0000ff;">array</span>(<span style="color: #0000ff;">array</span>("zhang","li"),'a'=&gt;<span style="color: #0000ff;">array</span>("liu","wang"),<span style="color: #0000ff;">array</span>("ming","yi"<span style="color: #000000;">));
</span><span style="color: #800080;">$smarty</span>-&gt;assign("testArr", <span style="color: #800080;">$arr</span><span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置模版变量,为将要调用的模版提供变量,在接下来调用的模版中可以通过{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}来访问具体某数组元素
//在模版中可以直接通过 {$testArr = "testValue" scope="global"} 来更改传过来的模板变量的值如果不存在则在模板中创建并设置该模版变量scope属性是标注模板变量使用范围的可不写
//在模版中更改或创建成其他数组 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=&gt;2,2=&gt;3]}也可以{$testArr[] = 4}或其他类似PHP中创建数组方式
//php源文件可通过 $smarty-&gt;getTemplateVars("testArr") 获取指定模版变量如要获取模板中改变或创建的模版变量在模板中创建或更改其值时必须加上scope属性并把值设置为scope="global"或scope="parent"</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> A{
</span><span style="color: #0000ff;">function</span> aa(<span style="color: #800080;">$nam</span><span style="color: #000000;">){
</span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$nam</span><span style="color: #000000;">;
}
}
</span><span style="color: #800080;">$smarty</span>-&gt;assign("obj", <span style="color: #0000ff;">new</span><span style="color: #000000;"> A);
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置的模版变量是对象时在模版页可以如下这样调用,给模版传类对象时也是传址
//{$obj-&gt;aa('my name is y')}
//Smarty可以识别嵌入在双引号中的模版变量只要此变量只包含数字、字母、下划线。但貌似只支持能直接转换成字符串的模版变量</span>
<span style="color: #800080;">$smarty</span>-&gt;assign("testStr", "this is testStr"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;">模板中可通过{"$testStr OK !"}来访问</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
tpl模板包含模板
模板文件:
{include file="header.tpl"}
header.tpl内容:
&lt;span&gt;这是顶部内容!!,欢迎你,{$name}&lt;/span&gt;
模板包含模板也可以是这样格式
{include file="header.tpl" testVar="这是顶部内容!!!"}
header.tpl则可以通过{$testVar}使用调用页包含时传来的模板变量
header.tpl内容:
&lt;span&gt;{$testVar},欢迎你,{$name}&lt;/span&gt;&lt;hr /&gt;
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
可以预先规定一系列的变量与值的对应,并放在配置文件中,在使用时载入。
配置文件默认放在configs文件夹中可以自定义修改文件夹名。
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
#模板test.conf文件:
#键对应的值可以不用引号括起来
title = Welcome to Smarty!!
cutoff_size = 40
[china]
language = chinese
[england]
language = english
#[china][england]为标签,未设置标签的键值为全局的只要调用该配置文件就可以在模版中使用,设置了标签的键值只有在调用配置文件时指定了对应标签才可以使用
#在PHP源文件调用配置文件语句$smarty-&gt;configLoad('test.conf', $sections = 'england');该语句下面调用的模版才可以使用该配置文件,通过$sections属性指定使用哪个标签下的键和值
#$sections参数可以不写默认值为null,$smarty-&gt;configLoad('test.conf')则只使用全局的键值,而不能使用标签下的键值
#在模版下通过{config_load file="test.conf" section="china" scope="global"}语句调用配置文件
#section属性可以不写默认是nullscope属性必须写{config_load file="test.conf" scope="global"}
#section属性可赋三种值
#local 只有当前模版可以使用该配置文件
#parent 只有当前模版引入该配置文件语句后包含的模版中或在php源文件中smarty对象调用该配置文件后调用的模版中可以使用该配置文件中的键值
#global 测试效果和parent相同
#在模版中通过{#language#}来使用键值,也可以通过{$smarty.config.language}来访问配置文件键值
#PHP源文件中可以使用$smarty-&gt;getConfigVars('language')或$smarty-&gt;getConfigVariable('language')来获取键值,$smarty-&gt;getConfigVars('language')获取的还可能是数组
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
tpl文件中常用函数
tpl文件:
&lt;!--将capture标签括起的页面显示内容存在capture指定的testCapture中 --&gt;
&lt;!--当达到指定条件时可通过 {$smarty.capture.testCapture} 将内容输出出来 --&gt;
{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}
{*操作符可以是 ==,&gt;= 等也可以是 eq,ne等*}
{for $x=0; $x&lt;count($testArr); $x++}
{$x}
{/for}
{*for循环类似PHP代码*}
{$x=0}
{while $x&lt;count($testArr)}
{$x++}
{/while}
{*While循环也类似PHP代码。*}
&lt;!--name和key属性可不写--&gt;
{foreach name="testForeach" from=$testArr key=arId item=arVal}
{$arId}对应的值为:{$arVal}
&lt;br&gt;
{$smarty.foreach.testForeach.index} &lt;!--(循环内部使用)显示当前循环的索引,如果数组为空,返回-1--&gt;
{$smarty.foreach.testForeach.iteration} &lt;!--(循环内部使用)显示当前的循环次数--&gt;
{$smarty.foreach.testForeach.first} &lt;!--循环内部使用如果为第一次循环返回true--&gt;
{$smarty.foreach.testForeach.last} &lt;!--循环内部使用如果为最后一次循环返回true--&gt;
{$smarty.foreach.testForeach.total} &lt;!-(循环内外部使用)显示循环的总次数--&gt;
&lt;br&gt;
{foreachelse} &lt;!--$testArr数组变量没有值时0个元素执行。--&gt;
$testArr is null
{/foreach}
{*也可以如下两种类PHP格式*}
{foreach $testArr as $n}
{$n}
{/foreach}
{foreach $testArr as $key=&gt;$n}
{$key}
{/foreach}
{$sectionArr = [0=&gt;"a",4=&gt;"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}- &lt;!--当前循环到的数组的键值--&gt;
{$sectionArr[testSection]}- &lt;!--当前循环到的数组的元素值--&gt;
{$smarty.section.testSection.iteration}-&lt;!--当前section循环的次数,从1计起--&gt;
&lt;br/&gt;
{sectionelse}
$sectionArr is null
{/section}
&lt;!--section循环适用于纯int型键值的数组--&gt;
&lt;!--给loop赋一个要循环的数组start指定从数组指定键值开始循环step指定数组下次循环的键值与本次循环键值之差max指定循环最大次数show指定是否循环false的话直接跳到执行sectionelse--&gt;
&lt;!--Section的内置变量与foreach 相同--&gt;
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
tpl模板文件:
{literal}
&lt;script type="text/javascript"&gt;
function a(){
alert("this is script");
}
a();
&lt;/script&gt;
{/literal}
{*
literal 标签区域内的数据将被当作网页html文本处理此时模板将忽略且不分析其内部的所有字符信息。
该特性用于显示有可能包含大括号等字符信息的 js、css 。当这些信息处于 {literal}{/literal} 标签中时,模板引擎将不分析它们,而直接显示。
*}
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">PHP文件:
//$smarty-&gt;setDebugging(true);//对后续调用的模板进行调试。
//$smarty-&gt;getDebugging();//得到当前是否进行调试默认false
//或在需要调试的模版中写入{debug}</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
模板文件:
smarty3.0支持了模版继承系统,例如
f1.tpl:
&lt;html&gt;
&lt;body&gt;
{block name='top'} f1.header&lt;br /&gt;{/block}
{block name='middle'} f1.middle&lt;br /&gt;{/block}
{block name='buttom'} f1.buttom&lt;br /&gt;{/block}
&lt;/body&gt;
&lt;/html&gt;
f2.tpl:
{extends file="f1.tpl"}
{block name='top'} f2.header&lt;br /&gt;{/block}
{block name='other'} it can`t be show &lt;br /&gt;{/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="http://www.126.com" assign="testAssign"}
{$testAssign}
{fetch file="http://www.126.com"}
{*fetch可以引用外部http,ftp的页面如指定assign的值则把引用的内容存在指定名的变量中否则在哪有fetch在哪显示*}
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">php页面:
//调用模版也可以使用此方法,在输出前做一些处理
//$output = $smarty-&gt;fetch("index.tpl");
//do something with $output here对将要输出的内容进行处理
//echo $output;//然后将模板输出</span>
<span style="color: #008000;">/*</span><span style="color: #008000;">
模板中提交表单
&lt;form name="input" action="file.php" method="post"&gt;
action属性可以直接写要提交到的php文件名或者不写空action=""则提交到调用该模板的php文件中
</span><span style="color: #008000;">*/</span>
<span style="color: #008000;">//</span><span style="color: #008000;">连接数据库</span>
<span style="color: #008080;">mysql_connect</span>("localhost","root","root"<span style="color: #000000;">);
</span><span style="color: #008080;">mysql_select_db</span>("test"<span style="color: #000000;">);
</span><span style="color: #800080;">$smarty</span>-&gt;assign('webDir',<span style="color: #800080;">$_SERVER</span>['DOCUMENT_ROOT']);<span style="color: #008000;">//</span><span style="color: #008000;">$_SERVER['DOCUMENT_ROOT']为当前项目文件夹的绝对路径
//配置JQuery的src路径最好写绝对路径或写要运行文件能找到该JQuery的相对路径因为要编译成编译文件而编译后的文件和原路径环境不一样</span>
?&gt;
&lt;script type="text/javascript" src="http://localhost/Smarty/demo/JS/jquery-1.7.2.min.js"&gt;&lt;/script&gt;</pre>
</div>
<p>&nbsp;</p>