一.smarty3配置
下载smarty文件
在smarty的官方网站下载smarty文件,解压下载到的smarty文件,smarty的库文件就在libs文件夹中。
我使用的php调试环境的程序集成包是phpstudy,默认在d盘会有一个www的文件夹,在www文件夹中创建一个testsmarty的文件夹,testsmarty文件夹就是本次练习smarty的项目根目录。在testsmarty中创建一个smarty的文件夹,并将libs中的文件复制到这个smarty文件夹中。目录结构如下:
smarty配置
在testsmarty文件夹中创建一个test文件夹,在这个文件夹中创建一个config.php文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
header( "content-type:text/html;charset=utf-8" );
//引入核心文件并实例化
require ( '/www/testsmarty/smarty/smarty.class.php' );
$smarty = new smarty();
//配置
//模板文件的路径
$smarty ->template_dir = '/www/testsmarty/test/tpl' ;
//模板文件编译后得到的文件的路径
$smarty ->compile_dir = '/www/testsmarty/test/template_c' ;
//缓冲文件的路径
$smarty ->cache_dir = '/www/testsmarty/test/cache' ;
//开启缓冲,缓冲默认是关闭的
$smarty ->caching = true;
//缓冲的保留时间
$smarty ->cache_lifetime = 120;
?>
|
在设置路径的时候我使用的是绝对路径,也能使用相对路径。依据设置的路径,还要在test文件夹中创建tpl,template_c和cache文件夹。
目录如下:
检验smarty是否配置成功:
在test文件夹下创建一个start.php文件,文件内容如下:
1
2
3
4
5
6
7
8
|
<?php
//引入配置文件
require ( 'config.php' );
//向模板文件中传递值
$smarty ->assign( 'text' , 'hello smarty' );
//渲染模板
$smarty ->display( 'start.tpl' );
?>
|
在tpl文件中创建一个start.tpl文件,内容如下:
{$text}
模板文件的后缀并不是非得是tpl
在浏览器中输入localhost:800/testsmarty/test/start.php
注意:在我这儿apache是800端口
如果浏览器中能够显示出hello smarty,则说明smarty配置成功。
二.入门语法
界定符
smarty的标签是位于界定符之间,默认界定符是{和},界定符是可以改变的。在配置文件中对界定符进行修改,如下:
//将左界定符改为#
$smarty->left_delimiter = '#';
//将右界定符改为#
$smarty->right_delimiter = '#';
当smarty读取到界定符之间的内容会试图解析它,并输出结果。在界定符之外的内容都是静态。
注释
注释是以*开头*结尾的,外面包着界定符,如下:
{* 这儿是注释 *}
输出变量
1
2
|
//向要渲染的模板传递值
$smarty ->assign( '变量名' ,值)
|
传递的值可以是字符串,数组也能是对象。
当变量是字符串时,{$变量名}表示输出变量。
当变量是数组时,输出变量的方式有两种,分别为:
a.{$arr.key}
b.{$arr['key']}
当是一个对象时,可以直接通过obj->method(),调用对象的方法
条件判断
条件判断的基本句式如下:
1
2
3
4
5
6
7
|
{ if $variable 条件修饰符 value1}
//some
{ elseif $variable 条件修饰符 value2}
//some
{ else }
//some
{/ if }
|
基本的条件修饰符有:eq(等于),neq(不等于),gt(大于),lt(小于),lte(小于等于),gte(大于等于)。修饰符前后要有空格
循环
smarty中有两种循环,分别是foreach,section,for和while
section循环
section不能循环遍历关联数组,它只能循环遍历连续数字下标的数组,如果要循环关联数组使用foreach
section可以接受name,loop,step,start,max,show,其中name和loop是必须的。name是每一次循环得到的下标,loop是垚循环的值,step循环的步长,默认为1,max是最大循环的次数,start开始循环的下标,默认为0,如果start为负数,就从数组末尾开始循环,show表示是否显示循环的内容,默认是true
如下:
在test文件夹下创建section.php文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
require ( 'config.php' );
$article = array (
array (
'title' => '第一章' ,
'name' => 'qxqstar' ,
'content' => 'smarty section循环第一章'
),
array (
'title' => '第二章' ,
'name' => 'qxqstar' ,
'content' => 'smarty section循环第二章'
)
);
$smarty ->assign( 'article' , $article );
$smarty ->display( 'section.tpl' );
?>
|
在tpl文件夹下创建section.tpl文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
|
<ul>
{section name=item loop= $article }
<li>
{ $article [item].title}
<p>作者:{ $article [item].name}</p>
<p>内容:{ $article [item].content}</p>
</li>
{sectionelse}
没有文章
{/section}
</ul>
|
foreach循环
foreach循环比section循环要简单,foreach的语法与php中foreach的语法很像,foreach可以做到任何section做到的功能,并且foreach更简单
1
2
|
{ foreach $arrayvar as $itemvar }
{ foreach $arrayvar as $keyvar => $itemvar }
|
例子如下:
在test文件夹中创建foreach.php文件,文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
require ( 'config.php' );
$articles = array (
array (
'title' => '第一章' ,
'name' => 'qxqstar' ,
'content' => 'smarty foreach循环第一章'
),
array (
'title' => '第二章' ,
'name' => 'qxqstar' ,
'content' => 'smarty foreach循环第二章'
)
);
$smarty ->assign( 'articles' , $articles );
$smarty ->display( 'foreach.tpl' );
?>
|
在tpl文件夹中创建foreach.tpl文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
|
<ul>
{ foreach $articles as $article }
<li>
{ $article .title}
<p>{ $article .name}</p>
<p>{ $article .content}</p>
</li>
{foreachelse}
<p>没有文章</p>
{/ foreach }
</ul>
|
for循环
for循环用于创建一个简单的循环,语法如下:
{for $variable = $startvalue to $entvalue step $step}
1
2
3
4
5
|
{ for $i = 0 to 10 step 2}
{ $i }
{ foreach }
不能进行循环
{/ for }
|
step可以不指定,默认循环的步长是1。for还可以指定一个max属性,max属性用于指定循环的次数
与foreach循环类似,for循环也有一个forelse。{forelse}在循环不能遍历的时候执行
while循环
smarty的while循环与php中的while循环类似,语法如下:
1
2
3
|
{ while $variable > 0}
//some
{/ while }
|
在循环中使用{break}可以停止循环,{continue}退出当前循环进入下一次循环
插件
smarty插件的实质是函数,插件的类型有三种,分别是function插件,modifier插件(变量调节插件),block插件
使用插件
function插件的使用:{funcname param1 = value...}
modifier插件的使用:{$variable | modifiername:param1...}
block插件的使用:
1
2
3
|
{blockname param1 = value...}
{ $content }
{/blockname}
|
如:
1
2
3
4
5
6
7
8
9
|
//function插件的使用
{ include file= 'header.tpl' }
//modifier插件的使用
{ 'abc' |cat: 'd' }
//block插件的使用
{textformat wrap = 10}
abc def
ghikj lmn
{/textformat}
|
制作插件
制作插件的方式有三种
1.使用registerplugin函数注册写好的自定义函数
2.将写好的插件放在smarty目录中的plugins目录里
3.php内置函数可以自动的以修饰插件(变量调节插件)的形式在模板中使用
使用registerplugin函数注册自定义插件,例子如下
在test文件夹下创建definefunc.php文件,内容如下:
1
2
3
4
5
6
7
8
9
10
|
<?php
require ( 'config.php' );
function test( $params ){
$p1 = $params [ 'p1' ];
$p2 = $params [ 'p2' ];
return $p1 . $p2 ;
}
$smarty ->registerplugin( 'function' , 'f_test' , 'test' );
$smarty ->display( 'definedfunc.tpl' );
?>
|
在tpl文件夹下创建一个definefunc.tpl文件,内容如下:
{f_test p1='learn' p2=' smarty'}
registerplugin函数的第一个参数说明注册的这段程序的类型,在这里是function说明注册的是一个function插件,还可以取得值有block和modifier,第二个参数指注册的smarty function插件名,第三个参数指自定义函数名,第二个参数和第三个参数可以相同。
在smarty中当执行到{f_test p1='learn' p2=' smarty'}时,p1和p2会被打包成一个数组传递到我们定义的test函数中去。
通过网plugins文件夹中添加文件的方式制作插件
1.制作function插件
在plugins文件夹下创建一个function.test.php文件(function表示这个一个function插件,test表示插件名),内容如下:
1
2
3
4
5
6
7
|
function smarty_function_test( $params ){
//$params是一个关联数组
$w = $params [ 'w' ];
$h = $params [ 'h' ];
return $w * $h ;
}
?>
|
在模板中直接使用test function插件
{test h = 3 w = 5}
这两个参数会被打包成一个数组传递到smarty_function_test函数中
2.制作modifier插件
在plugins文件夹下创建一个modifier.test2.php文件(modifier表示这个一个modifier插件,test2表示插件名),内容如下:
1
2
3
|
function smarty_modifier_test2( $utime , $formate ){
return date ( $formate , $utime );
}
|
在模板中使用test2 modifier插件
{$time|test2:'y-m-d h-i-s'}
定义modifier插件和function插件有所不同,function插件的自定义函数只接收一个数组参数,modifier插件的自定义函数
将接收到的参数一一列举出来
3.制作block插件
在plugins文件夹下创建一个block.test3.php文件(block表示这个一个block插件,test3表示插件名),内容如下:
1
2
3
4
5
6
7
8
9
10
|
function smarty_block_test3( $params , $content ){
$replace = $params [ 'replace' ];
$maxnum = $params [ 'maxnum' ];
if ( $replace == 'true' ){
str_replace ( ',' , ',' , $content );
str_replace ( '。' , '.' , $content );
}
$content = substr ( $content ,0, $maxnum );
return $content ;
}
|
在模板中使用test3 block插件
1
2
3
|
{test3 replace= 'true' maxnum = 6}
abcdfedddderere
{/test3}
|
{test3}{/test3}之间的内容传递到smarty_block_test3中的第二个参数中,test3后跟着的参数打包成一个数组传递到smarty_block_test3中的第一个参数中。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!
原文链接:http://www.cnblogs.com/QxQstar/p/6426160.html