Smarty3.x模版引擎

时间:2022-12-16 19:01:27

Smarty概述
1.Smarty是什么?
Smarty是一种从程序逻辑层(php)抽出外在(html/css)描述的PHP框架,这意味着php代码只负责逻辑应用,从外在描述中分离了出来。

2.Smarty的设计理念?
(1)抛弃应用程序中php与其它语言杂揉的描述方式,使之统一样式;
(2)php负责后台,Smarty模版负责前端;
(3)向php致意,而不是取代它;
(4)程序员、美工能够快速开发部署;
(5)快速和易于维护;
(6)语法简单、容易理解,不必具备php知识;
(7)客户在开发中富有弹性;
(8)安全:从php独立出来;
(9)免费,开源。

3.为什么要分离HTML和PHP?
(1)语法:模版由像 html 一样的语义标记构成。php语法在应用程序中运行得很好,
但一旦与 html 结合则迅速恶化。Smarty简单的{tag}语法专门为外在描述而设计。Smarty专于模版表现而少于“代码”,这可以加快模版开发同时易于维护。Smarty语法无须懂得php知识,它对程序员与非程序员都是直观的。
(2).隔离:当php与模版混合,就没有了何种逻辑类型可以注入到模版的限制。Smarty从php中独立出了模版,创建了一种从业务逻辑中分离外在表现的控制。Smarty同样具有安全特性,能够进一步加强模版的约束。

4.Smarty的工作方式
在引擎中,Smarty将模版“编译”(基于复制和转换)成php脚本。它只发生一次,当第一次读取模版的时候,指针前进时调取编译版本,Smarty帮你保管它,因此,模版设计者只须编辑 Smarty 模版,而不必管理编译版本。这也使得模版很容易维护,而执行速度非常快,因为它只是php。当然,php脚本也利用了诸如APC的缓存。

5.从Smarty3.1.28开始就全面支持PHP7了。

6.学习Smarty需要有[PHP核心基础篇][PHP核心进阶篇][PHP面向对象基础]。

Smarty安装与配置
一.工作流程图
Smarty3.x模版引擎
1.PHP 程序和模版互相赋值调用;
2.判断是否有编译文件,如果编译文件里没有它们之间的编译文件会经过Smarty引擎解析生成编译文件;
3.如果有编译文件,直接访问编译文件;
4.然后输出编译文件的内容;
5.在输出时,如果开启的缓存功能,会生成一个静态缓存;
6.最后显示在浏览器端。
7.第二次访问时,会直接访问编译文件,然后输出,然后显示,跳过Smarty引擎编译
8.第二次访问时,如果缓存开启,会直接跳过编译文件,直接访问缓存文件(静态)。

二.安装方式
1.先创建一个目录叫:tpl,然后把smarty文件夹整体拖入;
2.删除demo目录,这个是一个演示目录,瘦身必删;
3.创建一个测试文件1.php,键入以下代码:

<?php
//引入Smarty核心类文件
require 'smarty/libs/Smarty.class.php';
//实例化Smarty
$smarty = new Smarty();
//给模版赋一个值传递过去
$smarty->assign('name', 'Mr.Wang');
//调用模版页面
$smarty->display('1.tpl');

此时,会报告一个错误:Smarty: Unable to load templates 'file:1.tpl'

5.在根目录下创建一个模版文件夹templates。
6.在templates目录下创建1.tpl文件,这个文件其实一个html文件,并键入以下代码:

//html5模版代码
<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>模版调用成功</title>
</head>
<body>

</body>
</html>

7.当你刷新页面时,页面出现了想要的结果,并在根目录下又自动创建了templates_c的编译文件夹,里面还有一个编译文件。至此,初步的安装就已经完毕了。

三.配置目录
1.我们并不喜欢Smarty默认的目录结构名称,我们可以通过字段属性重新设置。

 举例:

创建1.php

<?php

