5. Smarty基本语法

注释

{* 注释内容 *}

输出

比如,现在php文件中有一个数组,并且用assign方法赋值给了一个模板文件test.tpl

$arr=array('title'=>'smarty的学习', 'author'=>'小明')
$smarty->assign('arr', $arr);```
然后我们在模板中输出:

{$arr.title} // 方法一
{$arr['title']} // 方法二```

变量调节器

变量调节器,写在变量后面,用竖线|隔开。

1 - 首字母大写 capitalize
示例:{$articleTitle|capitalize}
php文件:

$smarty->assign('articletitle', 'i ate an apple');
$smarty->display('test.tpl');```
tpl文件:```{$articletitle|capitalize}```
输出:```I Ate An Apple```

**2 - 字符串连接 cat**
示例:```{$articleTitle|cat:"yesterday."}```
php文件:

$smarty->assign('articletitle', 'i ate an apple ');
$smarty->assign('yesterday', 'yesterday');
$smarty->assign('point', '.');
$smarty->display('test.tpl');tpl文件:{$articletitle|cat:"yesterday.":"point"}```
输出:i ate an apple yesterday.

3 - 日期格式化 date_format
示例:{$yesterday|date_format}
{$yesterday|date_format:" :"}
php文件:

$smarty->assign('time', time());  //time()为php内置函数,用于获取unix格式的时间
$smarty->display('test.tpl');```
tpl文件:```{$time|date_format}```
输出:`Feb 07, 2017`
or
tpl文件:```{$time|date_format:"%B %e, %Y %H:%M:%S"}```
输出:`Feb 07, 2017 08:05:08  //注意:时间不对是因为没有设置时区,当前时间为格林威治时间`

**4 - 为未赋值或为空的变量指定默认值default**
示例:```{$articleTitle|default:"no title"}```
php文件:

$smarty->assign('articletitle', ' ');
$smarty->display('test.tpl');tpl文件:{$articletitle|default:"no title"}```
输出:no title

5 - 转码 escape
用于html转码,url转码,在没有转码的变量上转换单引号,十六进制转码,十六进制美化,或者js转码。more为html转码。
php文件:

$smarty->assign('url', 'www.chuying-he.com');
$smarty->display('test.tpl');```
tpl文件:```{$url|escape:"url"}  //escape:后面跟着的是转码方式```
输出:`www.chuying-he.com`

**6 - 小写 lower 大写 upper**
将变量字符串小 / 大写
示例:
```{$articletitle|lower}```
```{$articletitle|upper}```
php文件:

$smarty->assign('articletitle', 'Happy New Year');
$smarty->display('test.tpl');```
tpl文件:

{$articletitle|lower}
<br/>
{$articletitle|upper}```
输出:

happy new year
HAPPY NEW YEAR


**7 - 将所有换行符替换成<br/> nl2br**
将所有换行符替换成<br/>,与PHP中的nl2br()函数一样
示例:```{$articletitle|nl2br}```
php文件:

