PHP从入门到精通——读书笔记(第21章:Smarty模板技术)

第二十一章: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

View Code
<?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])

View Code
<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>
View Code
<?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文件

View Code
{ 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

View Code
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();
原文地址:https://www.cnblogs.com/mumue/p/2849649.html