require 'smarty/libs/Smarty.class.php';

$smarty = new Smarty();
//设置模版目录
$smarty->template_dir = 'view';
//设置编译目录
$smarty->compile_dir = 'compile';
//设置缓存目录
$smarty->cache_dir = 'cache';
//设置变量目录
$smarty->config_dir = 'config';
//是否开启缓存
$smarty->caching = false;

$smarty->assign('name', 'Mr.Wang');

$smarty->display('1.tpl');

创建1.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>模版调用成功</title>
</head>
<body>
{$name}
</body>
</html>

执行:http://192.168.3.62/tpl/1.php
Mr.Wang

2.可以把smarty配置代码放到根目录下的smarty.php中,分离调用。

创建smarty.php

<?php

require 'smarty/libs/Smarty.class.php';

$smarty = new Smarty();

$smarty->template_dir = 'view';

$smarty->compile_dir = 'compile';

$smarty->cache_dir = 'cache';

$smarty->config_dir = 'config';

$smarty->caching = false;

1.php调用smarty.php

<?php

require 'smarty.php';

$smarty->assign('name', 'Mr.Wang');

$smarty->display('1.tpl');

Smarty分配变量
Smarty变量赋值的一些问题,包括普通变量、数组、对象。以及怎样控制分配变量的可见范围。
一.普通变量
1.一般性变量赋值。

 举例:

创建2.php

<?php
//引入smarty.php
require 'smarty.php';
//给模版页赋值
$smarty->assign('name', 'Mr.Wang');

$smarty->display('2.tpl');

创建2.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>分配变量</title>
</head>
<body>
{*模版页取值{$name}*}
我的名字叫:{$name}
</body>
</html>

访问:http://192.168.3.62/tpl/2.php
我的名字叫:Mr.Wang

2.数组变量赋值。

 举例1:

创建2.php

<?php
//引入smarty.php
require 'smarty.php';
//一个数值索引数组
$array = array('王西西', '诗诗', '尧尧', '西西');
//给模版页赋值
$smarty->assign('array', $array);

$smarty->display('2.tpl');

创建2.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>分配变量</title>
</head>
<body>
{*可以用中括号取值*}
你的名字:{$array[0]}
{*也可以用.符号取值*}
我的名字:{$array.1}
</body>
</html>

访问:http://192.168.3.62/tpl/2.php
你的名字:王西西 我的名字:诗诗

举例2:

创建1.php

<?php
//引入smarty.php
require 'smarty.php';

//一个字符串索引数组
$stringArray = array('苹果'=>'iphoneX', '小米'=>'mix', 'meizu'=>'pro6s');
//给模版页赋值
$smarty->assign('stringArray', $stringArray);

$smarty->display('2.tpl');

创建2.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>分配变量</title>
</head>
<body>
{*可以使用中括号,需要单引号*}
苹果最新产品:{$stringArray['苹果']}
{*.符号中文不支持*}
魅族最新产品:{$stringArray.meizu}
</body>
</html>

访问:http://192.168.3.62/tpl/2.php
苹果最新产品:iphoneX 魅族最新产品:pro6s

 3.对象赋值

 创建Test.class.php

<?php
//一个类
class Test
{
    public $name = 'test';

    public function run()
    {
        return 'running...';
    }
}

创建2.php

<?php
//引入smarty.php
require 'smarty.php';
require 'Test.class.php';
//实例化这个类
$test = new Test();
//给模版赋值这个对象
$smarty->assign('obj', $test);

$smarty->display('2.tpl');

创建2.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>分配变量</title>
</head>
<body>
{*输出字段和方法*}
{$obj->name}
{$obj->run()}
</body>
</html>

访问:http://192.168.3.62/tpl/2.php
test running...

二.变量范围

1.使用createData方法可以控制是否在模版中可见变量。

创建3.php

<?php

