模板引擎smarty工作原理以及使用示例

模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通。

模板文件一般是HTML xml js等类型文件,如果不用模板引擎若要把数据显示在网页上,我们需要在php中输出HTML,而使用模板则只要把数据交给模板引擎程序即可,然后告诉它用哪个模板文件,自然就会把数据和页面结合以后返回或输出,模板至少有以下功能1.把数据提供给模板引擎的功能。2.指定模板的功能。3.输出结果的功能。一般来说为了方便程序员们使用模板引擎,开发者都会把它的功能在一定程度上封装起来,封装成一个类,实例化之后得到一个对象,即模板引擎对象,一个对象有其属性和方法,smarty对象的属性和方法在smarty手册上查找,首先说说其方法,assign 把数据提交给模板的方法。没有单独的指定模板文件的方法已经合并到输出的方法中,输出的方法有两个 display 直接输出  fetch 返回合并好的HTML代码,对于输出我们主要用到的是assign 因为我们显示的数据往往是多样性的,可能是一个量,可能是一个数组量也可能是多维数组,在不同的情况下应该如何正确提交给smarty是一个问题,提交后如何对应显示也是个问题,smarty引擎使用的解释方法是先把HTML文件转化为php文件,然后在赋值各个量,并且执行这个php文件,对应不同的数据格式,它有一套固定的书写方式,需要我们用这种书写方式在模板文件上做对应的标记,smarty默认使用的模板标记符是一对{},比如{$a}这个标记等效于echo $a;在php中我们需要有对应的赋值过程,$smarty->assign("a","值");如果我们有多个量进行赋值,一个个这样写就很麻烦,smarty为我们考虑了这一点,例如我们从数据库里读出一个文章,要显示在页面的内容有标题内容作者时间,数据结构大体是这样的

代码如下:

array([id]=>1,['title']=>"标题",…);

我们的模板需要有几个对应的标记,例如

代码如下:

<h1>{$title}</h1>
<div>{$content}</div>

一个个赋值太麻烦,assign方法支持数组直接赋值,$rows = 从数据库读出的据,

$smarty->assign($rows);smarty就会取数据索引自动一一赋值,但是这个时候为了避免引起变量冲突,我们希望还是直接以数组形式赋值呢,例如

代码如下:

$rows = 从数据库读出的据,
$smarty->assign("rows",$rows);

如果此时我们在模板的标记是{$rows} 那输出的时候我们只能看到array 正如php里面直接echo数组一样,在php输出具体量是echo $rows['title'];smarty规定的符号是一个点号,{$rows.title},用这种方式类似于

代码如下:

echo $rows['title']

每种模板有其对应的书写规则,接下来如果要显示的是一个文章列表呢,假设mysql给我们返回了10条数据,10条数据都要显示出来,而且他们的索引肯定完全相同,根据编程思路知道结果求过程,假设显示如下

代码如下:

<ul>
<li>1111</li>
<li>222</li>
<li>333</li>
<li>4444</li>
</ul>

如果这是我们希望输出的样子

首先这是多个量当然用的是数组了,

代码如下:

$list=array();
While($rows=数据){
$list[]=$rows;
}
$smarty->assign("list",$list);

先把数据放到一个数组中再一次性交给smarty,这样一来list变量里面是一个二维数组,如果是我们得到一个这样的二维数组,要把里面所有值显示出来,最好的方法是循环输出,同样smarty为我们提供了循环用的标记,section和 foreach

section标记格式

代码如下:

{section name=这次循环的名字 loop=数据量名}
...
{/section}

{section name=i loop=$list}
<li>{$list[i].title}</li>
{/section}

上面的代码看起来很像for循环,但这里的i不是for循环里面的$i 只是这个循环的名字,$list[循环名]这个写法可以每次从数组里得到一个量,正如刚才说的,$list是一个二维数组,$list[i]得到的还是数组。

还有一个写法就是foreach 其语法如下:

代码如下:

{foreach key=索引 item=值 from=赋值变量}

{$key}:{$item}<br />

{/foreach}

{foreach  item=v from=$list}

<li>{$v.title}</li>

{/foreach}

循环list变量每个量赋值到v里,然后从变量v里面指定要显示的索引,除了循环标记外,它还给我们提供了一些常用的语法标记,例如包含文件,条件判断,我们知道HTML不能包含文件,比如网页头部,但smarty提供了{include}的标记,可以像php一样包含文件,例如{include file="文件路径"} 这个标记格式是固定的,而且这个路径必须在模板引擎指定的路径下,而条件判断的语法和php一样是if条件判断,语法如下

代码如下:

{if变量==值或量}
为真时显示的值
{else}
为假是显示的值
{/if}

也可以不写else只有为真时显示的内容,例如常见的一种情况是网页上有一个登陆口登录前显示的是表单登录后显示的是用户信息,假设一个量已经赋值给模板了比如 $username 用户登录这个量就有用户名没有登录这个量就是空的,我们可以这样写

代码如下:

{if $username !=""}
欢迎{$username}
{else}
请先登录
{/if}

我们只要在php把这个变量准备好,并赋值给smarty即可除了这些标记外还有的标记自行参考手册,

其次就是变量调节器了,很多时候我们从数据库中得到的数据,都要小小的处理下才输出的,比如日期格式,只显示年月日即可再如输出的内容里的换行要换成<br />才能在页面显示对应的样子,这个时候我们可以使用smarty自带的变量调节器,格式如下

代码如下:

{要输出的变量|调节器名:参数}

