1. Smarty3 笔记
  2. By 飞鸿影~
  3. -- ::

Smarty入门

1、什么是smarty?
Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,
使php程序员只专注于php代码的编写,网页美工只专注于网页的美化

2、采用模版引擎后:
1)php代码与html代码分离开了,php代码放在一个单独的php文件中,html代码放在一个单独的html文件中
2)数据的传递首现php中的数据先给了模版引擎,然后模版引擎再把接收到的数据给模版文件显示。
3)模版文件中不再有php代码或者说php标记的出现,模版中显示的数据都是通过模版引擎的标记显示出来的

  1. index.php -> smarty模版引擎 -> index.html

3、Smarty的优点:
1)速度快:相对于其它的模版引擎而言的
2)编译型:支持缓存技术,无需每次重新编译(在模版文件没有改动的情况下)
3)模版中可以使用流程控制语句。

4、Smarty模版引擎运作流程
①在php程序运行时,初始化smarty模版引擎
②smarty模版引擎读取模版文件(.html或tpl文件)
③在读取模版文件的时候,smarty模版引擎会自动判断该模版文件是否需要重新编译。
④如果不需要重新编译,则直接进行模版变量替换。
⑤如果是第一次执行此程序文件或者说模版被改动了,那么就需要重新编译后再进行模版变量替换。
⑥最终执行的是编译后的php文件。
⑦输出结果到浏览器。

5、如何获得Smarty:
到官方网站去下载smarty模版引擎压缩包
官网:http://www.smarty.net
解压后将libs目录拷贝至项目开发目录

6、搭建Smarty模板示例:
1)将libs库目录复制过来。
2)创建一个模板目录templates模板文件存放目录
创建一个configs配置文件目录
3)编写index.php文件(入口文件)做Smarty导入和创建;templates目录中新建index.html模板文件
++ index.php

  1. <?php
  2. require("libs/Smarty.class.php"); //导入Smarty类
  3. $smarty = new Smarty(); //创建对象
  4. $smarty->assign("name","zhangsan"); //向Smarty模板中分配变量name=zhangsan
  5. $smarty->display("index.html"); //使用index.html显示
  6. ?>

++ index.html

  1. <html>
  2. {$name}
  3. </html>

[小提示]
assign():主要用来将php中的标量类型的数据赋值给模版变量
display():主要用来显示指定的模版文件,可以指定路径

[模板中如何显示分配的变量?]
一般的变量,使用 {$var} 形式.例如我们这里分配的name=zhangsan,
我们在模板index.html中使用 {$name} 显示.
后面会讲述更多关于模板变量显示的内容.

4)使用浏览器访问index.php,将会创建目录templates_c和cache目录

5)最后的结构:

  1. 根目录
  2. |--libs //Smarty库
  3. | |--Smarty.class.php
  4. |--templates //模板目录
  5. | |--index.html
  6. |--templates_c //模板编译目录
  7. |--cache //模板静态缓存目录(注意需开启缓存)
  8. |--configs //配置文件目录
  9. |--index.php //php文件(入口)

6)其他可选配置项(不改即为默认值):

  1. //配置
  2. $smarty->debugging=false; //是否开启debug调试
  3. $smarty->template_dir="templates/"; //模板目录
  4. $smarty->compile_dir="templates_c/"; //编译目录
  5. $smarty->config_dir="configs/"; //配置项目录
  6. $smarty->cache_dir="cache/"; //缓存目录
  7. $smarty->caching=false; //是否开启缓存
  8. $smarty->cache_lifetime=3600; //缓存生命周期,单位是s
  9. $smarty->left_delimiter="{"; //左定界符
  10. $smarty->right_delimiter="}"; //右定界符