require 'smarty.php';
//创建数据对象
$data = $smarty->createData();
//在数据对象作用域下分配变量
$data->assign('name', 'Mr.Lee');
//只有把这个对象分配到模版中,才能可见变量
$smarty->display('3.tpl', $data);

创建3.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>变量范围</title>
</head>
<body>
我的名字叫:{$name}
</body>
</html>

访问:http://192.168.3.62/tpl/3.php
我的名字叫:Mr.Wang

2.使用createTemplate方法可以控制在哪个模版中可见变量。

创建4.php

<?php
require 'smarty.php';
//设置要控制的模版文件
$tpl = $smarty->createTemplate('4.tpl');
//给这个模版文件分配变量
$tpl->assign('name', 'Mr.Wang');
//引入模版
$smarty->display($tpl);

创建4.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>变量范围</title>
</head>
<body>
我的名字叫:{$name}
</body>
</html>

访问:http://192.168.3.62/tpl/4.php
我的名字叫:Mr.Wang

Smarty保留变量
一.请求变量

1.使用{smarty.get.xxx}来获取get请求变量。

创建5.php

<?php
session_start();
require 'smarty.php';

$smarty->display('5.tpl');

创建5.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>保留变量</title>
</head>
<body>
{*/?page=1则可以获取到*}
{$smarty.get.page}
</body>
</html>

执行:http://192.168.3.62/tpl/5.php?page=1
1

2.使用{smarty.post.xxx}来获取post请求变量。

创建5.php

<?php
session_start(); require 'smarty.php'; $smarty->display('5.tpl');

创建form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="5.php" method="post">
    姓名:<input type="text" name="user"><input type="submit" value="提交">
</form>
</body>
</html>

创建5.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>保留变量</title>
</head>
<body>
{*表单post提交则可以获取到*}
{$smarty.post.user}
</body>
</html>

访问:http://192.168.3.62/tpl/form.html点击提交的内容会返回这个内容

3.使用{smarty.cookies.xxx}来获取cookie请求变量。

创建5.php

<?php
session_start();
require 'smarty.php';

setcookie('name', 'Mr.Wang');

$smarty->display('5.tpl');

创建5.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>保留变量</title>
</head>
<body>
{*获取一个cookie值*}
{$smarty.cookies.name}
</body>
</html>

访问:http://192.168.3.62/tpl/5.php
Mr.Wang

4.使用{$smarty.session.xxx}来获取session请求变量。

创建6.php

<?php
session_start();
require 'smarty.php';

$_SESSION['admin'] = '西西';

$smarty->display('6.tpl');

创建6.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>保留变量</title>
</head>
<body>
{*获取一个session值*}
{$smarty.session.admin}
</body>
</html>

访问:http://192.168.3.62/tpl/6.php
西西

5.使用{$smarty.env.xxx}来获取env的环境变量。
6.使用{$smarty.server.xxx}来获取server的环境变量

smarty还有一个request的获取方式,是联合了上面几种,智能获取。当然,由于安全性的隐患,这种方式不推荐。

二.保留变量
1.使用{$smarty.now}来获取当前时间戳。
//获取当前时间戳
{$smarty.now}

2.使用{$smarty.contst.xxx}获取常量值。

创建7.php

<?php
session_start();
require 'smarty.php';

define('PI', 3.14);

$smarty->display('7.tpl');

创建7.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>保留变量</title>
</head>
<body>
{*获取常量*}
{$smarty.const.PI}
</body>
</html>

访问:http://192.168.3.62/tpl/7.php
3.14

3.使用{$smarty.current_dir}获取模版目录名
//获取当前的模版目录名
{$smarty.current_dir}

4.使用{$smarty.version}获取smarty版本信息。
//获取smarty版本信息
{$smarty.version}

 

Smarty基本语法
Smarty基本语法的一些问题,包括注释、变量、函数和运算等等
一.基本语法

