PHP从入门到精通——读书笔记(第21章:Smarty模板技术)
1:简介:Smarty是PHP中的一个模板引擎。使用PHP编写,它将一个应用程序分成两部分实现:视图和逻辑控制。目的就是讲UI(用户界面)和PHP code(PHP代码)分离。这样程序员在修改程序时不会影响到页面设计,而美工在重新设计或修改页面时也不会影响程序逻辑
Smarty与MVC:Smarty这种开放模式,是基于MVC框架概念的。
2:安装配置
下载并解压,得到一个libs目录,复制libs目录到服务器根目录下,并为其重命名,一般该目录的名称为smarty或class等。
1)新建一个www网站应用程序目录,命名为1,复制Smarty到目录下,在Smarty目录下新建4个目录,分别是templates、templates_c、configs和cache
2)新建一个.html静态页,输入以下数据,将文件保存到刚新建的templates目录下,命名为index.html
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> <title>{ $title }</title> </head> <body> { $content } </body> </html>
{$title}、{$content}是smarty标签,大括号{}是标签的定界符,$title和$content为变量。
3)回到上级目录,在“目录/1/”下新建一个.php文件,使用smarty变量和方法对文件进行操作,输入完毕后保存为index.php
<?php /* 定义服务器的绝对路径 */ define('BASE_PATH', $_SERVER['DOCUMENT_ROOT']); /* 定义Smarty目录的绝对路径 */ define('SMARTY_PATH', '\1\Smarty\\'); /* 加载Smarty类库文件 */ require BASE_PATH.SMARTY_PATH.'Smarty.class.php'; /* 实例化一个Smarty对象 */ $smarty = new 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赋值方法将一对名称/方法发送到模板中 */ $smarty->assign('title', '第一个Smarty程序'); $smarty->assign('content', 'Hello, Welcome to study \'Smarty\'! '); /* 显示模板 */ $smarty->display('index.html'); ?>
这一步是Smarty运行最关键的核心步骤,主要进行了两项设置两步操作
A:加载Smarty类库,也就是加载Smarty.class.php文件,这里使用的是绝对路径
B:保存新建的4个目录的绝对路径到各自的变量
C:给模板赋值,assign()就是赋值方法
D:显示模板
打开浏览器,运行index.php文件,运行结果:Hello,Welcome to study ''Smarty!
4)assign 方法—— assign用于在模板被执行时为模板变量赋值,语法如下:
{assign var=" " value=" "} 参数var是被赋值的变量名,参数value是赋给变量的值
5)display 方法——用于显示模板,需要指定一个合法的模板资源的类型和路径,还可以通过第二个可选参数指定一个缓存号.第三个参数用于指定编译号。编译号可以讲一个模板编译成不同版本使用
void display (string template [, string cache_id [, string compile_id ]])
3:Smarty 模板设计
1)Smarty模板文件——是由一个页面中所有的静态元素,加上一些定界符“{...}”组成的。模板文件统一存放位置是templates目录。模板中部允许出现PHP代码段。Smarty模板中的所有注释、变量、函数等都要包含在定界符内。
2)注释——{* 这里是注释 *}
3)变量——Smarty中的变量来自3部分:
A:PHP页面中的变量——也就是assign()方法传过来的变量。使用方法和PHP中医院,也需要使用$符合。略有不同的是对数组的读取,使用.符号,如在php中是$arr->type,而smarty中是$arr.type(也可以使用下标来访问,和PHP一样:$arr[0])
<html> <head> {* 页面的标题变量$title *} <title>{ $title }</title> </head> <body> 购书信息:<p> {* 使用索引取得数组的第一个元素值 *} 图书类别:{ $arr[0] } <br/> {* 使用键值取得第二个数组元素值 *} 图书名称:{ $arr.name }<br/> {* 使用键值取得二维数组的元素值 *} 图书单价:{ $arr.unit_price.price } / { $arr.unit_price.unit } </body> </html>
<?php /* 载入配置文件 */ include '../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.html); ?>
B:保留变量
C:从配置文件中读取数据——调用配置文件中变量的格式有两种:
a:使用”#“好,将变量名置于两个”#“中间
b:使用保留变量中的$smarty_config.来调用配置文件
configs/04.conf文件
title = "调用配置文件" bgcolor="#f0f0f0" border="5" type="计算机类" name="PHP从入门到精通"
templates/04/index.html文件
{ config_load file = "04.conf" } <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> </head> <body bgcolor="{#bgcolor#}"> <table border="{#border}"> <tr> <td>{$smarty.config.type}</td> <td>{$smarty.config.name}</td> </tr> </table> </body> </html>
index.php文件
include_once '../config.php'; $smarty->display('04/index.html');
4)修饰变量——有时不仅要取得变量值,还要对变量进行处理,变量修饰的格式如下:
{ variable_name | modifer_name:parameter1:... }
variable_name为变量名称,modifer_name为修饰变量的方法名。变量和方法之间用”|“分隔。parameter1是参数值,多个参数用”:“分隔
在对变量进行修饰时,还可以同时使用多个方法,每种方法之间用”|“分隔。
变量中的字符(包括空格):{$str|count_characters:true} 使用变量修饰符后:{$str|nl2br|upper}
5)流程控制—— {if 条件语句1}{else}....
在上述条件语句中,除了使用PHP中的<、>、=、!= 等常见运算符外,还可以使用eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by等修饰词修饰
{foreach name=foreach_name key=key item=item from=arr_name}
{/foreach}
name为该循环的名称;key为当前元素的键值,item是当前元素的变量名;from是该循环的数组。其他item和from是必要参数
另一个循环语句:section,该语句用于比较复杂的数组,结构如下:
{section name="sec_name" loop=$arr_name start=num step=num}
参数含义:name是该循环的名称;loop为循环的数组;start是循环的初始位置,step表示步长
这些方法在使用上和assign、display基本一样
4:将Smarty的配置方法封装到类中
system.smarty.inc.php
require("../Smarty/Smarty.class.php"); class SmartyProject extends Smarty{ function SmartyProject(){ $this->template_dir = "./"; $this->compile_dir = "../Smarty/templates_c/"; $this->config_dir = "../Smarty/configs/"; $this->cache_dir = "../Smarty/cache"; } }
在system.inc.php中对类进行实例化,根据返回的对象名称调用Smarty中的方法,返回对象名为$smarty
require("system.smarty.inc.php"); $smarty=new SmartyProject();