7、Smarty应用之模版变量
通常分配的变量有:字符串、数字、数组、对象
[例]2.php:

  1. $smarty->assign("title","Smarty模板引擎实例--变量输出");//字符串
  2. $smarty->assign("num",100);//数字
  3. $smarty->assign(array("name"=>"zhangsan","age"=>23));//多个值
  4. $smarty->assign("a1",array(10,20,30));//索引数组
  5. $smarty->assign("a2",array("name1"=>"zs","name2"=>"zs2"));//关联数组
  6. $smarty->assign("ob",new Demo());//对象,含有公共属性name和age,为了节约篇幅,这里省略了类

模板里访问分配的变量(templates/2.html):

  1. <h2>{$title}</h2>
  2. <ul>
  3. <li><a href="index.php">返回首页</a></li>
  4. <li>^_^{*注释的内容不会被输出*}</li>
  5. <li>输出一个数值:{$num},{$num*2}</li>
  6. <li>输出一个字符串:{$title},长度:{strlen($title)}</li>
  7. <li>输出一个数组里面的批量值:{$name},{$age}</li>
  8. <li>输出一个索引数组a1:{$a1[0]},{$a1[1]},{$a1[2]}</li>
  9. <li>输出一个关联数组a2:{$a2['name1']},{$a2['name2']}</li>
  10. <li>输出一个关联数组a2:{$a2.name1},{$a2.name2}</li>
  11. <li>输出一个对象:{$ob->name},{$ob->age}</li>
  12. </ul>

8、模板里php函数使用(一般是return有结果的函数才直接使用)
(templates/3.html):

  1. 当前时间{date("Y-m-d H:i:s")}
  2. 自定义函数:{fun()}

**其中自定义函数在3.php中是

  1. function fun(){
  2. return "hehe";
  3. }

9、模板里超全局变量使用(templates/4.html):

  1. <li>session中的信息:{$smarty.session.name}</li>
  2. <li>get中的信息:{$smarty.get.id}</li>
  3. <li>post中的信息:{$smarty.post.name}</li>
  4. <li>常量PI中的信息:{$smarty.const.PI}</li>

**当然,得提前在4.php中定义才行:

  1. $_SESSION['name']="admin";
  2. $_GET['id']=100;
  3. $_POST['name']="yjc";
  4. const PI=3.14;

更多还支持:
诸如  $_GET, $_POST,$_COOKIE, $_SERVER, $_ENV and $_SESSION   都可以使用 {$smarty.post.get} 类似
方法输出,记得改为小写

10、模板从configs/目录读取配置文件
模板里读取格式: {config_load file="lang.conf" section="en"} 
其中section为可选项,配置文件后缀一般是conf,ini等

举例说明配置文件格式(configs/user.conf)

  1. [users]
  2. username=zhangsan
  3. age=22

