学习目标

  • Smarty基本概念
  • Smarty安装和配置
  • Smarty模板设计
  • Smarty流程控制

Smarty基本概念

一种模板引擎,在系统中进行预处理和过滤数据。是主流的PHP模板引擎,此外PHP中常用的模板引擎还有SimpleTemplate等。

主要特点:

  1. 强大的逻辑处理能力。
  2. 模板编译能力。把模板编译成高效的PHP语言,编译后的模板为web程序提供高效率渲染请求。
  3. 可选择的缓存。可以设定某些常用模板存储在缓存中,为常用模板提供快速加载功能。
  4. 可设置和可扩展性。smarty基于面向对象开发,具备良好的扩展性。
  5. 长期的应用验证了其安全性。

Smarty作为PHP Web程序的MVC设计模式中View的具体实现。

Smarty的安装和配置

下载最新版本V3.1.32:

https://github.com/smarty-php/smarty/releases/tag/v3.1.32

3.x版本要求PHP版本必须为5.2以上。

下载解压后提取smarty核心目录libs。

解压到PHP项目中(为了便于项目代码管理,建议创建smarty目录用于存放smarty的libs目录)

各个目录和文件的作用在samrty模板的配置文件中以注释的方式说明如下:

<?php
/**
* 创建和初始化smarty公共文件(位于smarty/init.inc.php)
*/
define("ROOT", str_replace("\\", "/", dirname(__FILE__) . "/"));//指定项目的根路径
require ROOT . "/libs/Smarty.class.php";
$smarty = new Smarty();//实例化模板引擎 //配置模板
$smarty->setTemplateDir(ROOT . "templates/")//自定义模板文件存放目录
->addTemplateDir(ROOT . "templates2/")//smarty可以自定义多个模板文件存放目录
->setCompileDir(ROOT . 'templates_c')//自定义模板编译后的文件存放目录
->setPluginsDir(ROOT . 'plugins/')//自定义模板扩充插件目录
->setCacheDir(ROOT . 'cache/')//自定义模板缓存目录
->setConfigDir(ROOT . 'configs');//自定义存放模板配置文件目录 $smarty->caching = false; //设置模板缓存开关
$smarty->cache_lifetime = 24 * 60 * 60;//设置模板缓存有效时间
$smarty->left_delimiter = '<{';//设置模板语言左结束符
$smarty->right_delimiter = '}>';//设置模板语言右结束符号

  

编写模板文件test.tpl存放于templates目录下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><{$title}></title>
</head>
<body>
<{*这是smarty模板的注释*}>
<{$content}>
</body>
</html>

  

编写模板应用程序脚本index.php位于项目根目录下:

<?php
require 'smarty/init.inc.php';
$smarty->assign("title","smarty测试网页标题");
$smarty->assign("content","smarty测试网页内容");
$smarty->display("test.tpl");

  

运行index.php效果:

Smarty模板设计

主要方法

1.assign()方法

语法格式

void assign(string varname,mixed var);//传递名/值对到模板中
void assign(mixed var);//传递包含名/值对的关联数组到模板中

  

2.display()方法

语法格式

void display(string template[,string cache_id[,string compile_id]]);//获取和显示smarty模板

  

string template可以表示绝对路径或者相对路径。windows平台的绝对路径使用“file:”作为前缀。

cache_id和compile表示一个页面用于多个缓存时设置。

Smarty模板基本语法

1.注释

<{*这是smarty模板的注释*}>

  

2.变量

Smarty模板中的变量都是全局的。如果前后多次设置同名变量,则最后的值有效。

命名规则:与php变量命名规则一致。

变量可以是:数组,多维数组,对象和属性,对象的方法。

数组的访问:"."访问关联数组元素,例如:

<{$arrname.index}>

  

也可以使用PHP语法风格,例如:

<{$arrname['index']}>

  

对象属性和方法和访问和PHP一致:通过"->"访问。

3.表达式

支持在表达式中进行运算、函数的调用、对象属性和方法的调用(需要安全策略支持)。

{$a+$b}
{$size=count($arr)}
{$obj->propername}

  

4.遍历数组

语法格式:

{foreach $array as $item}...{/foreach}  //遍历数组$array中的值

{foreach $array as $key=> $value}...{/foreach} //遍历数组$array中索引和值

或者

{foreach item=value  from=$array}

  

5.引入公共模板文件

{include file="header.tpl"}

  

6.获取session、get、cookie、server中的数据

{$smarty.get.page} {* PHP方式:$_GET["page"] *} 

{$smarty.post.page} {* PHP方式:$_POST["page"] *}

