用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第26讲 Smarty简介,下载安装配置,创建配置文件,定界符,注释,变量,对数组读取,变量的修饰及修饰函数,if,else,foreach,section循环,模板间,模板与PHP间变量的交互方法assign,display

上次修改时间: 2016-03-22 15:20:10      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\      下一页

Smarty简介,下载安装配置,创建配置文件,定界符,注释,变量,对数组读取,变量的修饰及修饰函数,if,else,foreach,section循环,模板间,模板与PHP间变量的交互方法assign,display

26.1 Smarty简介
1) Smarty是PHP写的PHP模板引擎,目的是将UI用户界面和PHP代码分离,基于MVC(Model-View_Controller,模型-视图-控制器)框架
2) 应用程序都是有模型,视图,控制三部分组成
 视图,提供给用户的的界面,提供信息的收集及显示,不处理
 控制器:负责处理视图和模型的对应关系,将收集的信息传递给模型
 模型:对接收的信息处理,将处理的结果传给视图
3) Smarty特点:提高编程速度,可自行设置模板定界符,仅对修改的模板重新编译,模板中可用if,for等控制语句,有内建缓存支持,可自定义插件

26.2 Smarty的安装配置
1) 下载与安装
下载地址:http://smarty.php.net/download.php,现在是下载是http://www.smarty.net/
下载后解压拷贝libs目录(里面的smarty.class.php,smarty_Compiler.class.php,config_file.class.php,debug.tpl4个文件和internals,plug-ins两个目录是其核心文件)到服务器根目录下,新重命名为smarty或class等
新建templates,templates_c,configs,cache四个目录
2) 创建配置文件,为避免在每个使用smarty模板的文件中都加一句包含Smarty类库的代码,可以将其写在一个配置文件中,要使用模板的文件引用这个配置文件就可以了
 //注:配置文件中要使用绝对路径,因为服务器不知道文件在第几层目录中被调用,配置文件保存在根目录下
代码段1:index.php页代码
 define('Base_PATH','d:\www\\'); //定义服务器绝对路径
 define('SMARTY_PATH','\26\1\Smarty\\');  //定义smarty目录相对路径
 require BASE_PATH.SMARTY_PATH.'Smarty.class.php';  //加载smarty类库文件
 $smarty = new Smarty; //实例化一个smarty对象
 $smarty->template_dir = BASE_PATH.SMARTY_PATH.'templates/'; //下面是定义各自的目录路径
 $smarty->compile_dir = BASE_PATH.SMARTY_PATH.'templates_c/';
 $smarty->config_dir = BASE_PATH.SMARTY_PATH.'configs/';
 $smarty->cache_dir = BASE_PATH.SMARTY_PATH.'cache/';
 $smarty->assign('title','第一个Smarty程序'); //使用smarty赋值方法将title变量值发送到模板
 $smarty->assign('content','Hello,Welcome to study \'Smarty\'!'); //使用smarty赋值方法将content变量值发送到模板
 $smarty->display('index.tpl'); //显示模板
例2:config.php页代码:
 define('Base_PATH','d:\www\\'); //定义服务器绝对路径
 define('SMARTY_PATH','\26\1\Smarty\\');  //定义smarty目录相对路径
 require BASE_PATH.SMARTY_PATH.'Smarty.class.php';  //加载smarty类库文件
 $smarty = new Smarty; //实例化一个smarty对象
 $smarty->template_dir = BASE_PATH.SMARTY_PATH.'templates/'; //下面是定义各自的目录路径
 $smarty->compile_dir = BASE_PATH.SMARTY_PATH.'templates_c/';
 $smarty->config_dir = BASE_PATH.SMARTY_PATH.'configs/';
 $smarty->cache_dir = BASE_PATH.SMARTY_PATH.'cache/';

26.3 Smarty模板设计
1) 程序和模板分开设计,美工和程序员各做自己的部分,两部分相互独立,也有一部分共通
2) tpl模板文件中是由一些静态元素加定界符{...}组成,模板中不允许出现PHP代码,统一放在模板目录templates下
 //注:模板中所有注释,变量,函数都要包含在定界符内
3) Smarty中注释同PHP注释类似,格式:{*中间这里填注释的内容*}  //注释包含在两个*星号中,花括是定界符
4) Smarty中变量来自3个部分,
一是来自PHP页面中的变量,也就是assign()方法传来的变量,变量使用同PHP中相同要加$符号,不同的是对数组读取,按索引读取同PHP相似,按键值读取时使用.点做连接符,
 例:数组$arr = array{'object' => 'book','type' => 'computer', 'unit' => '本'}  //当要读取type值时,格式为$arr.type 也适用于二维数组