模板里使用配置文件定义的变量方法是:

  1. {$smarty.config.username}或者{#username#}
  2. {$smarty.config.age}或者{#age#}

11、模板里包含文件
例如包含当前目录下menu.html

  1. {include file="menu.html"}

12、模板里foreach遍历数组
Smarty3.0新版使用格式(与php原生的基本一样):

  1. {foreach $data as $key=>$value}
  2. {$value.name}
  3. {$value.age}
  4. {/foreach}

Smarty3.0同时兼容旧版使用方法:

  1. {foreach from=$data key="key" item="value"}
  2.  
  3. {/foreach}

[实践]
当然,我们可以连接数据库后,使用之前写的Model.class.php数据库操作类写一个学生信息管理系统.
通过使用switch,可以实现单个页面display多个页面,很类似ThnkPHP控制器的雏形.
大概思路:

  1. switch($_GET['a']){
  2. case "add"://添加信息表单
  3. $smarty->display("stu/add.html");
  4. break;
  5. case "insert"://执行添加信息
  6. break;
  7. case "edit"://修改信息表单
  8. $smarty->display("stu/edit.html");
  9. break;
  10. case "update"://执行更新信息
  11. break;
  12. case "del"://删除信息
  13. break;
  14. case "index":
  15. default://浏览信息
  16. $s->smarty("stu/index.html");
  17. }

Smarty高级

1、Smarty保留变量

  1. {$smarty.now} 当前时间戳,同{$time()}
  2. {$smarty.const} 输出系统已定义常量,后面加上常量名
  3. {$smarty.capture} 捕获标签{capture name="mycap"}一些内容{/capture}里的内容,这里使用{$smarty.capture.mycap}读取
  4. {$smarty.config} 读取配置文件(如my.conf)里变量,后面加变量名。等效{#变量名#}
  5. {$smarty.section} (后续课程模板继承里讲解)
  6. {$smarty.template} 当前模板名(不包括目录)
  7. {$smarty.current_dir} 当前模板目录
  8. {$smarty.version} 当前Smarty版本
  9. {$smarty.block.child} (后续课程模板继承里讲解)
  10. {$smarty.block.parent} (后续课程模板继承里讲解)
  11. {$smarty.ldelim}, {$smarty.rdelim} 输出当前左、右定界符

当然,在上一节内容,我们还学习了 {$smarty.get},{$smarty.post},{$smarty.session},{$smarty.cookie},{$smarty.server},{$smarty.env},{$smarty.request} 等PHP全局变量.

2、Smarty变量调节器

1)系统提供的调节器(*号标注表示使用较多.大部分使用频率不高,了解即可):

  1. *capitalize [首字符大写]
  2. cat [连接字符串]
  3. count_characters [字符计数]
  4. count_paragraphs [计算段数]
  5. count_sentences [计算句数]
  6. count_words [计算词数]
  7. *date_format [格式化日期]
  8. default [默认值]
  9. escape [转义]
  10. indent [缩进]
  11. lower [小写]
  12. *nl2br [换行符替换成 <br />]
  13. regex_replace [正则替换]
  14. *replace [替换]
  15. spacify [插空]
  16. string_format [字符串格式化]
  17. strip [去除(多余空格)]
  18. strip_tags [去除html标签]
  19. *truncate [截取]
  20. *upper [大写]
  21. wordwrap [行宽约束]

使用方法示例(2.html):

  1. <li>原字符串:{$str}</li>
  2. <li>首字母大写(有点用):{$str|capitalize}</li>
  3. <li>大写:{$str|lower}</li>
  4. <li>新闻:{$content|strip_tags|strip|truncate:0:20:"utf-8"}...</li>

2)自定义调节器(采用插件文件方式):
a)在smarty模板的libs/plugins/目录下创建调节器:
调节器文件名:modifier.调节器名.php

注意:若是自定义的的调节器不在libs/plugins/目录下,需要使用下面Smarty的方法追加。
如:  smarty->addPluginsDir("./libs/myplugins");//追加一个插件目录的方式 
注意清除编译缓存目录
b)在这个文件里的函数名:

  1. function smarty_modifier_调节器函数名(参数列表...){ //..... }

例如:

  1. /**
  2. * 自定义调节器:字符串截取函数
  3. * 参数:
  4. * $str:表示被截取的字符串
  5. * $len:保留字串的长度值。默认值:10
  6. */
  7. function smarty_modifier_mystr($str,$len=10){
  8. if(strlen($str)>$len){
  9. return substr($str,0,$len)."...";
  10. }else{
  11. return $str;
  12. }
  13. }

注意:在使用是,要按函数的参数顺序来。
c)使用 {$str|调节器名}

练习:自定义一个调节器: myfont($str,$size,$color) 
如: {$str|myfont:7:"red"}  =>输出:  <font size="7" color="red">$str</font>

3)自定义调节器(采用注册调节器方式):
除了上面的方法外还有一个方式可以定义一个变量的调节器
使用Smarty的一个方法: registerPlugin("modifier","调节器名", "被指定的函数名"); 
例如:

  1. $smarty->registerPlugin("modifier","mystrlen","strlen");//注册一个调节器的函数

使用:

  1. {$str|mystrlen} //输出str字串的长度