1.Smarty注释功能。

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<!--我是HTML注释,但是不会在编译中消失-->
{*我是smarty注释,编译后会自动消失*}
</body>
</html>

2.忽略Smarty解析。

//让smarty变量原样输出
<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{literal}
    {$name}
{/literal}

</body>
</html>

执行原样输出:http://192.168.3.62/tpl/6.php
{$name}

3.可以直接使用函数。
//直接使用函数
{time()}

4.可以做运算。
//变量做加法运算

创建6.php

<?php

require 'smarty.php';

$smarty->assign('x', 5);
$smarty->assign('y', 8);

$smarty->display('6.tpl');

创建6.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{$x + $y}
</body>
</html>

执行:http://192.168.3.62/tpl/6.php
13

5.也可以直接在模版声明变量和输出。
创建6.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

{*声明变量*}
{$name = 'Mr.Wang'}
{*输出*}
{$name}

{*数组也可以在模版声明*}
{$array = array(1, 2, 3)}
{*输出*}
{$array[0]}

</body>
</html>

执行:http://192.168.3.62/tpl/6.php
Mr.Wang1

Smarty变量调节器

一.变量调节器

1.英文单词首字母大写
//每个英文单词首字母大写
{$string|capitalize}
//包含数字的英文字母,首字母和数字后第一个字母大写
{$string|capitalize:true}

2.英文单词全部大写
//大写
{$string|upper}

3.英文单词全部小写
//小写
{$string|lower}

4.字符串连接
//连接字符串
{$string|cat:' Yes!'}

5.设置字符行宽
//设置 10 个字符换行,默认换行为\n,如果不是 10,则默认 80
{$string|wordwrap:10}
//换行使用<br>
{$string|wordwrap:10:'<br>'}

6.设置换行
//将\n 或换行设置成<br>
{$string|nl2br}

7.将 HTML 实体转义
//转义字符串
{$string|escape}

8.反转义
//反转义字符串
{$string|unescape}

9.去除多余空格
//去除多余空格
{$string|strip}
//去除多余空格并用&nbsp;代替空格
{$string|strip:'&nbsp;'}

10.清楚标记
//清除 HTML 标记
{$string|strip_tags}
//false 去除多余空格
{$string|strip_tags:false}

举例:

创建7.php

<?php
require 'smarty.php';


$smarty->assign('string', "this is a &lt;music&gt;                <strong>tea2cher</strong>!");

$smarty->display('7.tpl');

创建7.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

{*1.每个英文单词首字母大写*}
{$string|capitalize}
<br>
{*2.英文单词全部大写*}
{$string|upper}
<br>
{*3.英文单词全部小写*}
{$string|lower}
<br>
{*4.连接字符串*}
{$string|cat:' Yes!'}
<br>
{*5.设置10个字符换行,默认换行为\n,如果不是10,则默认8*}
{$string|wordwrap:10:'<br>'}
<br>
{*6.将\n 或换行设置成<br>*}
{$string|nl2br}
<br>
{*7.将HTML实体转义*}
{$string|escape}
<br>
{*8.反转义字符串*}
{$string|unescape}
<br>
{*9.去除多余空格*}
{$string|strip:'&nbsp;'}
<br>
{*10清除HTML标记*}
{$string|strip_tags}

</body>
</html>

执行:http://192.168.3.62/tpl/7.php
This Is A &Lt;Music&Gt; tea2cher!
THIS IS A <MUSIC> TEA2CHER!
this is a <music> tea2cher!
this is a <music> tea2cher! Yes!
this is a
<music>
tea2cher!
this is a <music> tea2cher!
this is a &lt;music&gt; <strong>tea2cher</strong>!
this is a tea2cher!
this is a <music> tea2cher!
this is a <music> tea2cher !

11.计算字符的数量
//获取字符数量
{$string|count_characters}
//将空格也算进去
{$string|count_characters:true}


