在很多框架是不推荐用smarty的,因为处理太繁琐,也会影响运行效率。但smarty给我们带来的开发上的便利,也是显而易见的,因此整理了一个简化版的smarty。
1.先在bootstrap里面注册自己的view控制器
2.在libray里件里加上Smarty.php(文章后面有下载地址)
3.在模块中应用(我添加了一个名为Api的模块)
我对模块做了个小修改,增加了template文件里面放的是模板文件以.html为扩展名(smarty对文件扩展名没有限制,不用改配置文件)
例子:
index.php
index.html
Smarty文档
一、资源引用
res标签
功能:返回当前模块静态资源url路径
实例:{res file=css.css}
include标签
功能:在当前模板中包含其它模板
实例:{include file=”header.html”}
二、模板变量
assign标签
例在index.html中赋值变量
模板代码:
{assign var=”name” value=”Tom”}
Hello,{$name}!
$smarty标签
实例:$smarty.get $smarty.post $smarty.cookie $smarty.env $smarty.server $smarty.request $smarty.session等
三、变量调节器
default
功能:为变量设置一个默认值,当变量为空或者未分配的时候,将由默认值替代输出
实例:{$var|default:”no title”}
truncate
功能:字符串截取。从字符串开始处截取某长度的字符。默认会在末尾追加省略号。
实例:{$content|truncate:20}
date
功能:格式化本地时间和日期。
实例:{$var|date:format}
foreach
说明:
foreach 用于处理简单数组(数组中的元素的类型一致)。
foreach 必须和 /foreach 成对使用,且必须指定 from 和 item 属性。
foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一。
foreachelse 语句在 from 变量没有值的时候被执行。
from 属性:指定被循环的数组,数组长度决定了循环的次数。
item属性:单个循环项目的变量名,在循环内部使用。
name 属性为可选属性,可以任意指定(字母、数字和下划线的组合)。
key:单个循环的Key值。(这行是ZC加的说明)
name 属性如果指定,foreach循环体内会自动生成如下变量
$smarty.foreach.foreach_name.index表示本次循环索引,从0开始递增的整数
$smarty.foreach.foreach_name.iteration表示本次的循环次数,从1开始递增的整数
$smarty.foreach.foreach_name.first表示是否是第一次循环
$smarty.foreach.foreach_name.last表示是否是最后一次循环
$smarty.foreach.foreach_name.show表示是否有数据
$smarty.foreach.foreach_name.total表示循环总次数,也可在循环体外使用
实例1
模板代码:
{* 该例将输出数组 $custid 中的所有元素的值 *}
{foreach from=$custid item=curr_id}
id: {$curr_id}
{/foreach}
输出结果为:
id: 1000
id: 1001
id: 1002
只整理了些常用的,其实还有很多功能可以查看smrty.php
下载地址:http://www.guodev.cn/wp-content/uploads/2016/08/Api.zip
道框架(framework)那么必须要提到smarty模板,在面试时你可以不会任何的框架,但是如果不会smarty模板,那么面试官会认为你在说谎,因为几乎所有的框架都是基于或借鉴smarty。
smarty模板介绍
基于面向对象编程思想封装的类,实现前后台代码分离,降低耦合度,并且为后续的分工合作开发做准备。Smarty(轻量,微小)是编译性模板框架,体积小、速度快,支持缓存、全局站点配置等功能,是“旅行居家”开发必备神器!
使用步骤
1、在官网www.smarty.net 下载最新版,解压,复制libs文件夹到项目目录;
2、在对应的项目目录下创建4个文件夹分别为模板文件夹(保存前台页面,必须,一般命名为templates)、编译(自动整理前后台页面,从第二次访问开始不需要重新重新整合,一般命名为templates_c,compile必须)、配置文件夹(应用于整个站点的配置)、缓存文件夹
3、测试
新建一个后台页面index.php
<?php
//引入核心类库文件
include_once('libs/Smarty.class.php');
//实例化类
$smarty=new Smarty();
//定义配置
//用户访问的后台页面所有的路径都是应该以访问后台页面作为参照物!!!
$smarty->setTemplateDir('templates');//定义模板路径
//定义编译路径
$smarty->setCompileDir('templates_c');
//定义配置文件路径
$smarty->setConfigDir('config');
//定义缓存路径
$smarty->setCacheDir('cache');
//修改默认定界符避免和JS冲突!!!
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';
$test='我是test变量';
$smarty->assign("test",$test);//建议注册的变量名和键保持一致
//注册一个索引数组
$smarty->assign("arr1",array('a','b','c'));
//注册一个引用数组,section无法用于引用数组
$smarty->assign("arr2",array("a"=>1,"b"=>2,"c"=>3));
//开启调测
//$smarty->debugging=true;
//自动整理前后台页面
$smarty->display('index.tpl');
$smarty->assign('test1','test1');//这个变量无法使用,想一想为什么?
?>
在templates文件加新建index.tpl文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
我是网站根目录下index.php的前台index.tpl页面<br />
输出后台变量test的值:<font color="red" style="font-weight:bold;"><{$test}></font>XXXX<br />
该变量无法输出:<{$test1}><br />
遍历输出索引数组:
<{section name=i loop=$arr1}>
索引:<{$smarty.section.i.index}>值:<{$arr1[i]}>
<{sectionelse}>
没有符合的记录
<{/section}>
<br />
遍历引用数组(用foeach,foreach也可以用于索引数组):
<{foreach from=$arr2 item=v key=k}>
键:<{$k}>值:<{$v}>
<{foreachelse}>
没有符合的记录集
<{/foreach}>
<br />
新版本写法:
<{foreach $arr2 as $k=>$v}>
键:<{$k}>值:<{$v}>
<{/foreach}>
</body>
</html>
访问后台页面!!!!!测试结果
变量解析
后台注册,语法 $smarty对象->assign(‘键’,mixed 值);
前台在需要的位置显示,语法 {$键}
开启调测
$smarty->debugging=true;
编译原理
smarty模板调用display函数自动整合前后台页面,是从templates文件夹下查找前台地址自动把访问的后台php页面和该前台页面替换成内嵌PHP代码,生成编译文件,文件名XXX.前台模板名.tpl.php,第二次访问自动把这个页面相应给用户,加快速度,只要PHP后台代码不改变,这个编译页面就不会再次生成。
上一节课我们写好后smarty后台的使用,这里我们看下那个index.tpl的smarty模板,
index.tpl
<html>
<head>
<title>smarty测试</title>
</head>
<body>
{extends file="./header.tpl"}
{block name="content"}
{foreach $info as $k=>$v}
{$v['name']}-{$v['age']}
{/foreach}
{myDate()}
{myInfo info="zsf"}
{myBlockInfo info="zxx"}块中数据{/myBlockInfo}
{$name|myModifier:"修饰器"}
{/block}
{block name="footer" append}
联系我
{/block}
</body>
</html>
header.tpl
<h1>我是通用头部</h1>
{block name="content"}
{/block}
{block name="footer"}
<h1>我是底部</h1>
{/block}
在index.tpl中,我们使用smarty引擎自带的方法 extends 来引入header.tpl,如果我们某个模板在其他模板中都需要使用,可以使用这个方法,比如网站公用的顶部导航或者公用的底部。通过 block 方法和name 属性来定义一个区块,在header.tpl中我们定义了两个block,一个叫content,一个叫footer,我们在子模板index.tpl中重新定义了相同的名称的块来更改父级模板中相应块中的内容。我们可以在子模板中使用块时,添加append属性,表示子模块里的内容会在父级模板中相应块的内容进行拼接而不是完全替换。
我们在index.tpl中使用php的foreach的方法来访问并输出了info数组中的内容。可以看到这里和在php中的使用完全相同。同样功能的还有smarty提供的section方法,大家可以看下smarty手册来试一下。
{$name|myModifier:"修饰器"}这里我们访问到了后台传过来的name的值,模板中访问php传过来的模板中,就和在php中使用一样,添加一个$符,这个后面的|表示修饰器,表示对这个变量进行某些处理输出,smarty有很多自定义的修饰器,在这里我们是使用的自定义的修饰器,这个修饰器是在我们上一节课中自定义的smarty.php中定义的:
// 修饰器
function modifierInfo($str,$params){
return $str."===".$params;
}
$smarty->registerPlugin("modifier","myModifier","modifierInfo");
还有我们自定义的块,
{myBlockInfo info="zxx"}块中数据{/myBlockInfo}
// 块函数
function blockInfo($info,$content,$s){
return $info['info']."------------".$content;
}
$smarty->registerPlugin("block","myBlockInfo","blockInfo");
自定义的方法
{myInfo info="zsf"}
// 普通函数
function detailInfo($info){
return "this is ".$info['info'];
}
$smarty->registerPlugin("function","myInfo","detailInfo");
注:
registerPlugin是一个smarty自定义的方法,可以用来自定义块,函数,修饰器,使用第一个参数来进行区分,block表示定义的块,modifier表示定义的修饰器,function表示定义的函数。第二个参数是我们在模板中使用自定义的块(函数或修饰器)是的变量名,最后一个字符串,是我们在后台自定义的方法,表示具体的处理逻辑,返回某些数据,这些数据会在模板中进行替换!
*请认真填写需求信息,我们会在24小时内与您取得联系。