4)组合调节器:

  1. {$articleTitle}
  2. {$articleTitle|upper|spacify}
  3. {$articleTitle|lower|spacify|truncate}
  4. {$articleTitle|lower|truncate:30|spacify}
  5. {$articleTitle|lower|spacify|truncate:30:". . ."}

3、Smarty中的函数

(标注*号为实用的)

格式:

  1. {函数名 属性1="值1" 属性2="值2" }
  2. {/函数名}

1)内置函数

* {assign}  在模板中定义并变量,并赋值
示例:

  1. {assign var="name" value="Bob"}{assign "name" "Bob"} {* 简写 *}

* {$var=}  简写模板中定义变量(同assign),
示例:

  1. {$name='Bob'}{$user.name="Bob"}{$users[]="Bob"}

{append}  在模板执行期间建立或追加模板变量数组。
示例:对数组name追加成员值

  1. {append var='name' value='Bob' index='first'}

{function}  用来在模板中创建函数,可以像调用插件函数一样调用它们。
 {call}  用来调用{function}标签定义的模板函数
 {capture}  用来捕获模板输出的数据并将其存储到一个变量里,而不是将它们输出到页面。
* {config_load} 载入配置文件:用来从配置文件(位于configs目录)中加载config变量(#variables#)到模版。
示例:

  1. {config_load file="lang.conf" section="en"}

{debug}  显示调试控制台
* {for}  简单的循环
 {for} 标签用来创建一个简单循环,支持 {forelse} 分支标签且支持以下不同的格式:

  1. {for $var=$start to $end}步长为1的简单循环;
  2. {for $var=$start to $end step $step}其它步长循环。

示例:

  1. <ul>
  2. {for $foo=1 to 3}
  3. <li>{$foo}</li>
  4. {/for}
  5. </ul>

* {foreach},{foreachelse}

3.x版格式:

  1. {foreach $data as [$k=>]$v}
  2. //输出$k / $v
  3. {/foreach}

2.x版格式(仍然兼容)

  1. {foreach from=$data item="v" key="key"}
  2. {/foreach}

* {if},{elseif},{else}  
每一个{if}必须与一个{/if}成对出现,允许使用{else}和{elseif}。
所有php条件和函数在这里同样适用,诸如||、or、&&、and、is_array()等等。
例如:

  1. {if $name == 'Fred' || $name == 'Wilma'}
  2. ...
  3. {/if}

*{include} 包含其他模板
例如:

  1. {include file="header.html"}
  2. {include file="sider.html"}

{insert}标签类似于{include}标签,不同之处是即使打开caching,它所包含的内容也不会被缓存,每次调用模板都会执行.
该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域。

  1. {* 获取一个横幅广告示例 *}
  2. {insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

{block} 用来定义一个命名的模板继承源区域。
{extends} 标签用在模板继承中子模版对父模板的继承。

{ldelim},{rdelim} 用来转义模版定界符,默认值为"{"和"}"。
*{literal} 标签区域内的数据将按字面意思处理,代表性地是用在javascript/css语块周围
{nocache} 用来禁止模版块缓存,每个{nocache}应与{/nocache}成对出现。
{php},{include_php}已被Smarty弃用,不应再使用。还是用你自己编写的php脚本或插件函数来代替它吧!
*{section},{sectionelse}
{while}

2)Smarty扩展函数(Smarty自定义的,使用频率不高,了解即可)

  1. {counter}
  2. {cycle}
  3. {eval}
  4. {fetch}
  5. {html_checkboxes}
  6. {html_image}
  7. {html_options}
  8. {html_radios}
  9. {html_select_date}
  10. {html_select_time}
  11. {html_table}
  12. {mailto}
  13. {math}
  14. {textformat}

4、缓存

1)配置开启缓存

  1. $smarty = new Smarty;
  2. $smarty->caching = true;//开启缓存
  3. $smarty->cache_lifetime = 3600;//缓存开启1小时

