Smarty概述
1.Smarty是什么?
Smarty是一种从程序逻辑层(php)抽出外在(html/css)描述的PHP框架,这意味着php代码只负责逻辑应用,从外在描述中分离了出来。
2.Smarty的设计理念?
(1)抛弃应用程序中php与其它语言杂揉的描述方式,使之统一样式;
(2)php负责后台,Smarty模版负责前端;
(3)向php致意,而不是取代它;
(4)程序员、美工能够快速开发部署;
(5)快速和易于维护;
(6)语法简单、容易理解,不必具备php知识;
(7)客户在开发中富有弹性;
(8)安全:从php独立出来;
(9)免费,开源。
3.为什么要分离HTML和PHP?
(1)语法:模版由像 html 一样的语义标记构成。php语法在应用程序中运行得很好,
但一旦与 html 结合则迅速恶化。Smarty简单的{tag}语法专门为外在描述而设计。Smarty专于模版表现而少于“代码”,这可以加快模版开发同时易于维护。Smarty语法无须懂得php知识,它对程序员与非程序员都是直观的。
(2).隔离:当php与模版混合,就没有了何种逻辑类型可以注入到模版的限制。Smarty从php中独立出了模版,创建了一种从业务逻辑中分离外在表现的控制。Smarty同样具有安全特性,能够进一步加强模版的约束。
4.Smarty的工作方式
在引擎中,Smarty将模版“编译”(基于复制和转换)成php脚本。它只发生一次,当第一次读取模版的时候,指针前进时调取编译版本,Smarty帮你保管它,因此,模版设计者只须编辑 Smarty 模版,而不必管理编译版本。这也使得模版很容易维护,而执行速度非常快,因为它只是php。当然,php脚本也利用了诸如APC的缓存。
5.从Smarty3.1.28开始就全面支持PHP7了。
6.学习Smarty需要有[PHP核心基础篇][PHP核心进阶篇][PHP面向对象基础]。
Smarty安装与配置
一.工作流程图
1.PHP 程序和模版互相赋值调用;
2.判断是否有编译文件,如果编译文件里没有它们之间的编译文件会经过Smarty引擎解析生成编译文件;
3.如果有编译文件,直接访问编译文件;
4.然后输出编译文件的内容;
5.在输出时,如果开启的缓存功能,会生成一个静态缓存;
6.最后显示在浏览器端。
7.第二次访问时,会直接访问编译文件,然后输出,然后显示,跳过Smarty引擎编译
8.第二次访问时,如果缓存开启,会直接跳过编译文件,直接访问缓存文件(静态)。
二.安装方式
1.先创建一个目录叫:tpl,然后把smarty文件夹整体拖入;
2.删除demo目录,这个是一个演示目录,瘦身必删;
3.创建一个测试文件1.php,键入以下代码:
<?php //引入Smarty核心类文件 require 'smarty/libs/Smarty.class.php'; //实例化Smarty $smarty = new Smarty(); //给模版赋一个值传递过去 $smarty->assign('name', 'Mr.Wang'); //调用模版页面 $smarty->display('1.tpl');
此时,会报告一个错误:Smarty: Unable to load templates 'file:1.tpl'
5.在根目录下创建一个模版文件夹templates。
6.在templates目录下创建1.tpl文件,这个文件其实一个html文件,并键入以下代码:
//html5模版代码 <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>模版调用成功</title> </head> <body> </body> </html>
7.当你刷新页面时,页面出现了想要的结果,并在根目录下又自动创建了templates_c的编译文件夹,里面还有一个编译文件。至此,初步的安装就已经完毕了。
三.配置目录
1.我们并不喜欢Smarty默认的目录结构名称,我们可以通过字段属性重新设置。
举例:
创建1.php
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); //设置模版目录 $smarty->template_dir = 'view'; //设置编译目录 $smarty->compile_dir = 'compile'; //设置缓存目录 $smarty->cache_dir = 'cache'; //设置变量目录 $smarty->config_dir = 'config'; //是否开启缓存 $smarty->caching = false; $smarty->assign('name', 'Mr.Wang'); $smarty->display('1.tpl');
创建1.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>模版调用成功</title> </head> <body> {$name} </body> </html>
执行:http://192.168.3.62/tpl/1.php
Mr.Wang
2.可以把smarty配置代码放到根目录下的smarty.php中,分离调用。
创建smarty.php
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); $smarty->template_dir = 'view'; $smarty->compile_dir = 'compile'; $smarty->cache_dir = 'cache'; $smarty->config_dir = 'config'; $smarty->caching = false;
1.php调用smarty.php
<?php require 'smarty.php'; $smarty->assign('name', 'Mr.Wang'); $smarty->display('1.tpl');
Smarty分配变量
Smarty变量赋值的一些问题,包括普通变量、数组、对象。以及怎样控制分配变量的可见范围。
一.普通变量
1.一般性变量赋值。
举例:
创建2.php
<?php //引入smarty.php require 'smarty.php'; //给模版页赋值 $smarty->assign('name', 'Mr.Wang'); $smarty->display('2.tpl');
创建2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配变量</title> </head> <body> {*模版页取值{$name}*} 我的名字叫:{$name} </body> </html>
访问:http://192.168.3.62/tpl/2.php
我的名字叫:Mr.Wang
2.数组变量赋值。
举例1:
创建2.php
<?php //引入smarty.php require 'smarty.php'; //一个数值索引数组 $array = array('王西西', '诗诗', '尧尧', '西西'); //给模版页赋值 $smarty->assign('array', $array); $smarty->display('2.tpl');
创建2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配变量</title> </head> <body> {*可以用中括号取值*} 你的名字:{$array[0]} {*也可以用.符号取值*} 我的名字:{$array.1} </body> </html>
访问:http://192.168.3.62/tpl/2.php
你的名字:王西西 我的名字:诗诗
举例2:
创建1.php
<?php //引入smarty.php require 'smarty.php'; //一个字符串索引数组 $stringArray = array('苹果'=>'iphoneX', '小米'=>'mix', 'meizu'=>'pro6s'); //给模版页赋值 $smarty->assign('stringArray', $stringArray); $smarty->display('2.tpl');
创建2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配变量</title> </head> <body> {*可以使用中括号,需要单引号*} 苹果最新产品:{$stringArray['苹果']} {*.符号中文不支持*} 魅族最新产品:{$stringArray.meizu} </body> </html>
访问:http://192.168.3.62/tpl/2.php
苹果最新产品:iphoneX 魅族最新产品:pro6s
3.对象赋值
创建Test.class.php
<?php //一个类 class Test { public $name = 'test'; public function run() { return 'running...'; } }
创建2.php
<?php //引入smarty.php require 'smarty.php'; require 'Test.class.php'; //实例化这个类 $test = new Test(); //给模版赋值这个对象 $smarty->assign('obj', $test); $smarty->display('2.tpl');
创建2.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>分配变量</title> </head> <body> {*输出字段和方法*} {$obj->name} {$obj->run()} </body> </html>
访问:http://192.168.3.62/tpl/2.php
test running...
二.变量范围
1.使用createData方法可以控制是否在模版中可见变量。
创建3.php
<?php require 'smarty.php'; //创建数据对象 $data = $smarty->createData(); //在数据对象作用域下分配变量 $data->assign('name', 'Mr.Lee'); //只有把这个对象分配到模版中,才能可见变量 $smarty->display('3.tpl', $data);
创建3.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>变量范围</title> </head> <body> 我的名字叫:{$name} </body> </html>
访问:http://192.168.3.62/tpl/3.php
我的名字叫:Mr.Wang
2.使用createTemplate方法可以控制在哪个模版中可见变量。
创建4.php
<?php require 'smarty.php'; //设置要控制的模版文件 $tpl = $smarty->createTemplate('4.tpl'); //给这个模版文件分配变量 $tpl->assign('name', 'Mr.Wang'); //引入模版 $smarty->display($tpl);
创建4.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>变量范围</title> </head> <body> 我的名字叫:{$name} </body> </html>
访问:http://192.168.3.62/tpl/4.php
我的名字叫:Mr.Wang
Smarty保留变量
一.请求变量
1.使用{smarty.get.xxx}来获取get请求变量。
创建5.php
<?php session_start(); require 'smarty.php'; $smarty->display('5.tpl');
创建5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留变量</title> </head> <body> {*/?page=1则可以获取到*} {$smarty.get.page} </body> </html>
执行:http://192.168.3.62/tpl/5.php?page=1
1
2.使用{smarty.post.xxx}来获取post请求变量。
创建5.php
<?php
session_start(); require 'smarty.php'; $smarty->display('5.tpl');
创建form.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="5.php" method="post"> 姓名:<input type="text" name="user"><input type="submit" value="提交"> </form> </body> </html>
创建5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留变量</title> </head> <body> {*表单post提交则可以获取到*} {$smarty.post.user} </body> </html>
访问:http://192.168.3.62/tpl/form.html点击提交的内容会返回这个内容
3.使用{smarty.cookies.xxx}来获取cookie请求变量。
创建5.php
<?php session_start(); require 'smarty.php'; setcookie('name', 'Mr.Wang'); $smarty->display('5.tpl');
创建5.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留变量</title> </head> <body> {*获取一个cookie值*} {$smarty.cookies.name} </body> </html>
访问:http://192.168.3.62/tpl/5.php
Mr.Wang
4.使用{$smarty.session.xxx}来获取session请求变量。
创建6.php
<?php session_start(); require 'smarty.php'; $_SESSION['admin'] = '西西'; $smarty->display('6.tpl');
创建6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留变量</title> </head> <body> {*获取一个session值*} {$smarty.session.admin} </body> </html>
访问:http://192.168.3.62/tpl/6.php
西西
5.使用{$smarty.env.xxx}来获取env的环境变量。
6.使用{$smarty.server.xxx}来获取server的环境变量
smarty还有一个request的获取方式,是联合了上面几种,智能获取。当然,由于安全性的隐患,这种方式不推荐。
二.保留变量
1.使用{$smarty.now}来获取当前时间戳。
//获取当前时间戳
{$smarty.now}
2.使用{$smarty.contst.xxx}获取常量值。
创建7.php
<?php session_start(); require 'smarty.php'; define('PI', 3.14); $smarty->display('7.tpl');
创建7.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>保留变量</title> </head> <body> {*获取常量*} {$smarty.const.PI} </body> </html>
访问:http://192.168.3.62/tpl/7.php
3.14
3.使用{$smarty.current_dir}获取模版目录名
//获取当前的模版目录名
{$smarty.current_dir}
4.使用{$smarty.version}获取smarty版本信息。
//获取smarty版本信息
{$smarty.version}
Smarty基本语法
Smarty基本语法的一些问题,包括注释、变量、函数和运算等等
一.基本语法
1.Smarty注释功能。
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <!--我是HTML注释,但是不会在编译中消失--> {*我是smarty注释,编译后会自动消失*} </body> </html>
2.忽略Smarty解析。
//让smarty变量原样输出 <!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {literal} {$name} {/literal} </body> </html>
执行原样输出:http://192.168.3.62/tpl/6.php
{$name}
3.可以直接使用函数。
//直接使用函数
{time()}
4.可以做运算。
//变量做加法运算
创建6.php
<?php require 'smarty.php'; $smarty->assign('x', 5); $smarty->assign('y', 8); $smarty->display('6.tpl');
创建6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {$x + $y} </body> </html>
执行:http://192.168.3.62/tpl/6.php
13
5.也可以直接在模版声明变量和输出。
创建6.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*声明变量*} {$name = 'Mr.Wang'} {*输出*} {$name} {*数组也可以在模版声明*} {$array = array(1, 2, 3)} {*输出*} {$array[0]} </body> </html>
执行:http://192.168.3.62/tpl/6.php
Mr.Wang1
Smarty变量调节器
一.变量调节器
1.英文单词首字母大写
//每个英文单词首字母大写
{$string|capitalize}
//包含数字的英文字母,首字母和数字后第一个字母大写
{$string|capitalize:true}
2.英文单词全部大写
//大写
{$string|upper}
3.英文单词全部小写
//小写
{$string|lower}
4.字符串连接
//连接字符串
{$string|cat:' Yes!'}
5.设置字符行宽
//设置 10 个字符换行,默认换行为\n,如果不是 10,则默认 80
{$string|wordwrap:10}
//换行使用<br>
{$string|wordwrap:10:'<br>'}
6.设置换行
//将\n 或换行设置成<br>
{$string|nl2br}
7.将 HTML 实体转义
//转义字符串
{$string|escape}
8.反转义
//反转义字符串
{$string|unescape}
9.去除多余空格
//去除多余空格
{$string|strip}
//去除多余空格并用 代替空格
{$string|strip:' '}
10.清楚标记
//清除 HTML 标记
{$string|strip_tags}
//false 去除多余空格
{$string|strip_tags:false}
举例:
创建7.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a <music> <strong>tea2cher</strong>!"); $smarty->display('7.tpl');
创建7.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*1.每个英文单词首字母大写*} {$string|capitalize} <br> {*2.英文单词全部大写*} {$string|upper} <br> {*3.英文单词全部小写*} {$string|lower} <br> {*4.连接字符串*} {$string|cat:' Yes!'} <br> {*5.设置10个字符换行,默认换行为\n,如果不是10,则默认8*} {$string|wordwrap:10:'<br>'} <br> {*6.将\n 或换行设置成<br>*} {$string|nl2br} <br> {*7.将HTML实体转义*} {$string|escape} <br> {*8.反转义字符串*} {$string|unescape} <br> {*9.去除多余空格*} {$string|strip:' '} <br> {*10清除HTML标记*} {$string|strip_tags} </body> </html>
执行:http://192.168.3.62/tpl/7.php
This Is A ≪Music≫ tea2cher!
THIS IS A <MUSIC> TEA2CHER!
this is a <music> tea2cher!
this is a <music> tea2cher! Yes!
this is a
<music>
tea2cher!
this is a <music> tea2cher!
this is a <music> <strong>tea2cher</strong>!
this is a tea2cher!
this is a <music> tea2cher!
this is a <music> tea2cher !
11.计算字符的数量
//获取字符数量
{$string|count_characters}
//将空格也算进去
{$string|count_characters:true}
12.计算字符段落
//就是字符的段落数
{$string|count_paragraphs}
13.就是字符句数
//换行+结束符号算一个句子
{$string|count_sentences}
14.计算词数
//单词的数量
{$string|count_words}
15.格式化时间
//将时间戳格式化成日期时间
{time()|date_format}
//添加参数,更加利于理解
{time()|date_format:'Y-m-d H:i:s'}
16.默认值
//但数据为空时,设置一个默认值
{$string|default:'没有数据'}
17.缩进
//默认缩进是空格,改成 产生页面效果
{$string|indent:10:' '}
18.在字符之间插空
//在每个字符之间插一个空格
{$string|spacify}
//在买个字符之间插入一个指定的字符
{$string|spacify:'&'}
19.格式化
//小数点保留 2 位
{'45.678'|string_format:'%.2f'}
20.截取字符串
//10 位后截取,自动添加...(含三个点共 10 位),默认 80
{$string|truncate:10}
//10 位后截取,没有添加...
{$string|truncate:10:true}
//整体保留 10 位,头尾保留,中间裁剪
{$string|truncate:10:'...':true:true}
创建8.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a teacher!"); $smarty->display('8.tpl');
创建8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*11.获取字符数量*} {$string|count_characters} <br> {*11.将空格也算进去*} {$string|count_characters:true} <br> {*12.就是字符的段落数*} {$string|count_paragraphs} <br> {*13.换行+结束符号算一个句子*} {$string|count_sentences} <br> {*14.单词的数量*} {$string|count_words} <br> {*15.将时间戳格式化成日期时间*} {time()|date_format:'Y-m-d H:i:s'} <br> {*16.数据为空时,设置一个默认值*} {$string|default:'没有数据'} <br> {*17.默认缩进是空格,改成 产生页面效果*} {$string|indent:10:' '} <br> {*18.在每个字符之间插入一个指定的字符*} {$string|spacify:'&'} <br> {*19.小数点保留2位*} {'45.678'|string_format:'%.2f'} <br> {*20.10位后截取,自动添加___(含三个_共10位),默认80*} {$string|truncate:10:'___'} <br> {*20.10位后截取,自动添加三个空格(含三个空格共10位),默认80*} {$string|truncate:10:''} <br> {*20.整体保留10位,头尾保留,中间裁剪*} {$string|truncate:10:'...':true:true} <br> </body> </html>
执行:http://192.168.3.62/tpl/8.php
15
18
1
1
4
2018-03-01 10:14:56
this is a teacher!
this is a teacher!
t&h&i&s& &i&s& &a& &t&e&a&c&h&e&r&!
45.68
this is___
this is a
thi...er!
二.组合调节器
顾名思义,即多个调节器作用于变量。
//多个调节器用|号隔开即可
{$string|truncate:10|indent:10:' '}
创建8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*多个调节器用|号隔开即可*} {$string|truncate:10|indent:10:' '} </body> </html>
执行:http://192.168.3.62/tpl/8.php
this is...
Smarty的内置函数功能
一.内置函数
1.使用{$var=...}来创建一个变量。
//在模版中创建变量
{$name = 'Mr.Lee'}
//输出变量
{$name}
2.使用{assign}来为变量赋值。
//这又是一种创建变量方式
{assign var='name' value='Mr.Lee'}
//输出
{$name}
3.使用{append}来创建数组变量。
//value 表示值,index 表示字符串索引
{append var='name' value='Mr.' index='first'}
{append var='name' value='Lee' index='last'}
//输出
{$name.first}
4.使用{literal}来避免模版解析。
//避免模版解析
{literal}
{$name}
{/literal}
5.左右花括号转义
//直接输出左右花括号
{ldelim}{rdelim}
6.加载其它模版页面
//加载一个模版页面
{include file='hr.tpl'}
7.清除标记中的空格
//清除空格和换行
{strip}
<table>
<tr>
<td>1</td>
</tr>
</table>
{/strip}
8.加载配置文件
举例:
创建配置文件web.conf
webname='淘宝' keywords='购物_低价' [base] name='Miss.Wang';
创建1.php
<?php require 'smarty.php'; $smarty->assign('string', "this is a teacher!"); $smarty->display('1.tpl');
创建1.tpl配置文件全局变量加载方式
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*加载配置文件*} {config_load file='web.conf'} {*输出配置文件全局变量*} {#webname#},{#keywords#} </body> </html>
打印输出:http://192.168.3.62/tpl/1.php
淘宝,购物_低价
创建1.tpl节点块全局变量输出方式
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*加载节点块*} {config_load file='web.conf' section='base'} {*输出节点块全局变量*} {#name#} </body> </html>
打印输出:http://192.168.3.62/tpl/1.php
Miss.Wang
9.在模版中使用if条件语句
//简单的if语句
{if $name=='Mr.Lee'}
找到此人
{/if}
//else
{if $name=='Mr.Lee'}
找到此人
{else}
找不到此人
{/if}
注意:除了简单的if语句也可以加入elseif和else。只不过复杂的逻辑判断,不太推荐在模版端进行了
10.使用while循环语句
//表达式和if一样
{while $num < 10}
{$num++}
{/while}
11.使用for循环语句
//for 循环
{for $i = 1 to 10}
{$i}
{/for}
12.使用foreach遍历
//数组赋值
$smarty->assign('array', array('red', 'green', 'blue'));
//简单的遍历数组
{foreach $array as $value}
{$value}
{/foreach}
//打印出索引值
{foreach $array as $key=>$value}
{$key}->{$value}
{/foreach}
//关联数组
$smarty->assign('array',
array('btx'=>'red', 'opd'=>'green', 'wya'=>'blue'));
//另一种索引值获取方式,Smarty3 新语法
{foreach $array as $value}
{$value@key}
{/foreach}
//获取从0开始的索引,即使是关联数组,也会获取数值索引
{foreach $array as $value}
{$value@index}
{/foreach}
//获取从 1 开始的迭代值,不是索引
{foreach $array as $value}
{$value@iteration}
{/foreach}
//获取第一个元素
{foreach $array as $value}
{if $value@first}
{$value}
{/if}
{/foreach}
//获取最后一个元素
{foreach $array as $value}
{if $value@last}
{$value}
{/if}
{/foreach}
//判断数组是否有输出
{foreach $array as $value}
{$value}
{/foreach}
//可以在外部
{$value@show}
//获取数组元素总数
{foreach $array as $value}
{$value}
{/foreach}
//遍历内部或外部均可
{$value@total}
//终止迭代
{foreach $array as $value}
{if $value == 'green'}
{break}
{/if}
{$value}
{/foreach}
//终止当前迭代
{foreach $array as $value}
{if $value == 'green'}
{continue}
{/if}
{$value}
{/foreach}
//如果没有数据的情况下
{foreach $array as $value}
{$value}
{foreachelse}
没有数据
{/foreach}
13.使用section来遍历数组
{foreach}可以做{section}能做的所有事,而且语法更简单、更容易。它通常是循环数组的首选。
{section}循环不能遍历关联数组,(被循环的)数组必须是数字索引,像这样(0,1,2,...)。对于关联数组,请用{foreach}循环。
终上所述:推荐使用foreach,而section的一些foreach没有的功能其实都应该在PHP程序下编写而不是在模版中。
1.简单的遍历
//索引数组,关联数组无法获取
$smarty->assign('array', array('red', 'green', 'blue'));
//遍历
{section loop=$array name=value}
{$array[value]}
{/section}
2.未分配变量的遍历
//输出 10,12,14,16,18
{section start=10 loop=20 step=2 name=value}
{$smarty.section.value.index}
{/section}
Smarty的自定义函数功能
一.自定义函数
1.计数函数
//默认从1开始,每次累加1
{counter}
{counter}
{counter}
{counter}
{counter}
//设置开始数字,步长和递增递减,从中间设置或多次设置也可以
{counter start=3 skip=2 direction=up}
//设置不输出
{counter print=false}
//设置为变量值输出
{counter assign=a}
{$a}
2.交替使用一组值
//通过复制多行一下单元格,可以交替三种背景,实现斑马效果
<td style="background:{cycle values='#eee,#ccc,#fff'}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
//重置交替
{cycle reset=true}
//values 改变分割符号
{cycle delimiter='|' values='#eee|#ccc|#fff'}
//是否让当前这条不交替到下一个值
{cycle advance=false}
剩下的一些属性:print、assign等常规属性,不再演示。
3.变量的另一种函数形式
//模版变量
{eval var=$name}
//配置文件变量,可以使用assign分配一个新变量名
{eval var=#webname# assign=c}
4.引入其他文件的源代码
//引入其他源代码,可以使用assign赋值给变量
{fetch file='http://www.baidu.com'}
5.电子邮件生成
//使用电子邮件功能
{mailto address='bnbbs@163.com'}
//邮件连接的文字和邮件的主题设置
{mailto address='bnbbs@163.com' text="我的邮箱" subject="一封家书"}
6.计算功能
//最终得到0
{math equation='x+y' x=20 y=30}
//数值格式化
{math equation='x+y' x=20 y=30 format='%.2f'}
注意:{math}函数性能较低,不推荐使用。还有一个{textformat}文字格式化,比如缩进换行之类的,也没什么用,都是 CSS 控制。
7.开启调试模式
//开启
{debug}
二.自定义函数
1.使用{html_checkboxes}创建复选框。
举例:
创建8.php
<?php require 'smarty.php'; //先创建一个数组 //先创建一个数组 $smarty->assign('array', array( '测试1'=>'东东', '测试2'=>'南南', '测试3'=>'西西', '测试4'=>'北北' )); //设置首选值,先设置一个首选变量 $smarty->assign('id', '测试2'); $smarty->display('8.tpl');
创建8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {*模版载入数组,options属性可以将索引作为value值作为作为text*} {html_checkboxes options=$array} {*如果设置value和text均为数组的元素值,或者两个数组分别设置*} {html_checkboxes values=$array output=$array} {*name属性可以设置name名称*} {html_checkboxes options=$array name="user"} {*模版设置首选项*} {html_checkboxes options=$array selected=$id} {*去除默认的label*} {html_checkboxes options=$array labels=false} {*添加分隔符,比如<br>换行*} {html_checkboxes options=$array labels=false separator='<br>'} </body> </html>
2.使用{html_radios}创建单选框。
//模版处,其它属性和复选框一致
{html_radios options=$array checked=$id}
3.使用{html_options}创建select下拉列表选项。
//option的列表,还包含name、values、output这几个属性
<select>
{html_options options=$array selected=$id}
</select>
//实现optgroup群组下拉
举例:创建8.php
<?php require 'smarty.php'; $smarty->assign('id', '测试4'); $smarty->assign('array2', array( 'a'=>array( '测试1'=>'111', '测试2'=>'222', '测试3'=>'333', ), 'b'=>array( '测试4'=>'444', '测试5'=>'555', '测试6'=>'666' ) )); $smarty->display('8.tpl');
创建8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <select> {html_options options=$array2 selected=$id} </select> </body> </html>
4.使用{html_select_date}创建日期
//通过属性设置,调整时间
{html_select_date month_format='%m' start_year='1999'
end_year='2016' field_order='YMD'}
5.使用{html_select_time}创建时间
{html_select_time}
Smarty的缓存功能
一.页面缓存
1.先使用数据库加载一组数据。
//PDO 数据库连接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456'); //设置字符集 $pdo->query('SET NAMES UTF8'); //得到准备对象 $stmt = $pdo->prepare("SELECT * FROM one"); //执行SQL语句 $stmt->execute(); //初始化 $object = []; //组装数据列表 while ($rows = $stmt->fetchObject()) { $object[] = $rows; } $smarty->assign('object', $object); $smarty->display('8.tpl');
输出显示8.tpl
<!doctype html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>使用缓存</title> </head> <body> {*输出显示*} <table border="1"> <tr> <th>姓名</th> <th>数学</th> <th>语文</th> <th>外语</th> </tr> {foreach from=$object item=obj} <tr> <td>{$obj->user}</td> <td>{$obj->math}</td> <td>{$obj->chinese}</td> <td>{$obj->english}</td> </tr> {/foreach} </table> </body> </html>
暴露问题:这张数据表,可能很长时间不会有所改动,比如一天,一周,一个月都不会改动。但是,用户每次访问,都要经过数据库,造成性能上的极大浪费。这时,我们想通过缓存技术,将第一次生成的页面静态化,然后以后就访问这个静态页面,从而避免执行数据库操作。
2.开启缓存
第一步:在配置文件smarty.php里开启缓存设置
<?php require 'smarty/libs/Smarty.class.php'; $smarty = new Smarty(); $smarty->template_dir = 'view'; $smarty->compile_dir = 'compile'; //缓存目录 $smarty->cache_dir = 'cache'; $smarty->config_dir = 'config'; //开始缓存true $smarty->caching = true; //建立缓存周期 $smarty->cache_lifetime = 3600; $smarty->left_delimiter = '{'; $smarty->right_delimiter = '}';
刷新页面后,会自动生成cache目录。并生成了一个静态页面,下次访问是会访问这个静态页面。不会因为数据库数据改变,而发生变化。但是,这个地方还是有问题的,虽然访问的是静态页面。但并没有说,不执行PHP连接数据库,执行数据库这个步骤,所以,我们还需要进行静态页面的判断工作。
3.判断缓存
第二步:if判断8.tpl缓存是否存在
<?php require 'smarty.php'; //判断缓存存在的话,就不执行PHP的数据库链接和操作 if (!$smarty->isCached('8.tpl')) { //PDO 数据库连接 $pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456'); //设置字符集 $pdo->query('SET NAMES UTF8'); //得到准备对象 $stmt = $pdo->prepare("SELECT * FROM one"); //执行SQL语句 $stmt->execute(); //初始化 $object = []; //组装数据列表 while ($rows = $stmt->fetchObject()) { $object[] = $rows; } $smarty->assign('object', $object); }
$smarty->display('8.tpl');
先判断缓存是否存在,然后再执行PHP代码(包括执行数据库连接和执行)。如果存在缓存,就直接忽略PHP代码部分,直接读取缓存,这样避免数据库执行浪费。
二.局部不缓存
1.使用{nocache}...{/nocache}让局部不缓存。
{nocache}
{$smarty.now|date_format:"Y-m-d H:i:s"}
{/nocache}
2.如果不缓存的内容本身是标签,可以在标签后直接加上nocache即可。
{$smarty.now|date_format:"Y-m-d H:i:s" nocache}