$smarty->assign('articletitle', 'Happy
New
Year');
$smarty->display('test.tpl');```
tpl文件:

{$articletitle|nl2br}```
输出:

Happy
New
Year


**8 - 其他函数**
可参见手册,但原则上应该通过php或者CSS直接处理完毕,在赋值到Smarty中,尽量少用Smarty函数


##Smarty的条件判断语句
Smarty中,```eq```表示```==```,```neq```表示```!=```,```gt```表示```>```,```lt```表示```<```,

{if isset($name) && $name == 'Blog'}
{* do something }
{elseif $name == $foo}
{
do something *}
{/if}


##Smarty的循环语句
**第一种循环 section**
```{section}```, ```{sectionelse}``` 是Smarty的内置函数,详细文档点击[这里](http://www.smarty.net/docs/zh_CN/language.function.section.tpl)。
php文件:

$articlelist=array(
array(
"title" => "My first article",
"author" => "Alex",
"content" => "I'm a web developer."
),
array(
"title" => "Work Note",
"author" => "John Doe",
"content" => "Where is my home?"
)
)
$smarty->assign("articlelist", $articlelist);
$smarty->display("test.tpl");

tpl文件:

{section name=article loop=$articlelist}
{$articlelist[article].title}
{$articlelist[article].author}
{$articlelist[article].content}
<br />
{/section}

输出:

My first article Alex I'm a web developer.
Work Note John Doe Where is my home?```

第二种循环 foreach
{foreach} {foreachelse}用于循环数组,语法上比{section}更加简单清晰,并且可以使用非数字下标。

php文件:同上
tpl文件:

{foreach item=article from=$articlelist}
      {$article.title}
      {$article.author}
      {$article.content}
<br/>
{foreachelse}
NOTHING IN ARRAY
{/foreach}

输出:同上
注意:{foreachelse}后面的内容会在当前数组中没有内容时显示

Smarty的文件引用

在PHP中,有两种引入方式:includerequire。在Smarty中只有include这一种。把别的模板引入进来。

语法:{include file='page_header.tpl' sitename="sugar"}
解释:file为要导入的模板名,sitename中的值会传递到page_header.tpl里面去,要注意的是,sitename这个值 能且只能page_header.tpl里面使用。假如page_header.tpl中有同名变量,该变量值会被sitename的值替代

Smarty类和对象的赋值与使用

assign除了能赋值一个变量 or 数组,还能把一个类的对象以变量的形式赋值到smarty的模板当中去。
php文件:

class My_Object{
    function methl($params){
        return $params[0].' is already '.$params[1];
    }
}

$myobj=new My_Object;
$smarty->assign('myobj',$myobj);  // 将对象$myobj传入test.tpl模板的名为'myobj'的对象中
$smarty->display('test.tpl');

tpl文件:

{$myobj->meth1(array('cake','done'))}  // 这里的$myobj是从php文件中传入的对象,该对象可使用类中的methl方法

输出:
cake is already done

Smarty函数的使用

尽管Smarty中有大量的变量调节器,也还是有用户希望使用其他方法,比如:
1. 使用php内置函数

使用php内置函数

php文件:

$smarty->assign('time', time());
$smarty->display('test.tpl');

tpl文件:

// date()为php的内置函数
// 第一次尝试:{$time|date("Y-m-d")};  
// ---- 注意:该写法被解释成:date这个函数有两个参数,第一个参数为$time,第二个参数为"Y-m-d" ----
// 而php的date方法应该是第一个参数为日期格式,第二个参数为unix时间戳,所以我们要变换顺序如下:

{"Y-m-d"|date($time)};  

输出:

2017-02-08```

**2. 使用自定义函数,并使用 ```registerPlugin``` 注册到smarty模板里面使用**
![使用 ```registerPlugin``` ](http://upload-images.jianshu.io/upload_images/2662224-27e613ab79acb6fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**注意**:```registerPlugin```的第一个参数除了function,还有modifier,block等,下面在smarty的插件制作中会详细讲到
php文件:

function test($params){
$p1=$params['p1'];
$p2=$params['p2'];
return 'the first para is '.p1.', the second para is '.p2;
}
// 第一个参数表示被注册程序的类型(plugin/modifier/block),第二个参数表示注册到smarty中后函数的名字,第三个参数表示要传入的参数名。
$smarty->registerPlugin('function', 'f_test', 'test');
$smarty->display('test.tpl');

tpl文件:

{f_test p1='abc' p2='edf'}; // {函数名 第一个参数 第二个参数} 即,将两个参数传送到函数f_test中

输出:
```the first para is abc, the second para is edf```


**3. 自定义插件**
在第一和第二种方法中,我们发现,在最终的模板调用函数的时候,方法不同,格式也不同,这是非常不友好的书写方式,为了解决该问题,我们需要一样新的东西:smarty插件。

*-------- 什么是插件 --------*
插件是遵循原来的系统主体接口的编写规范,编写出来的程序,它能够调用主系统的数据和函数库。他的好处是可执行力强,可重复利用率高,本身的增删改不影响主系统的结构。
Smarty中也提供了这种插件机制,能够在不改变smarty主程序的前提下,增加更多丰富的功能。 Smarty的本质其实是function函数,它的书写方式完全遵照php的函数语法。

*-------- Smarty插件类型 --------*
 - functions 函数插件
 - modifiers 修饰插件
 - block functions 区块函数插件

*-------- 插件制作方法 --------*
1. 使用```registerPlugin```方法注册写好的自定义函数(即方法2)
2. 将写好的插件放入Smarty解压目录的lib下的plugins目录中
3. php内置函数,可以作为修饰插件(变量调节器插件)的形式在模板中使用

*-------- 在```wamp/www/smarty/smarty/plugins```目录中,可以看到许多php文件 --------*
 - 以```function```开头类似```function.counter.php```为函数插件
 - 以```modifier```开头类似```modifier.capitalize.php```为修饰插件
 - 以```block```开头类似```block.textformat.php```为区块函数插件
注意:命名规则为```插件类型.插件名.php```

*--------  functions 函数插件举例 --------*

// 名为 function.test1.php 的函数插件
<?php
// 命名规则: smarty_function_插件名(要和文件中的插件名一样)
function smarty_function_test1($params){
$width = $params['width'];
$height = $param['height'];
$area = $width * $height;
return $area;
}
?>```

// test.php文件
$smarty->display('area.tpl');
// area.tpl 模板文件
//smarty对该语句的处理是:调用test函数,然后将两个参数放在一个数组里面传递到test函数中array('width'=>150, 'height'=>200)
{test1 width=150 height=200}

-------- modifier 函数插件举例 --------

// 名为modifier.test2.php的modifier插件
<?php
    // 命名规则: smarty_modifier_插件名(要和文件中的插件名一样)
    // 该modifier定义两个参数,第一个为unic时间戳,第二个为时间形式
    function smarty_modifier_test2($utime, $format){    
        return date($format, $utime);
    }
?>```

// test.php文件
$smarty->assign('time',time());
$smarty->display('datetime.tpl');```

// datetime.tpl 模板文件
{$time|test2:'Y-m-d H:i:s'}```

*--------  block 函数插件举例 --------*

// 名为block.test3.php的block插件
<?php
function smarty_block_test3($params, $content){
$replace=$params['replace'];
$maxnum=$params['maxnum'];
if($replace=='true'){
$content=str_replace(',', ',', $content); // 将中文的逗号替换成英文的逗号
$content=str_replace('。','.', $content); // 将中文的句号替换成英文的句号
}

    $content=substr($content, 0, $maxnum);
    return $content;
}

?>```

// test.php文件
$smarty->assign('str','Hello, my name is HanMeiMei。What is your name?');
$smarty->display('content.tpl');```

// content.tpl 模板文件
{test3 replace='true' maxnum=29}
{$str}
{/test3}```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容