首页 > 代码库 > 我的PHP之旅--认识Smarty
我的PHP之旅--认识Smarty
什么是Smarty
smarty是模板引擎,它的作用是便于团队开发,PHP程序员负责PHP程序编写 提供数据,前端程序员负责编写静态页面,Smarty在中间负责一种类似于桥梁的作用。
其实模板引擎很多,但为什么要学习Smarty呢?
- Smarty相对于其他的模板引擎 有速度上的优势。
- 在重复使用模板引擎时直接访问编译文件 不需要再重新编译模板。
- Smarty拥有缓存技术,可以将我们看到的HTML文件缓存成一个静态的HTML页面。
- Smarty可以自定义一些插件。
- Smarty的表现逻辑比较强。
使用Smarty
www.smarty.net/download下载后将libs文件夹导入到项目目录。
在项目中创建两个文件夹:1、templates(模板目录),2、templates_c(编译目录)
创建index.php(php人员的工作) 代码如下:
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include "libs/Smarty.class.php"; // 实例化smarty对象 $smarty = new Smarty(); // 设置相关属性 $smarty->setTemplateDir(‘templates‘); // 模板目录 $smarty->setCompileDir(‘templates_c‘); // 编译目录 // 分配数据 $smarty->assign(‘title‘, ‘smarty模板引擎‘); $smarty->assign(‘content‘, ‘smarty是一个很好的模板引擎‘); // 载入视图 $smarty->display(‘index.html‘);
创建index.html(前端人员工作) 代码如下:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>{$title}</h1> <p>{$content}</p> </body> </html>
上面只是简单的例子,下面我们来正式学习下smarty
定界符
上面在index.html中使用的“{}”就是定界符,用户解析数据来显示。
注意点:
- 任何在定界符之外的代码都是静态的,是不会被解析的,包括PHP代码。
- so 如果.html中存在CSS代码和JS代码需要做处理,不然会有冲突
- 1、更换定界符:
// 重新定义定界符 $smarty->left_delimiter = ‘<{‘; $smarty->right_delimiter = ‘}>‘;
- 2、内嵌的js和css使用内置函数:{literal}这中间包含你不想让smarty解析的代码{/literal},尽量使用外部引用的js和css。(推荐)
<!DOCTYPE html> <html> <head> <title></title> <style> {literal} h1{ color: red; } p{ font-size: 20px; } {/literal} </style> </head> <body> <h1>{$title}</h1> <p>{$content}{*这是注释*}</p> </body> </html>
- 1、更换定界符:
注释
注释写法:左定界符+注释内容+右定界符,默认为 {*注释内容*}
变量
在smarty中变量有3种:
- 通过PHP程序中的 assign函数分配过来。
- 保留变量
- 配置变量
assign变量
我们最常用的。其中分类有三种:
- 标量变量:整形(int)、浮点型(float、double)、字符串(string)、布尔型(bool)。
- 符合变量:数组(array)、对象(object)。
- 特殊类型:资源、null。
- 不适合做分配的:对象,资源,null。
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include ‘libs/Smarty.class.php‘; // 初始化smarty对象 $smarty = new Smarty(); // 配置 $smarty->setTemplateDir(‘templates‘); $smarty->setCompileDir(‘templates_c‘); // 分配变量 $smarty->assign(‘score‘,100); $smarty->assign(‘is_show‘,false); $user = array(‘alex‘,‘alice‘,‘sky‘); $smarty->assign(‘user‘,$user); $book = array(‘id‘=>1,‘name‘=>‘learn Smarty‘,‘author‘=>‘xxx‘); $smarty->assign(‘book‘,$book); // 载入 $smarty->display(‘index.html‘);
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>标量变量</h1> <p>{$score}</p> <p>{$is_show}</p> <h1>索引数组</h1> <ul> <li>{$user[0]}</li> <li>{$user.1}</li> <li>{$user[2]}</li> </ul> <h1>关联数组</h1> <ul> <li>{$book[‘id‘]}</li> <li>{$book[‘name‘]}</li> <li>{$book.author}</li> </ul> </body> </html>
保留变量
无需用assign分配,直接可以在模板页面中引用的变量。其中包括PHP的超全局变量($_GET , $_SERVER)还有一些Smarty自带的一些变量。
使用格式:{$smarty.变量名}
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include ‘libs/Smarty.class.php‘; // 初始化smarty对象 $smarty = new Smarty(); // 配置 $smarty->setTemplateDir(‘templates‘); $smarty->setCompileDir(‘templates_c‘); // 定义常量(无需调用assign) define(‘ROOT‘,getcwd()); // 载入 $smarty->display(‘index.html‘);
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>保留变量</h1> <p>{$smarty.server.SERVER_NAME}</p> <p>{$smarty.now}</p> <p>{$smarty.version}</p> {* 这是PHP中定义的常量 引用格式为:$smarty.const.常量名 *} <p>{$smarty.const.ROOT}</p> </body> </html>
配置变量
无需assign分配,多为前端开发人员使用,首先在项目中创建一个configs文件夹,在configs文件夹下创建配置文件test.conf
格式:{#配置变量#}或{$smarty.config.配置变量}
配置文件(test.conf):
number = ‘a2589‘ lang = ‘en‘ [style1] color = #ff00ff [style2] color = red
用法:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>配置变量</h1> <p>首先需要引入配置文件后使用</p> {config_load file = ‘test.conf‘ section=‘style1‘} <p>{$smarty.config.number}</p> <p>{#number#}</p> <p>{#color#}</p> </body> </html>
配置文件可以分段载入,只需要设置section参数即可。
内置函数
可分为三大类:
- 内置函数。
- 变量修饰器。
- 函数插件(自定义函数)
1、if/else
和php完全一样,实现选择分支,可用数学运算。
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include ‘libs/Smarty.class.php‘; // 初始化smarty对象 $smarty = new Smarty(); // 配置 $smarty->setTemplateDir(‘templates‘); $smarty->setCompileDir(‘templates_c‘); // 分配变量 $smarty->assign(‘iq‘,60); // 载入 $smarty->display(‘if.tpl‘);
<html> <head> </head> <body> <h1>if/else使用</h1> <p>已读取您的IQ:{$iq}</p> <p>您的潜力分析: {if $iq >= 130} 您的潜力很高,天生的天才。 {elseif $iq >= 110 && $iq < 130} 您的天资较高,如果付出相应的努力肯定会成为一个人才。 {elseif $iq >= 90 && $iq < 110} 您的天资一般,但是如果能够比别人付出更多些,肯定会得到相应的回报。 {else} 。。。早点休息吧 {/if} </p> </body> </html>
2、foreach
和PHP一样 foreach是循环遍历用的,格式:{foreach $array as $item} 或 {foreach $array as $key => $item}
例子:
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include ‘libs/Smarty.class.php‘; // 初始化smarty对象 $smarty = new Smarty(); // 配置 $smarty->setTemplateDir(‘templates‘); $smarty->setCompileDir(‘templates_c‘); // 分配变量 $user = array(‘alex‘,‘alice‘,‘alisa‘); $child = array(‘id‘ => 5, ‘name‘ => ‘Ben‘, ‘age‘ => 4); $class = array( array(‘id‘ => 0, ‘name‘ => ‘Crystal‘, ‘age‘ => 6), array(‘id‘ => 1, ‘name‘ => ‘Candy‘, ‘age‘ => 5), array(‘id‘ => 2, ‘name‘ => ‘Gina‘, ‘age‘ => 7), array(‘id‘ => 3, ‘name‘ => ‘Zoe‘, ‘age‘ => 6) ); $smarty->assign(‘user‘, $user); $smarty->assign(‘child‘, $child); $smarty->assign(‘class‘, $class); // 载入 $smarty->display(‘if.tpl‘);
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>枚举数组</h1> <ul> {foreach $user as $name} <li>{$name}</li> {/foreach} </ul> <h1>关联数组</h1> <ul> {foreach $child as $key => $item} <li>{$key} ------ {$item}</li> {/foreach} </ul> <h1>二维数组</h1> <table width="500" border="1"> <tr> <td>id</td> <td>name</td> <td>age</td> </tr> {foreach $class as $childs} <tr> {foreach $childs as $item} <td>{$item}</td> {/foreach} </tr> {/foreach} </table> <h1>二维数组(第二种写法)</h1> <table width="500" border="1"> <tr> <td>id</td> <td>name</td> <td>age</td> </tr> {foreach $class as $childs} <tr> <td>{$childs.id}</td> <td>{$childs.name}</td> <td>{$childs.age}</td> </tr> {/foreach} </table> </body> </html>
foreach还有一些属性 非常有用:
- @index:当前数组的索引,从0开始。
- @iteration:当前循环的次数,从1开始。
- @first:首次循环时,这个值为true。
- @last:循环到最后一次时,这个值是false。
- @total:循环的总次数。
- @show:在循环完之后,检测数据是否显示。
<table width="500" border="1"> <tr> <td>id</td> <td>name</td> <td>age</td> </tr> {foreach $class as $childs} <tr class = "{if $childs@first}first{elseif $childs@last}last{/if}"> <td>{$childs.id}</td> <td>{$childs.name}</td> <td>{$childs.age}</td> </tr> {/foreach} </table>
foreach拓展:可以使用{foreachelse}分支,当数组没有内容时会分配到此分支。
3、section
section也是用于循环的,只不过它只适用于枚举数组,关联数组不能使用,介绍下section的参数:
- name:字符串类型 必须设置 section的名称。
- loop:必须设置 用于循环的值,也就是要循环的次数,通常是一个整形,也可以是一个数组,如果是数组的话就会自动调用count函数对数组进行统计,循环数组count的值得次数。
- start:整形 不是必须设置 设置开始循环的下标,如果是负数,那么就从总循环次数开始计算,比如:总循环7次 设置start为-2 那么这次循环就会从下标为5的位置开始。
- step:整形 不是必须设置 设置每次循环的步长,如:step=2 那么循环下标为:0,2,4,6,8.....
- max:整形 不是必须设置 设置循环的最大次数,
- show:布尔型 不是必须设置 是否显示循环内容。
例子:
<?php /** * Created by PhpStorm. * User: Alex * Date: 2017/1/10 * Time: 12:46 */ include ‘libs/Smarty.class.php‘; // 初始化smarty对象 $smarty = new Smarty(); // 配置 $smarty->setTemplateDir(‘templates‘); $smarty->setCompileDir(‘templates_c‘); // 分配变量 $user = array(‘alex‘,‘alice‘,‘alisa‘,‘ben‘); $smarty->assign(‘user‘,$user); // 载入 $smarty->display(‘index.html‘);
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>section</h1> <ul> {section name = ‘index‘ loop = $user} <li>{$user[index]}</li> {/section} </ul> </body> </html>
section也可以使用:total、first、last、iteration、index等属性
我的PHP之旅--认识Smarty