6.10 看ThinkPHP遇到瓶颈,补学smarty 模版 (也是来培训前所遇到的最大的难关)
模版技术的分类
1. smarty 模版是官方推荐
2. phplib
3. 公司自己做
smarty模版使用细节
如何配置
--将解压后的 smarty 文件中的 lib 文件夹放在项目目录下
--创建模版文件夹 templates 和 编译后文件夹template_c
左右边界符 { },一般会替换成使用<{ }> 模版内的注释使用<{* *}>
1. 修改Smarty.class.php中的设置
2. 动态修改
$smarty = new Smarty();
$smarty ->left_delimiter = '<{';
$smarty ->right_delimiter = '}>';
其他的设置都可以用这两种方法修改
是否使用缓存$smarty ->caching='false' ;
实时变化的网站如股票等,不要开缓存
分配变量的细节问题
可以分配PHP支持的各种数据类型(具体方法参看练习)
如何让我们的Smarty 模板直接从配置文件中取数据
什么时候可以考虑 : 当某个变量的值,不希望直接写死在程序中,就可以通过配置文件来获取(常见配置样式)
固定格式的配置文件: key = 值
文件命名: my.ini my.conf
title = '我的第一个网站'
bgcolor = 'blue'
直接在tpl 文件中使用数据,不需要$Smarty -> assign()分配
test3.tp1
使用方法 : {config_load file ='路径'}
{#要使用的数据#} 如 {#title#} 或者
{#smarty.config.变量名}
Smarty 可以直接获取get.post,server ,session 等等数据
{$smarty.get.username}<br>
{$smarty.server.SERVER_NAME}
但是不常用,Smarty模板本身就是为了实现显示界面与数据处理分离
Smarty內建函数(in_build)
{foreach from = ### item = ### key = ###}
{if} {else| elseif} ....{/if}
{/foreach}
6-11
smarty自定义函数
系统预置自定义函数(如assign等等) , 用户自定义函数
自己添加自定义函数 :
1. 在$smarty 中 注册
注意 Smarty 3 取消了register_function 改为registerPlugin
2. 以插件的形式增加(普通)自定义函数 (免去注册的步骤)
文件名 : function.函数名.class.php
函数名 : smarty_function_函数名
将自定义函数文件直接放到smarty/libs/plugin 中
具体参看相关文件下的系统函数的规范
增加块函数
文件名 block.块函数名.class.php
函数名 smarty_block_块函数名
小结 :
1. 內建函数(我们不能修改)
2. 自定义函数(smarty 本身提供一些 , 自己也可以编写)
06-12
阶段小项目 : mvc + Smarty 留言板项目
1. 画出框架图
2. 数据库
-- emp 表
create table emp (
emp_id int unsigned key auto_increment,
emp_name varchar(64) not null default '' unique,
emp_pwd char(32) not null
)charset = utf8;
-- message表
create table `message` (
message_id int unsigned key auto_increment,
sender varchar(64) not null,
getter varchar(64) not null,
sendtime datetime not null,
content varchar(2000) not null
)charset = utf8;
-- 插入测试数据
insert into emp values
(100,'大宝剑',md5('123')),
(101,'小宝剑',md5('123')),
(102,'宝剑',md5('123'));
insert into `message` values
(default , '大宝剑' , '小宝剑' , now(), '赶紧还钱'),
(default , '小宝剑' , '大宝剑' , now(), '没钱不还'),
(default , '大宝剑' , '小宝剑' , now(), '赶紧还钱')
3 .代码.......
6-16
细节 :
模板文件界面使用js , 可以直接写在模板界面中 ,
外部引用需要用 smarty 引入, 才能通过Smarty 替换外部js文件中的Smarty标签内容 {include file='路径'}
注意 : 因为是通过Smarty引入 ,js文件内需要写上<script>标签
smarty 语法细节
变量的分类
1. php分配的变量
2. 从配置文件中读取的变量
3. Smarty保留变量
数学计算可以直接应用到变量 如 {$变量 * 2}
注意:
1 . 无法使用括弧改变运算顺序
2 . 只能进行简单运算 + - * / %等
Smarty中的注释 左定界符 * * 右定界符 如 { * *}
访问常量 : {$smarty.const.常量}
**** Smarty模板中的调节器 ****
变量操作符(调节器) , 用于变量 , 自定义函数 和 字符串 , 可以实现多种实用的功能 , 如 : 首字母大写 , 拆分 , 替换 , 截取 ... 更像是php的内置函数
基本语法 {变量名(自定义函数,字符串) | 调节器名: 参数1 : 参数2 : ..}
注意 : 因为底层使用正则匹配到关键字 替换 , 代码里的空格字符 , 应谨慎
如 {$smarty.now|date_format:"%Y年%m月%d日 %H时%i分%S秒"} 格式化输出当前年月日
从本质看 , 调节器就是函数 , 主要用于对字符串的处理
调节器可以自定义 , 以插件的形式给出
smarty -> plugins 中按规范直接加入调节器文件
文件名 modifier.xxx.php 函数名 smarty_modifier_xxx
常用调节器 (详情参看手册)
--单词首字母大写 {$str|capitalize}
--计算字符数 {$str|count_characters}
--拼接字符串 {$str|cat:"str"}
--正则表达式替换
{$str|regex_replace:"正则规范":"替换值"}
--插空 spacify 给每个字符间 插入添加的值 , 不给属性 默认插入空格
{'abc'|spacify:'^_^'}
--字符串格式化 string_format 格式化规范遵循 php的 printf()
--截取 truncate
应用 : 只显示文章的前10 个字符 ,其它用....显示 , 类似显示文章简介的效果
{$str2|truncate:'10':'被截掉的部分的显示方式 ,不给默认是...':'是否精准截取,默认是否 , 块即如果截取结尾处未能把单词截完整 , 则放弃后面的截取'}
细节 :
1. 截取的字符长度 = 显示的部分 + 被截掉部分的显示方式
如上 , 截取$str2的前十个字符 , 其它显示为... , 则实际显示为 $str2 的前7 个字符 + 三个点 = 10个字符
2. 中文字符在截取时 , 可能会因为预留字符不够而显示乱码 ,
解决方法 : 将truncate升级为支持utf8版本的插件 , 网上找资源
组合修改器
对于同一个变量 , 可以使用多个修改器 . 他们讲从左到右按照定好顺序依次组合使用. 不同的修改器间 用 | 隔开
内建函数详解 :
capture :
1. 捕获模板输出的数据并将其存储到一个变量里 , 而不是把它们输出在页面
2. 任何在 {capture name = 'foo'} 变量 | 字符串 | include文件 {/capture}之间的数据都被存储到变量$foo中 , 该变量由name属性决定
3. 模板中通过 $smarty.capture.foo 访问变量 , 如果没有指定name的属性 , 函数将默认将使用 default 作为参数
4. {capture} 必须成对出现 , 该函数不能嵌套使用
foreachelse :
当 foreach 取不到值时 , 显示的数据
include : 引入其他文件
{include file = 'url'}
1 . include 可以将引入文件的变量等全部数据获取
2 . include 时 直接写变量 {include file='url' 变量名 = '值''}
smarty 缓存机制
创建一个cache 的目录(默认是cache , 可以修改)
//开启缓存
$smarty -> caching = true;
...
细节 :
1 . 缓存的默认时间 : 3600 秒 ,可以设置
2 . 启用缓存后 , 在缓存的时间内 , 新加的php代码并不会被加载到缓存文件
3 . 缓存时间时长的设置 十分重要
4 . 局部缓存技术
smarty 中可以用 insert 解决下
insert 文件类似 include 函数 , 不同之处是 insert 所包含的内容 不会被缓存 , 每次调用模板都会重新执行insert 操作
if 函数可以对变量进行简单判断
如 {if $num1 is odd} 判断是否是奇数 {/if}
{literal} 这里的数据会当做 文本 处理{/literal}
内嵌php脚本 , 不推荐
$smarty -> php_handing =true;
{php} php脚本 {/php}
section/sectionelse 类似 foreach/foreachelse 遍历数组 属性繁多 , 建议使用时参看手册
{section name = 取的数组名字(fruit) loop=循环的数组($arr) start=1(从数组中第二个值开始取) step=2 (步长 , 每隔2个取一次)}
{$数组[名字]}( $arr[fruit]) )
{/section}
取二维数组
{section name = fruit loop = arr}
{$arr[fruit].下标}
{/section}
自定义函数详解
assign 分配变量和值
细节 : 可以直接在模板文件中分配 , 不推荐
counter 计数器 , 用于输出一个记数过程 , counter 保存了每次计数时的当前记数值
语法 :
{counter start='开始值' skip='步长' print='true/false(本次是否输出)' name='计数器名字'}
cycle : 循环使用一组值
{cycle values='green,silver'}
fetch : 取得 本地文件 || http || ftp 文件 , 并显示文件的内容
{fetch file='url' assign='变量名'}
细节 :
设置了assign 属性, 则内容不会直接输出 ,而是保存在了assign指定的变量中
html_checkboxes : 根据指定的数据创建 复选 按钮
{html_checkboxes options=$数组变量 checked=$默认选中的数组变量 separator = '分隔符' name='复选按钮的名字,默认是checkbox'}
$arr2 = array('pg' =>'苹果','xj'=>'香蕉' , 'xg' => '西瓜' ,'tz' =>'桃子');
$checked = array('pg','tz');
细节:
分隔符可以不写 , 默认是空格
html_options : 生成下拉框
{html_options options = $hobby selected=$sel}
html_radius : 生成单选按钮 (所有的html_ 自定义函数用法都类型 , 参看手册)
6.18
自定义函数详解(二)
pupup 函数----弹出窗口(花样多, 参看手册或相关文档)
整合了overlib 库 , 用于控制弹出窗口的函数库 , 可用于敏感信息如帮助窗口或工具提示 . 使用popup函数 , 在页首需要调用popup_init 函数(前提是需下载overlib 函数库)
{pupop_init src ='引入overlib函数库的overlib.ks文件'}
<a href = '###' {popup text = '提示语句 , 可以时html 的格式( 这就可以做好多事了)} >超链接</a>
append : 添加指定的元素到数组中
如果添加一个字符串 , 该字符串会被转换为数组格式后在进行添加
如果第三个可选参数是 ture , 所添加的数据会和数组中现有数据进行合并 , 而不是直接添加
基本语法 :
$smarty -> append('数组名' , '字符串,数组,变量');
append_by_rel : 引用的方式添加
clear_all_assign : 清除所有已赋值到模板中的值
*********smarty 缓存技术 *********
静态缓存的配置
1. 缓存目录 , 默认cache
$smarty -> cache_dir = '/cache/';
2. 开启缓存 , 为false 时无法开启
$smarty -> caching = ture ;
3. 缓存时间 , 单位秒
$smarty -> cache_lifetime = 60;
注意 :
1. 该缓存指的是为模板准备的数据变量给缓存起来 ,生成了的缓存化静态页面 ,如果更改变量的值 , 在缓存时间内 ,不会变化 .
如果更改的是模板文件的本身结构 等 ,还是会发生变化
2. 所谓的缓存时间 , 其实是将当前时间 与 生成的缓存文件 的修改时间作对比 , 如果时间差大于设置的缓存时间 , 才会重新生成新的缓存文件 , 否则请求被打回
局部缓存技术 :
insert 函数 :
基本语句 :
模板文件
{insert name = '函数名'}
php文件
function insert_函数名 (){
函数体(这其中的数据不会被缓存)
}
smarty_block 函数也可以实现局部缓存 ---待商榷, 报错
{blockname}
当前时间 : {$smarty.now}
{/blockname}
细节 :
1. 为模板文件生成带id的缓存文件
$smarty -> display('模板' , 缓存id)
2. 清除所有缓存 , 可以指定参数(整数) , 指定清除缓存时间超过多少秒的缓存
$smarty -> clear_all_cache();
3. 清除指定模板文件的缓存
$smarty -> clear_cache('模板文件');
4. 清除指定id 的 缓存
$smarty -> clear_cache('模板文件',缓存id)
smarty 调用 对象 :
细节 :
可以直接调用一个对象的属性 , 也可以调用方法, 前提都是公开的
smarty 过滤器 : 预过滤器 后过滤器 输出滤镜
预过滤器 : 发生在 php文件读取模板文件动作的最前
后过滤器 : 发生在 php文件生成 编译后文件动作的最前
输出滤镜 : 发生在编译后文件显示在浏览器动作的最前
模版技术的分类
1. smarty 模版是官方推荐
2. phplib
3. 公司自己做
smarty模版使用细节
如何配置
--将解压后的 smarty 文件中的 lib 文件夹放在项目目录下
--创建模版文件夹 templates 和 编译后文件夹template_c
左右边界符 { },一般会替换成使用<{ }> 模版内的注释使用<{* *}>
1. 修改Smarty.class.php中的设置
2. 动态修改
$smarty = new Smarty();
$smarty ->left_delimiter = '<{';
$smarty ->right_delimiter = '}>';
其他的设置都可以用这两种方法修改
是否使用缓存$smarty ->caching='false' ;
实时变化的网站如股票等,不要开缓存
分配变量的细节问题
可以分配PHP支持的各种数据类型(具体方法参看练习)
如何让我们的Smarty 模板直接从配置文件中取数据
什么时候可以考虑 : 当某个变量的值,不希望直接写死在程序中,就可以通过配置文件来获取(常见配置样式)
固定格式的配置文件: key = 值
文件命名: my.ini my.conf
title = '我的第一个网站'
bgcolor = 'blue'
直接在tpl 文件中使用数据,不需要$Smarty -> assign()分配
test3.tp1
使用方法 : {config_load file ='路径'}
{#要使用的数据#} 如 {#title#} 或者
{#smarty.config.变量名}
Smarty 可以直接获取get.post,server ,session 等等数据
{$smarty.get.username}<br>
{$smarty.server.SERVER_NAME}
但是不常用,Smarty模板本身就是为了实现显示界面与数据处理分离
Smarty內建函数(in_build)
{foreach from = ### item = ### key = ###}
{if} {else| elseif} ....{/if}
{/foreach}
6-11
smarty自定义函数
系统预置自定义函数(如assign等等) , 用户自定义函数
自己添加自定义函数 :
1. 在$smarty 中 注册
注意 Smarty 3 取消了register_function 改为registerPlugin
2. 以插件的形式增加(普通)自定义函数 (免去注册的步骤)
文件名 : function.函数名.class.php
函数名 : smarty_function_函数名
将自定义函数文件直接放到smarty/libs/plugin 中
具体参看相关文件下的系统函数的规范
增加块函数
文件名 block.块函数名.class.php
函数名 smarty_block_块函数名
小结 :
1. 內建函数(我们不能修改)
2. 自定义函数(smarty 本身提供一些 , 自己也可以编写)
06-12
阶段小项目 : mvc + Smarty 留言板项目
1. 画出框架图
2. 数据库
-- emp 表
create table emp (
emp_id int unsigned key auto_increment,
emp_name varchar(64) not null default '' unique,
emp_pwd char(32) not null
)charset = utf8;
-- message表
create table `message` (
message_id int unsigned key auto_increment,
sender varchar(64) not null,
getter varchar(64) not null,
sendtime datetime not null,
content varchar(2000) not null
)charset = utf8;
-- 插入测试数据
insert into emp values
(100,'大宝剑',md5('123')),
(101,'小宝剑',md5('123')),
(102,'宝剑',md5('123'));
insert into `message` values
(default , '大宝剑' , '小宝剑' , now(), '赶紧还钱'),
(default , '小宝剑' , '大宝剑' , now(), '没钱不还'),
(default , '大宝剑' , '小宝剑' , now(), '赶紧还钱')
3 .代码.......
6-16
细节 :
模板文件界面使用js , 可以直接写在模板界面中 ,
外部引用需要用 smarty 引入, 才能通过Smarty 替换外部js文件中的Smarty标签内容 {include file='路径'}
注意 : 因为是通过Smarty引入 ,js文件内需要写上<script>标签
smarty 语法细节
变量的分类
1. php分配的变量
2. 从配置文件中读取的变量
3. Smarty保留变量
数学计算可以直接应用到变量 如 {$变量 * 2}
注意:
1 . 无法使用括弧改变运算顺序
2 . 只能进行简单运算 + - * / %等
Smarty中的注释 左定界符 * * 右定界符 如 { * *}
访问常量 : {$smarty.const.常量}
**** Smarty模板中的调节器 ****
变量操作符(调节器) , 用于变量 , 自定义函数 和 字符串 , 可以实现多种实用的功能 , 如 : 首字母大写 , 拆分 , 替换 , 截取 ... 更像是php的内置函数
基本语法 {变量名(自定义函数,字符串) | 调节器名: 参数1 : 参数2 : ..}
注意 : 因为底层使用正则匹配到关键字 替换 , 代码里的空格字符 , 应谨慎
如 {$smarty.now|date_format:"%Y年%m月%d日 %H时%i分%S秒"} 格式化输出当前年月日
从本质看 , 调节器就是函数 , 主要用于对字符串的处理
调节器可以自定义 , 以插件的形式给出
smarty -> plugins 中按规范直接加入调节器文件
文件名 modifier.xxx.php 函数名 smarty_modifier_xxx
常用调节器 (详情参看手册)
--单词首字母大写 {$str|capitalize}
--计算字符数 {$str|count_characters}
--拼接字符串 {$str|cat:"str"}
--正则表达式替换
{$str|regex_replace:"正则规范":"替换值"}
--插空 spacify 给每个字符间 插入添加的值 , 不给属性 默认插入空格
{'abc'|spacify:'^_^'}
--字符串格式化 string_format 格式化规范遵循 php的 printf()
--截取 truncate
应用 : 只显示文章的前10 个字符 ,其它用....显示 , 类似显示文章简介的效果
{$str2|truncate:'10':'被截掉的部分的显示方式 ,不给默认是...':'是否精准截取,默认是否 , 块即如果截取结尾处未能把单词截完整 , 则放弃后面的截取'}
细节 :
1. 截取的字符长度 = 显示的部分 + 被截掉部分的显示方式
如上 , 截取$str2的前十个字符 , 其它显示为... , 则实际显示为 $str2 的前7 个字符 + 三个点 = 10个字符
2. 中文字符在截取时 , 可能会因为预留字符不够而显示乱码 ,
解决方法 : 将truncate升级为支持utf8版本的插件 , 网上找资源
组合修改器
对于同一个变量 , 可以使用多个修改器 . 他们讲从左到右按照定好顺序依次组合使用. 不同的修改器间 用 | 隔开
内建函数详解 :
capture :
1. 捕获模板输出的数据并将其存储到一个变量里 , 而不是把它们输出在页面
2. 任何在 {capture name = 'foo'} 变量 | 字符串 | include文件 {/capture}之间的数据都被存储到变量$foo中 , 该变量由name属性决定
3. 模板中通过 $smarty.capture.foo 访问变量 , 如果没有指定name的属性 , 函数将默认将使用 default 作为参数
4. {capture} 必须成对出现 , 该函数不能嵌套使用
foreachelse :
当 foreach 取不到值时 , 显示的数据
include : 引入其他文件
{include file = 'url'}
1 . include 可以将引入文件的变量等全部数据获取
2 . include 时 直接写变量 {include file='url' 变量名 = '值''}
smarty 缓存机制
创建一个cache 的目录(默认是cache , 可以修改)
//开启缓存
$smarty -> caching = true;
...
细节 :
1 . 缓存的默认时间 : 3600 秒 ,可以设置
2 . 启用缓存后 , 在缓存的时间内 , 新加的php代码并不会被加载到缓存文件
3 . 缓存时间时长的设置 十分重要
4 . 局部缓存技术
smarty 中可以用 insert 解决下
insert 文件类似 include 函数 , 不同之处是 insert 所包含的内容 不会被缓存 , 每次调用模板都会重新执行insert 操作
if 函数可以对变量进行简单判断
如 {if $num1 is odd} 判断是否是奇数 {/if}
{literal} 这里的数据会当做 文本 处理{/literal}
内嵌php脚本 , 不推荐
$smarty -> php_handing =true;
{php} php脚本 {/php}
section/sectionelse 类似 foreach/foreachelse 遍历数组 属性繁多 , 建议使用时参看手册
{section name = 取的数组名字(fruit) loop=循环的数组($arr) start=1(从数组中第二个值开始取) step=2 (步长 , 每隔2个取一次)}
{$数组[名字]}( $arr[fruit]) )
{/section}
取二维数组
{section name = fruit loop = arr}
{$arr[fruit].下标}
{/section}
自定义函数详解
assign 分配变量和值
细节 : 可以直接在模板文件中分配 , 不推荐
counter 计数器 , 用于输出一个记数过程 , counter 保存了每次计数时的当前记数值
语法 :
{counter start='开始值' skip='步长' print='true/false(本次是否输出)' name='计数器名字'}
cycle : 循环使用一组值
{cycle values='green,silver'}
fetch : 取得 本地文件 || http || ftp 文件 , 并显示文件的内容
{fetch file='url' assign='变量名'}
细节 :
设置了assign 属性, 则内容不会直接输出 ,而是保存在了assign指定的变量中
html_checkboxes : 根据指定的数据创建 复选 按钮
{html_checkboxes options=$数组变量 checked=$默认选中的数组变量 separator = '分隔符' name='复选按钮的名字,默认是checkbox'}
$arr2 = array('pg' =>'苹果','xj'=>'香蕉' , 'xg' => '西瓜' ,'tz' =>'桃子');
$checked = array('pg','tz');
细节:
分隔符可以不写 , 默认是空格
html_options : 生成下拉框
{html_options options = $hobby selected=$sel}
html_radius : 生成单选按钮 (所有的html_ 自定义函数用法都类型 , 参看手册)
6.18
自定义函数详解(二)
pupup 函数----弹出窗口(花样多, 参看手册或相关文档)
整合了overlib 库 , 用于控制弹出窗口的函数库 , 可用于敏感信息如帮助窗口或工具提示 . 使用popup函数 , 在页首需要调用popup_init 函数(前提是需下载overlib 函数库)
{pupop_init src ='引入overlib函数库的overlib.ks文件'}
<a href = '###' {popup text = '提示语句 , 可以时html 的格式( 这就可以做好多事了)} >超链接</a>
append : 添加指定的元素到数组中
如果添加一个字符串 , 该字符串会被转换为数组格式后在进行添加
如果第三个可选参数是 ture , 所添加的数据会和数组中现有数据进行合并 , 而不是直接添加
基本语法 :
$smarty -> append('数组名' , '字符串,数组,变量');
append_by_rel : 引用的方式添加
clear_all_assign : 清除所有已赋值到模板中的值
*********smarty 缓存技术 *********
静态缓存的配置
1. 缓存目录 , 默认cache
$smarty -> cache_dir = '/cache/';
2. 开启缓存 , 为false 时无法开启
$smarty -> caching = ture ;
3. 缓存时间 , 单位秒
$smarty -> cache_lifetime = 60;
注意 :
1. 该缓存指的是为模板准备的数据变量给缓存起来 ,生成了的缓存化静态页面 ,如果更改变量的值 , 在缓存时间内 ,不会变化 .
如果更改的是模板文件的本身结构 等 ,还是会发生变化
2. 所谓的缓存时间 , 其实是将当前时间 与 生成的缓存文件 的修改时间作对比 , 如果时间差大于设置的缓存时间 , 才会重新生成新的缓存文件 , 否则请求被打回
局部缓存技术 :
insert 函数 :
基本语句 :
模板文件
{insert name = '函数名'}
php文件
function insert_函数名 (){
函数体(这其中的数据不会被缓存)
}
smarty_block 函数也可以实现局部缓存 ---待商榷, 报错
{blockname}
当前时间 : {$smarty.now}
{/blockname}
细节 :
1. 为模板文件生成带id的缓存文件
$smarty -> display('模板' , 缓存id)
2. 清除所有缓存 , 可以指定参数(整数) , 指定清除缓存时间超过多少秒的缓存
$smarty -> clear_all_cache();
3. 清除指定模板文件的缓存
$smarty -> clear_cache('模板文件');
4. 清除指定id 的 缓存
$smarty -> clear_cache('模板文件',缓存id)
smarty 调用 对象 :
细节 :
可以直接调用一个对象的属性 , 也可以调用方法, 前提都是公开的
smarty 过滤器 : 预过滤器 后过滤器 输出滤镜
预过滤器 : 发生在 php文件读取模板文件动作的最前
后过滤器 : 发生在 php文件生成 编译后文件动作的最前
输出滤镜 : 发生在编译后文件显示在浏览器动作的最前