12.计算字符段落
//就是字符的段落数
{$string|count_paragraphs}


13.就是字符句数
//换行+结束符号算一个句子
{$string|count_sentences}


14.计算词数
//单词的数量
{$string|count_words}


15.格式化时间
//将时间戳格式化成日期时间
{time()|date_format}
//添加参数,更加利于理解
{time()|date_format:'Y-m-d H:i:s'}


16.默认值
//但数据为空时,设置一个默认值
{$string|default:'没有数据'}


17.缩进
//默认缩进是空格,改成&nbsp;产生页面效果
{$string|indent:10:'&nbsp;'}


18.在字符之间插空
//在每个字符之间插一个空格
{$string|spacify}
//在买个字符之间插入一个指定的字符
{$string|spacify:'&'}


19.格式化
//小数点保留 2 位
{'45.678'|string_format:'%.2f'}


20.截取字符串
//10 位后截取,自动添加...(含三个点共 10 位),默认 80
{$string|truncate:10}
//10 位后截取,没有添加...
{$string|truncate:10:true}
//整体保留 10 位,头尾保留,中间裁剪
{$string|truncate:10:'...':true:true}

创建8.php

<?php

require 'smarty.php';

$smarty->assign('string', "this is a teacher!");

$smarty->display('8.tpl');

创建8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*11.获取字符数量*}
{$string|count_characters}
<br>
{*11.将空格也算进去*}
{$string|count_characters:true}
<br>
{*12.就是字符的段落数*}
{$string|count_paragraphs}
<br>
{*13.换行+结束符号算一个句子*}
{$string|count_sentences}
<br>
{*14.单词的数量*}
{$string|count_words}
<br>
{*15.将时间戳格式化成日期时间*}
{time()|date_format:'Y-m-d H:i:s'}
<br>
{*16.数据为空时,设置一个默认值*}
{$string|default:'没有数据'}
<br>
{*17.默认缩进是空格,改成&nbsp;产生页面效果*}
{$string|indent:10:'&nbsp;'}
<br>
{*18.在每个字符之间插入一个指定的字符*}
{$string|spacify:'&'}
<br>
{*19.小数点保留2位*}
{'45.678'|string_format:'%.2f'}
<br>
{*20.10位后截取,自动添加___(含三个_共10位),默认80*}
{$string|truncate:10:'___'}
<br>
{*20.10位后截取,自动添加三个空格(含三个空格共10位),默认80*}
{$string|truncate:10:''}
<br>
{*20.整体保留10位,头尾保留,中间裁剪*}
{$string|truncate:10:'...':true:true}
<br>

</body>
</html>

执行:http://192.168.3.62/tpl/8.php
15
18
1
1
4
2018-03-01 10:14:56
this is a teacher!
          this is a teacher!
t&h&i&s& &i&s& &a& &t&e&a&c&h&e&r&!
45.68
this is___
this is a
thi...er!

二.组合调节器
顾名思义,即多个调节器作用于变量。
//多个调节器用|号隔开即可
{$string|truncate:10|indent:10:'&nbsp;'}

创建8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*多个调节器用|号隔开即可*}
{$string|truncate:10|indent:10:'&nbsp;'}

</body>
</html>

执行:http://192.168.3.62/tpl/8.php
          this is...

Smarty的内置函数功能          
一.内置函数
1.使用{$var=...}来创建一个变量。
//在模版中创建变量
{$name = 'Mr.Lee'}
//输出变量
{$name}

2.使用{assign}来为变量赋值。
//这又是一种创建变量方式
{assign var='name' value='Mr.Lee'}
//输出
{$name}

3.使用{append}来创建数组变量。
//value 表示值,index 表示字符串索引
{append var='name' value='Mr.' index='first'}
{append var='name' value='Lee' index='last'}
//输出
{$name.first}

4.使用{literal}来避免模版解析。
//避免模版解析
{literal}
{$name}
{/literal}