二是保留变量,相当于预定义变量
三是从配置文件中读取数据:将变量置于两个#号中间,就可像普通变量一样调用配置文件内容,也可以使用保留变量中的$smarty_config来调用配置文件
例:index.tpl中代码
 <body>
 购书信息:<br>
 图书类别:{ $arr[0] }<br />
 图书名称:{ $arr.name }<br />
 图书单价:{ $arr.unit_price.price }/{ $arr.unit_price.unit }
 </body>
index.php代码
 include_once("../config.php");
 $arr = array('computerbook','name' => 'PHP从入门到精通','unit_price' => array('price' => '$65.00','unit' => '本')):
 $smarty->assign('title','使用Smarty读取数组');
 $smarty->assign('arr',$arr);
 $smarty->display('02/index.tpl');
例2:index.php代码
 include_once("../config.php");
 $smarty->assign('title','Smarty保留变量');
 $smarty->display('03/index.tpl');
index.tpl文件body间代码
 {* 使用get变量获取url中的变量值(ex: http://localhost/tm/sl/28/3/index.php?type=computer) *}
 变量type的值是:{ $smarty.get.type }<br />
 当前路径为:{ $smarty.server.PHP_SELF}<br />
 当前时间为:{$smarty.now}
例3: index.php代码
 include_once("../config.php");
 $smarty->display('04/index.tpl');
index.tpl代码
 { config_load file='04/04.conf" } //这句写在第一行
 //下面两句写在body中
 {$smarty.config.type}
 {$smarty.config.name}
04.conf页代码
 title = "调用配置文件"
 bgcolor = "#f0f0f0"
 border = "5"
 type = "计算机类"
 name = "PHP从入门到精通"
5) 变量的处理修饰
格式: {variable_name|modifer_name: parameter1:...}
 //variablie_name为变量名称
 //modifer_name为修饰变量的方法名。变量和方法间用|符号分割
 //parameter1为参数值,多个参数用:冒号分开
 注:当使用多个方法修饰变量时,每个方法间用|分开
6) 一些修饰变量的方法或函数级其参数
 capitalize 首字母大写
 count_characters:true/false 变量中的字符串个数,参数为true时空格也算字符,否则忽略
 cat:"characters"  将cat里的字符串添加到指定字串的后面
 date_format:"%Y-%M-%D" 格式化日期和时间,同PHP中的strftime()函数
 default:" characters" 设置默认值,当变量为空时使用默认值
 Lower 将变量字符串小写
 nl2br 所有换行符被替换成<br />,功能同PHP中nl2br()函数 
 replace:"value1":"value2" 替换,使用value2替换所有value1
 string_format:"value" 使用value来格式化字符串,如value为%d则字符串被格式化为十进制数
 strip_tags 去掉所有html标签
 upper 将变量改为大写
例:index.php代码
 include_once "../config.php";
 $str1= '这是一个实例';
 $str1= “\n图书->计算机类->php\n书名:<<PHP从入门到精通>>”;
 $str1= ”\n价格:¥59/本。“;
 $smarty->assign('title',‘使用变量修饰方法’);
 $smarty->assign('str',$str1.$str2.$str3);
 $smarty->display('05/index.tpl');
index.tpl页代码
 原文:{$str} <p>
 变量中的字符数(含空格):{$str|count_characters:true} <br />
 使用变量修饰方法后:{$str|nl2br|upper}
6) smarty模板中的流程控制语句,包括if...elseif...else,foreach,section
⑴ if...elseif...else 语句,使用方法同PHP中if,但必须以/if为结束标志
 {if 条件语句1}
  语句1
 {elseif 条件语句2}
  语句2
 {else}
  语句3
 {if}
 //以上语句,除使用PHP中的<,>,=,!=等运算符外,还可以用eq,ne,neq等修饰词修饰
例:index.tpl页代码
 {if $smarty.get.type == 'tm'}
 欢迎光临,{$smarty.get.type}
 {else}
 对不起,您不是本站VIP,无权访问此栏目。
 {/if}
index.php页代码
 include_once "../config.php";
 $smarty->assign("title","if条件判断语句");
 $smarty->display("06/index.tpl");