{$smarty.cookies.username} {* PHP方式:$_COOKIE["username"] *} 

{$smarty.session.id}  {* PHP方式:$_SESSION["id"] *}  

{$smarty.server.SERVER_NAME}   {* PHP方式:$_SERVER["SERVER_NAME"] *} 

{$smarty.env.PATH}   {* PHP方式:$_ENV["PATH"]*} 

{$smarty.request.username}  {* PHP方式:$_REQUEST["username"] *}

  

Smarty的流程控制

1.foreach循环和if语句

{foreach item=$value from=$array}
{if $value==1}
//....
{elseif $value==2}
//...
{else}
//...
{/if}
</foreach>

  

2.section循环

{section}可以循环遍历连续数字索引的数组, 区别于{foreach} 可以循环任意关联数组. 每个{section}标签都必须有一个匹配的{/section}关闭标签。

{section}不能用于循环关联数组,它仅能循环数字索引的、连续下标的 (0,1,2,...)数组。 要循环关联数组,请使用{foreach}。

模板中设置变量:

$people = array('tony','sweety','abc','four');
$smarty->assign('people',$people);

  

使用section读取:

{section name=n loop=$people} //name表示循环变量,loop表示访问的数组
name:{$people[n]}<br/>
{/section}

  

输出:

name:tony
name:sweety
name:abc
name:four

  

PHP15 Smarty模板的更多相关文章

  1. Smarty模板引擎技术

    Smarty模板引擎技术 什么是模板引擎? 什么是Smarty模板引擎? 为何选择Smarty模板引擎? 如何使用Smarty模板引擎? 一.历史背景 场景一:回顾之前编写PHP项目的方式 //链接数 ...

  2. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  3. 12月15日下午Smarty模板函数

    1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...

  4. 12月15日smarty模板基本语法

    smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...

  5. SMARTY模板中如何使用get,post,request,cookies,session,server变量

    {$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间戳.直接访问PHP中 ...

  6. ThinkPHP3.2.3整合smarty模板(二)

    前言:继ThinkPHP3.2.3整合smarty模板(一)之后,继续来探讨一下tp框架整合smarty模板,看到有人在群上问到怎么使用自定义的常量,今天就具体来谈谈: 一.开发一个项目,必不可少会用 ...

  7. smarty 模板几个例子

    一.assign和display方法的使用以及几个变量调节器 header("content-type:text/html;charset=utf-8");//加载Smarty引擎 ...

  8. smarty模板引擎

    1.    使用smarty 1.1 项目引入 // 3, 连接数据库,提取相关数据 $title = "Smarty模板引擎"; $content = "Smarty模 ...

  9. Smarty模板函数

    1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...

随机推荐

  1. linux 下 读取某个文件的某一行或者某几行

    wc -l  a.txt  统计a.txt 行数 查看文件a.txt的第190行到196行, sed -n '190,196p' a.txt  如果查看某一行用 sed -n 'a,bp' a.txt ...

  2. java形式参数分别是基本类型和引用类型的调用

    什么是形式参数,基本类型,引用类型? 形式参数(形参)百度百科里的解释是:在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数. 通俗的说就是:形式参数是指在函数名后面的小括号里 ...

  3. E20180420-hm

    prior adj. 优先的; 占先的; 在…之前 alignment n. 结盟; 队列,排成直线; 校直,调整; [工] 准线; align  vt. 使成一线,使结盟; 排整齐    vi. 排 ...

  4. ACM中java的使用

    ACM中java的使用 转载自http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输 ...

  5. N的阶乘HDOJ1042

    我记得有一份代码是非常有技巧的,然而这一份就是很死板-每次跑50000,因为10000的阶乘最多才50000位,这样肯定就过了 #include<cstdio> #include<s ...

  6. bzoj 4504: K个串【大根堆+主席树】

    像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?) ...

  7. bzoj 2588: Spoj 10628. Count on a tree【主席树+倍增】

    算是板子,把值离散化,每个点到跟上做主席树,然后查询的时候主席树上用u+v-lca-fa[lca]的值二分 #include<iostream> #include<cstdio> ...

  8. java final static 和final区别

    static 和非static 之间的差异,只有当值在运行期间初始化的前提下,这种差异才会揭示出来.因为编译期间的值被编译器认为是相 同的. package thinking; public clas ...

  9. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

  10. bzoj1854 [Scoi2010]游戏【构图 并查集】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1854 没想到怎么做真是不应该,看到每个武器都有两个属性,应该要想到连边构图的!太不应该了! ...