5.左右花括号转义
//直接输出左右花括号
{ldelim}{rdelim}

6.加载其它模版页面
//加载一个模版页面
{include file='hr.tpl'}

7.清除标记中的空格
//清除空格和换行
{strip}
<table>
<tr>
<td>1</td>
</tr>
</table>
{/strip}

8.加载配置文件          
举例:
创建配置文件web.conf

webname='淘宝'
keywords='购物_低价'

[base]
name='Miss.Wang';

创建1.php

<?php

require 'smarty.php';

$smarty->assign('string', "this is a teacher!");

$smarty->display('1.tpl');

创建1.tpl配置文件全局变量加载方式

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*加载配置文件*}
{config_load file='web.conf'}

{*输出配置文件全局变量*}
{#webname#},{#keywords#}

</body>
</html>    

打印输出:http://192.168.3.62/tpl/1.php
淘宝,购物_低价

创建1.tpl节点块全局变量输出方式

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*加载节点块*}
{config_load file='web.conf' section='base'}

{*输出节点块全局变量*}
{#name#}

</body>
</html>    

打印输出:http://192.168.3.62/tpl/1.php          
Miss.Wang

9.在模版中使用if条件语句
//简单的if语句
{if $name=='Mr.Lee'}
找到此人
{/if}
//else
{if $name=='Mr.Lee'}
找到此人
{else}
找不到此人
{/if}

注意:除了简单的if语句也可以加入elseif和else。只不过复杂的逻辑判断,不太推荐在模版端进行了

10.使用while循环语句
//表达式和if一样
{while $num < 10}
{$num++}
{/while}

11.使用for循环语句
//for 循环
{for $i = 1 to 10}
{$i}
{/for}

12.使用foreach遍历
//数组赋值
$smarty->assign('array', array('red', 'green', 'blue'));
//简单的遍历数组
{foreach $array as $value}
{$value}
{/foreach}
//打印出索引值
{foreach $array as $key=>$value}
{$key}->{$value}
{/foreach}
//关联数组
$smarty->assign('array',
array('btx'=>'red', 'opd'=>'green', 'wya'=>'blue'));
//另一种索引值获取方式,Smarty3 新语法
{foreach $array as $value}
{$value@key}
{/foreach}
//获取从0开始的索引,即使是关联数组,也会获取数值索引
{foreach $array as $value}
{$value@index}
{/foreach}
//获取从 1 开始的迭代值,不是索引
{foreach $array as $value}
{$value@iteration}
{/foreach}
//获取第一个元素
{foreach $array as $value}
{if $value@first}
{$value}
{/if}
{/foreach}
//获取最后一个元素
{foreach $array as $value}
{if $value@last}
{$value}
{/if}
{/foreach}
//判断数组是否有输出
{foreach $array as $value}
{$value}
{/foreach}
//可以在外部
{$value@show}
//获取数组元素总数
{foreach $array as $value}
{$value}
{/foreach}
//遍历内部或外部均可
{$value@total}
//终止迭代
{foreach $array as $value}
{if $value == 'green'}
{break}
{/if}
{$value}
{/foreach}
//终止当前迭代
{foreach $array as $value}
{if $value == 'green'}
{continue}
{/if}
{$value}
{/foreach}
//如果没有数据的情况下
{foreach $array as $value}
{$value}
{foreachelse}
没有数据
{/foreach}

13.使用section来遍历数组
{foreach}可以做{section}能做的所有事,而且语法更简单、更容易。它通常是循环数组的首选。
{section}循环不能遍历关联数组,(被循环的)数组必须是数字索引,像这样(0,1,2,...)。对于关联数组,请用{foreach}循环。

终上所述:推荐使用foreach,而section的一些foreach没有的功能其实都应该在PHP程序下编写而不是在模版中。
1.简单的遍历
//索引数组,关联数组无法获取
$smarty->assign('array', array('red', 'green', 'blue'));
//遍历
{section loop=$array name=value}
{$array[value]}
{/section}

2.未分配变量的遍历
//输出 10,12,14,16,18
{section start=10 loop=20 step=2 name=value}
{$smarty.section.value.index}
{/section}

 

Smarty的自定义函数功能
一.自定义函数
1.计数函数
//默认从1开始,每次累加1
{counter}
{counter}
{counter}
{counter}
{counter}
//设置开始数字,步长和递增递减,从中间设置或多次设置也可以
{counter start=3 skip=2 direction=up}
//设置不输出
{counter print=false}
//设置为变量值输出
{counter assign=a}
{$a}

2.交替使用一组值
//通过复制多行一下单元格,可以交替三种背景,实现斑马效果
<td style="background:{cycle values='#eee,#ccc,#fff'}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
<td style="background:{cycle}">1</td>
//重置交替
{cycle reset=true}
//values 改变分割符号
{cycle delimiter='|' values='#eee|#ccc|#fff'}
//是否让当前这条不交替到下一个值
{cycle advance=false}
剩下的一些属性:print、assign等常规属性,不再演示。

3.变量的另一种函数形式
//模版变量
{eval var=$name}
//配置文件变量,可以使用assign分配一个新变量名
{eval var=#webname# assign=c}

4.引入其他文件的源代码
//引入其他源代码,可以使用assign赋值给变量
{fetch file='http://www.baidu.com'}

5.电子邮件生成
//使用电子邮件功能
{mailto address='bnbbs@163.com'}
//邮件连接的文字和邮件的主题设置
{mailto address='bnbbs@163.com' text="我的邮箱" subject="一封家书"}

6.计算功能
//最终得到0
{math equation='x+y' x=20 y=30}
//数值格式化
{math equation='x+y' x=20 y=30 format='%.2f'}
注意:{math}函数性能较低,不推荐使用。还有一个{textformat}文字格式化,比如缩进换行之类的,也没什么用,都是 CSS 控制。

7.开启调试模式
//开启
{debug}

二.自定义函数
1.使用{html_checkboxes}创建复选框。
举例:
创建8.php

<?php

require 'smarty.php';
//先创建一个数组
//先创建一个数组
$smarty->assign('array', array(
                                       '测试1'=>'东东',
                                       '测试2'=>'南南',
                                       '测试3'=>'西西',
                                       '测试4'=>'北北'
));
//设置首选值,先设置一个首选变量
$smarty->assign('id', '测试2');

$smarty->display('8.tpl');

创建8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{*模版载入数组,options属性可以将索引作为value值作为作为text*}
{html_checkboxes options=$array}

{*如果设置value和text均为数组的元素值,或者两个数组分别设置*}
{html_checkboxes values=$array output=$array}

{*name属性可以设置name名称*}
{html_checkboxes options=$array name="user"}

{*模版设置首选项*}
{html_checkboxes options=$array selected=$id}

{*去除默认的label*}
{html_checkboxes options=$array labels=false}

{*添加分隔符,比如<br>换行*}
{html_checkboxes options=$array labels=false separator='<br>'}

</body>
</html>

2.使用{html_radios}创建单选框。
//模版处,其它属性和复选框一致
{html_radios options=$array checked=$id}

3.使用{html_options}创建select下拉列表选项。
//option的列表,还包含name、values、output这几个属性
<select>
{html_options options=$array selected=$id}
</select>
//实现optgroup群组下拉

举例:创建8.php

<?php

require 'smarty.php';

$smarty->assign('id', '测试4');

$smarty->assign('array2', array(
    'a'=>array(
        '测试1'=>'111',
        '测试2'=>'222',
        '测试3'=>'333',
    ),
    'b'=>array(
        '测试4'=>'444',
        '测试5'=>'555',
        '测试6'=>'666'
    )
));

$smarty->display('8.tpl');

创建8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<select>
    {html_options options=$array2 selected=$id}
</select>

</body>
</html>

4.使用{html_select_date}创建日期
//通过属性设置,调整时间
{html_select_date month_format='%m' start_year='1999'
end_year='2016' field_order='YMD'}

5.使用{html_select_time}创建时间
{html_select_time}

Smarty的缓存功能
一.页面缓存
1.先使用数据库加载一组数据。

//PDO 数据库连接
$pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
//设置字符集
$pdo->query('SET NAMES UTF8');
//得到准备对象
$stmt = $pdo->prepare("SELECT * FROM one");
//执行SQL语句
$stmt->execute();
//初始化
$object = [];
//组装数据列表
while ($rows = $stmt->fetchObject()) {
    $object[] = $rows;
}
    $smarty->assign('object', $object);

$smarty->display('8.tpl');

输出显示8.tpl

<!doctype html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>使用缓存</title>
</head>
<body>
{*输出显示*}
<table border="1">
    <tr>
        <th>姓名</th>
        <th>数学</th>
        <th>语文</th>
        <th>外语</th>
    </tr>
    {foreach from=$object item=obj}
        <tr>
            <td>{$obj->user}</td>
            <td>{$obj->math}</td>
            <td>{$obj->chinese}</td>
            <td>{$obj->english}</td>
        </tr>
    {/foreach}
</table>

</body>
</html>

暴露问题:这张数据表,可能很长时间不会有所改动,比如一天,一周,一个月都不会改动。但是,用户每次访问,都要经过数据库,造成性能上的极大浪费。这时,我们想通过缓存技术,将第一次生成的页面静态化,然后以后就访问这个静态页面,从而避免执行数据库操作。

2.开启缓存
第一步:在配置文件smarty.php里开启缓存设置

<?php

require 'smarty/libs/Smarty.class.php';

$smarty = new Smarty();

$smarty->template_dir = 'view';
$smarty->compile_dir = 'compile';
//缓存目录
$smarty->cache_dir = 'cache';
$smarty->config_dir = 'config';
//开始缓存true
$smarty->caching = true;
//建立缓存周期
$smarty->cache_lifetime = 3600;

$smarty->left_delimiter = '{';
$smarty->right_delimiter = '}';

刷新页面后,会自动生成cache目录。并生成了一个静态页面,下次访问是会访问这个静态页面。不会因为数据库数据改变,而发生变化。但是,这个地方还是有问题的,虽然访问的是静态页面。但并没有说,不执行PHP连接数据库,执行数据库这个步骤,所以,我们还需要进行静态页面的判断工作。

3.判断缓存
第二步:if判断8.tpl缓存是否存在

<?php

require 'smarty.php';

//判断缓存存在的话,就不执行PHP的数据库链接和操作
if (!$smarty->isCached('8.tpl')) {
    //PDO 数据库连接
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=xixi', 'xixi', '123456');
    //设置字符集
    $pdo->query('SET NAMES UTF8');
    //得到准备对象
    $stmt = $pdo->prepare("SELECT * FROM one");
    //执行SQL语句
    $stmt->execute();
    //初始化
    $object = [];
    //组装数据列表
    while ($rows = $stmt->fetchObject()) {
        $object[] = $rows;
    }

    $smarty->assign('object', $object);
}
$smarty->display('8.tpl');

先判断缓存是否存在,然后再执行PHP代码(包括执行数据库连接和执行)。如果存在缓存,就直接忽略PHP代码部分,直接读取缓存,这样避免数据库执行浪费。

二.局部不缓存
1.使用{nocache}...{/nocache}让局部不缓存。
{nocache}
{$smarty.now|date_format:"Y-m-d H:i:s"}
{/nocache}

2.如果不缓存的内容本身是标签,可以在标签后直接加上nocache即可。
{$smarty.now|date_format:"Y-m-d H:i:s" nocache}