假如内容部分在显示的时候把所有的换行显示为<br />只需要如下写法

代码如下:

{$content|nl2br}

日期的格式化可以用date_format 例如手册上

代码如下:

index.php:

$smarty = new Smarty;
$smarty->assign('yesterday', strtotime('-1 day'));
$smarty->display('index.tpl');

index.tpl:

{$smarty.now|date_format}
{$smarty.now|date_format:"%A, %B %e, %Y"}
{$smarty.now|date_format:"%H:%M:%S"}
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
{$yesterday|date_format:"%H:%M:%S"}

OUTPUT:

Feb 6, 2001
Tuesday, February 6, 2001
14:33:00
Feb 5, 2001
Monday, February 5, 2001
14:33:00

实在不行我们可以用php处理好之后再进行赋值。

下面写上配置

代码如下:

<?php
define("ROOT",str_replace('\\','/',dirname(__FILE__)).'/');//定义根路径
//加载smarty类
require ROOT.'lib/smarty.class.php';
$samrty = new smarty();//实例化一个smarty类
//配置各种目录
$smarty ->setTemplateDir(ROOT.'templates/')
        ->setCompileDir(ROOT.'templates_c')
        ->setPluginsDir(ROOT.'plugins/')
        ->setCacheDir(ROOT.'cache/')
        ->setConfigDir(ROOT.'configs/');
$smarty->caching = false;//是否开启缓存
$smarty->left_delimiter = '<{';//设置左右 防止和js css 等发生冲突
$smarty->right_delimiter = '}>';
?>

(0)

相关推荐

  • [PHP]模板引擎Smarty深入浅出介绍

    Smarty介绍 什么是模版引擎 不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意.然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言.因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢? 其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份.可是通常

  • javascript轻量级模板引擎juicer使用指南

    使用方法 编译模板并根据数据立即渲染出结果 juicer(tpl, data); 仅编译模板暂不渲染,返回一个可重用的编译后的函数 var compiled_tpl = juicer(tpl); 根据给定的数据对之前编译好的模板进行渲染 var complied_tpl = juicer(tpl); var html = complied_tpl.render(data); 注册/注销自定义函数(对象) juicer.register('function_name', function); ju

  • Laravel模板引擎Blade中section的一些标签的区别介绍

    Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: 1.@yield 和 @section 都可以预定义可替代的区块,这两者有什么区别呢? 2.@section 可以用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢? 本文试对这些问题做一个比较浅显但是直观的介绍. @yield 与 @section 首先,@y

  • JAVA velocity模板引擎使用实例

    velocity使用1.7版本. 在win7下使用intelliJ IDEA建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导入velocity相关jar包.只导入velocity-1.7.jar这个包可能会报错,根据提示再导入velocity自带的其他包. 项目结构如下: 测试Tomcat index.jsp内容如下: 复制代码 代码如下: <%-- Created by IntelliJ IDEA. --%><%@ page conten

  • node.js 使用ejs模板引擎时后缀换成.html

    这是一个小技巧,看着.ejs的后缀总觉得不爽,使用如下方法,可以将模板文件的后缀换成我们习惯的.html. 1.在app.js的头上定义ejs: 复制代码 代码如下: var ejs = require('ejs'); 2.注册html模板引擎: 复制代码 代码如下: app.engine('html',ejs.__express); 3.将模板引擎换成html: 复制代码 代码如下: app.set('view engine', 'html'); 4.修改模板文件的后缀为.html. 好了,任

  • Discuz 模板引擎的封装类代码

    主要功能说明 去掉了 Discuz 语言包的功能  移植 Discuz 模板中所有的功能  添加了自动更新缓存及生命周期功能  在模板中的使用方法跟Discuz的一样,所以就不做多余的说明了,使用前只需要做些简单的设置就可以了 如果需要使用discuz的语言包功能,只要去掉template.class.php第172行注释,并在template.func.php中加上discuz原来的languagevar函数就可以了 点击下载源文件 以下是代码范例: /** * 使用示例 * * @copyr

  • 需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析

    Smarty Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本.很快,非常灵活. Heyes Template Class 一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离. FastTemplate 一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理. ShellPage 一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点. STP Simple Template Parser 一个简单.轻量

  • JavaScript模板引擎Template.js使用详解

    template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果.https://github.com/aui/artTemplate 1.特性 (1).性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试)(2).支持运行时调试,可精确定位异常模板所在语句(演示) (3).对 NodeJS Express 友好支持(4).安全,默认对输出进行转义.

  • CodeIgniter模板引擎使用实例

    一.示例: 通常在使用codeigniter的时候经常使用这样的方式载入: $this->load->view('about', $data); 通过这个类库,可以将一个视图载入到这个模板中: $this->template->load('template', 'about', $data); 这里将视图about.php载入到template模板文件中. 二.安装 下载ci_template_library.zip 解压后将Template.php放到application/li

  • ThinkPHP使用smarty模板引擎的方法

    ThinkPHP支持多种php模板引擎,可以根据个人需要加以配置. 下面我们以Smarty模板引擎为例,给大家说说具体的操作流程! 首先去Smarty官网上下载一个Smarty.本站下载地址:http://www.jb51.net/codes/16086.html. 接下来解压压缩包,会有两个文件夹:demo和libs.打开libs文件夹,复制所有内容. 接下来,打开你网站根目录 下thinkphp的文件夹.里面有个vendor文件夹,这个文件夹是TP调用第三方类库用的,把刚才复制的东西全部粘贴

随机推荐