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 = '}>';
?>
smarty的更多相关文章
- Smarty的基本使用与总结
含义: Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来. 环境需求:PHP5.2或者更高版本 我使用的环境是:PHP5.3,wi ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- smarty使用
smarty-牛刀小试 smarty 初识 官网 http://www.smarty.net/ Smarty is a template engine for PHP(PHP模板引擎) smarty使 ...
- Smarty模版引擎的原理
Smarty是一个使用php写出来的模版引擎,用来将原本与html代码混杂在一起PHP代码逻辑分离,实现前后端分离. Smarty模板优点: 1. 速度:采用Smarty编写的程序可以获得最大速度的提 ...
- 12月15日下午Smarty模板函数
1.{$var=...} 这是{assign}函数的简写版,你可以直接赋值给模版,也可以为数组元素赋值. <{$a = 10}><!--赋值语句--> <{$a}> ...
- 12月15日smarty模板基本语法
smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...
- 12月13日上午Smarty模版原理
模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用php代码写逻辑,写完逻辑拿到前台显示. 一.写法 一般需要以下:写3个页面: 1.显示页面aa.html <!DOCTYP ...
- SMARTY模板中如何使用get,post,request,cookies,session,server变量
{$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间戳.直接访问PHP中 ...
- 在新浪云SAE中使用smarty引擎模版
在新浪云上使用smarty时会发现又这样的错误信息: “SAE_Fatal_error: Uncaught exception 'SmartyException' with message 'unab ...
- MVC架构学习之Smarty学习——病来而蔫
前两天是五一小长假,而每次假期都想着如何如何刻苦一番,往往是自作多情.. 当然这次是有小病在身,多个借口吧. 一有病就蔫的不行...要锻炼了啊,脚估计也差不多了,游泳试试吧这周. 这次学习Smarty ...
随机推荐
- 用Regex类计算一个字符串出现次数是最好方法【转载】
我的一个朋友问我,怎么在c#或vb.net中,计算一个字符串中查找另一个字符串中出现的次数,他说在网上打了好多方法,我看了一下,有的是用replace的方法去实现,这种方法不是太好,占资源太大了.其实 ...
- Ubuntu 12.04 安装搜狗输入法
安装指南 Ubuntu / Ubuntu Kylin 14.04 LTS 版本 只需双击下载的 deb 软件包,即可直接安装搜狗输入法. Ubuntu 12.04 LTS 版本 由于 Ubuntu 1 ...
- 横竖屏事件响应(viewWillLayoutSubviews和通知)两种方式
转载:http://blog.csdn.net/nogodoss/article/details/17246489 最近搞横竖屏,获得一些心得,特记录下来. 做横竖屏最重要的是确定横竖屏响应的接口.目 ...
- Android AsyncTask运作原理和源码分析
自10年大量看源码后,很少看了,抽时间把最新的源码看看! public abstract class AsyncTask<Params, Progress, Result> { p ...
- redis单机及其集群的搭建
http://www.cnblogs.com/mouseIT/p/5288204.html
- Qt之QtScript(一)
C++和JavaScript相互通信.今天就学习QtScript模块吧. Qt 包含完全集成的 ECMA 标准脚本引擎.Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (S ...
- Android_life,Intent_note
生命周期: 从出生到死亡 Activity生命周期的7个方法和3个循环 onCreate() 创建时调用onRestart() 不可见到可见时调用onStart() 用户可见时调用onResume() ...
- Linux screen命令简介
Linux上有的shell脚本运行时候是阻塞的,如果想在屏幕上即能够看到阻塞命令的输出,同时又能够在shell窗口运行其他程序,那么Linux自带的screen命令是非常不错的选择. 1.screen ...
- ThinkPHP函数详解:I方法
ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话,可以直接参考使用3.1快速入门教程系列的变量部分. 概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新 ...
- MD5Untils加密工具类
package com.dzq.utils; import java.math.BigInteger; import java.security.MessageDigest; import java. ...