⑵ foreach循环控制语句
smarty模板主要用foreach语句输出数组,它比section简单,格式:
 {foreach name=foreach_name key=key item=item from=arr_name}
 ...
 {/foreach}
 //name为该循环的名称,key为当前元素键值,item为当前元素变量名,from是该循环的数组,item是必需要有参数
⑶ section循环
用于比较复杂的数组,语法:
 {section name=" sec_name" loop=$arr_name start=num step=num}
 //name为循环名称,loop为循环的数组,strat表循环的初始位置,如start=2表循环从loop数组第2个元素开始,step为步长,如step=2表循环一次,数组指针向下移动两位
例:index.php页代码
 include_once '../config.php';
 $infobook = array('object'=>'book','type'=>'computer','name'=>'PHP入门到精通','publishing'=>'清华大学出版社');
 $smarty->assign('title','使用foreach循环输出数组内容');
 $smarty->assign('infobook',$infobook);
 $smarty->display('07/index.tpl');
index.tpl页代码
使用foreach语句循环输出数组。<p>
 {foreach key=key item=item from=$infobook}
 {$key} => {$item}<br />
 {/foreach }

例:index.php页
 include("../config.php");
 $obj = array(array("id" => 1, "bigclass" => "计算机图书","smallcalss" => array(array("s_id" => 1,"s_type => "PHP"))),array("id" => 2, "bigclass" => "历史传记", "smallcalss" => array(array("s_id" => 2, "s_type" => "中国历史"), array("s_id" => 3, "s_type" => "世界历史"))), array("id" => 3, ”bigclass" +> "畅销小说", "smallcalss" => array(array("s_id" => 4, "s_type" => "网络小说"),array("s_id" => 5, "s_type" => "科幻小说"))));
 $smarty->assign('title','section循环控制');
 $smarty->assign("obj",$obj);
 $smarty->display("08/index.tpl");
index.tpl页
 {section name=sec1 loop=$obj}
 {$obj[sec1].bigclass}
  {section name=sec2 loop=$obj[sec1].smallclass}
   {$obj[sec1].smallcalss[sec2].s_type}
  {/section}
 {/section}
 
26.4 Smarty程序设计
1) Smarty程序功能主要分两种,一种是和Smarty模板间交互,如assign,display方法,另一种功能是配置Smarty,如变量template_dir,$config_dir等
//注:Smarty模板中不推荐有PHP代码段,所有PHP程序都要别写成文件
2) smart中除assign和模板交互外的常用方法:
 void append(string varname, mixed var[, boolean merge]) //向数组中追加元素
 void clear_all_assign() //清除所有模板中的赋值
 void clear_assign(string var) //清除一个指定的赋值
 void config_load(string file [, string section]) //加载配置文件,有section表只加载配置文件中相对应的一段数据
 string fetch(string template)  //返回模板的输出内容,但不直接显示
 array get_config_vars ([string varname]) //获取指定模板变量的值,无参数时返回一个所有模板变量的数组
 bool template_exists(string template)  //检测指定的模板是否存在
例:index.php
 include '../config.php';
 $arr = array("object"=>'book',"type"=>'computer');
 $str1 = array('name=>'php');
 $str2 = array('publishing'=>'qinghua');
 $smarty->assign('title','使用append');
 $smarty->assign('arr',$arr);
 $smarty->append('arr',$str1,true);
 $smarty->append('arr',$str2);
 $smarty->display('09/index.tpl');
3) Smarty中唯一的常量Smarty_dir,用来保存smarty类库的完整路径
$template_dir模板目录,里在保存smarty模板,里面文件是以.tpl,html等为后缀
$compile_dir编译目录,默认路径在执行文件所在目录下的templates_c目录,里面多是以%%...%%index.tpl.php格式文件
  它是编译后模板和PHP程序组合成的一个混编页面
$cache_dir缓存目录,用来放缓存文件,如caching变量开启,smarty将直接从这里读文件
$config_dir配置目录,用来放配置文件
$debugging调试变量,该变量可打开调试控制台,只要在配置文件config.php中将$smarty->debugging设为true即可
$caching缓存变量,变量可以开启缓存,只要当前模板文件和配置文件未被改动,smarty就直接从缓存目录读取缓存文件不用重新编译模板

index.tpl页代码
{ foreach key=key item=item from=$arr }
{$key} => {$item} <br />
{ /foreach}