一般不建议全站开启缓存,哪个页面需要就开启哪个。
所以,不要把缓存配置写在公共配置文件里

2)Smarty里缓存相关方法

  1. isCached() 检测模板是否具有有效缓存
  2. clearCache() 清除指定模板缓存
  3. clearAllCache() 清除整个模板缓存

3)使用情况示例
比如学生信息的增删查改操作,我们在查询时可以缓存:

  1. if(!$smarty->isCached("index.html")){
  2. $data=$m->select();
  3. $smarty->assign("data",$data);
  4. }
  5. $smarty->display("index.html");

对于增删改,我们不应该使用缓存,所以在执行相关操作成功后,应该清除缓存:

  1. if($res){
  2. $smarty->clearCache("index.html");
  3. }

但是这样还有个Bug,就是你不管修改哪个用户数据,进入edit页面,表单里数据不变。
那么这时候只能使用多级缓存了,用户修改页面就要这样写了:

  1. if(!$smarty->isCached("stu/edit.html",$_GET['id'])){
  2. $stu = $mod->find($_GET['id']);
  3. $smarty->assign("data",$stu);
  4. }
  5. $smarty->display("stu/edit.html",$_GET['id']);

那么update更新成功后应该清除两个缓存:

  1. $smarty->clearCache("index.html"); //清除浏览缓存
  2. $smarty->clearCache("edit.html",$_POST['id']); //清除修改表单缓存

Smarty3学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. NDK相关以及同步相关博客收集

    http://www.cnblogs.com/heiing/archive/2013/01/20/2868268.htmlhttp://blog.sina.com.cn/s/blog_461c24d5 ...

  2. C语言学习笔记(一)_hello world

    一.建立一个文件a.c,写入: #include <stdio.h> //使用printf库函数之前,必须include <stdio.h>int main()//main函数 ...

  3. iOS 设置button文字过长而显示省略号的解决办法

    UIButton * button =[UIButton buttonWithType:UIButtonTypeCustom];button.titleLabel.adjustsFontSizeToF ...

  4. IntelliJ IDEA 16 本地LicenseServer激活(破解)

    IntelliJ IDEA 16 本地LicenseServer激活(破解) IntelliJ IDEA 是Java开发利器,用社区版不爽,干催就用旗舰版,这个是收费的,需要licence. 网上找到 ...

  5. C#中dataGridView用法集

    SqlConnection conn = new SqlConnection('Server=(local);DataBase=test;User=sa;Pwd=sa'); SqlDataAdapte ...

  6. Dynamic CRM2016在一台本地服务器安装部署

    在本地单独一台服务器上安装部署CRM2016时需要提前安装好CRM软件需要的必备软件,具体需要安装的组件如下截图:其中required为必须具备的安装组件.license可以采用微软官网的90天测试版 ...

  7. 打开div层

    $('#moneyWin').dialog('open').dialog('center').dialog('setTitle', '用户充值');

  8. linux学习之——基础命令

    Linux体系基础命令: Linux是一个命令行组成的操作体系!精华在命令行,岂论图形界面成长到什么水平这个原理是不会变的,Linux命令有许多壮大的效用:从简单的磁盘操作.文件存取.到举办庞大的多媒 ...

  9. 转发(request.setRequestDispacter)和重定向(response.sendRedirect)的区别以及转发的include和forward的区别

    //response 重定向的时候,url是会跳转到新的页面的,输入的地址要包含项目名(可以跳到项目之外的页面,比如百度)//request 请求转发的时候,url是不会跳转到新页面的,输入的地址不包 ...

  10. windows 2008 server ftp 无法访问解决办法

    安装一个WINDOWS自带的FTP服务器,整了接近一天的时间,按网上的教程,无论如何搭建.最终都是内部IP可以访问.外部IP无法访问. 1.防火墙全部关掉. 2.FTP所在目录给的是EVERYONE的 ...