模板引擎 -------- Smarty
smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分 离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
优点:速度快
编译型
缓存技术
插件技术
概念
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎不属于特定技术领域,它是跨领域跨平台的概念。在Asp下有模板引擎,在PHP下也有模板引擎,在C#下也有,甚至JavaScript、WinForm开发都会用到模板引擎技术。
折叠编辑本段原理
模板引擎的实现方式有很多,最简单的是“置换型”模板引擎,这类模板引擎只是将指定模板内容(字符串)中的特定标记(子字符串)替换一下便生成了最终需要的业务数据(比如网页)。
置换型模板引擎实现简单,但其效率底下,无法满足高负载的应用需求(比如有海量访问的网站),因此还出现了“解释型”模板引擎和“编译型”模板引擎等。
折叠编基本段用途
模板引擎可以让(网站)程序实现界面与数据分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。
我们司空见惯的模板安装卸载等概念,基本上都和模板引擎有着千丝万缕的联系。模板引擎不只是可以让你实现代码分离(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),还可以实现代码单元共享(代码重用),甚至是多语言、动态页面与静态页面自动均衡(SDE)等等与用户界面可能没有关系的功能。
array([id]=>1,['title']=>"标题",…);
我们的模板需要有几个对应的标记,例如
复制代码 代码如下:
{$title}
{$content}
一个个赋值太麻烦,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条数据都要显示出来,而且他们的索引肯定完全相同,根据编程思路知道结果求过程,假设显示如下
复制代码 代码如下:
如果这是我们希望输出的样子
首先这是多个量当然用的是数组了,
复制代码 代码如下:
$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}
{$list[i].title}
{/section}
上面的代码看起来很像for循环,但这里的i不是for循环里面的$i 只是这个循环的名字,$list[循环名]这个写法可以每次从数组里得到一个量,正如刚才说的,$list是一个二维数组,$list[i]得到的还是数组。
还有一个写法就是foreach 其语法如下:
复制代码 代码如下:
{foreach key=索引 item=值 from=赋值变量}
{$key}:{$item}
{/foreach}
{foreach item=v from=$list}
{$v.title}
{/foreach}
循环list变量每个量赋值到v里,然后从变量v里面指定要显示的索引,除了循环标记外,它还给我们提供了一些常用的语法标记,例如包含文件,条件判断,我们知道HTML不能包含文件,比如网页头部,但smarty提供了{include}的标记,可以像php一样包含文件,例如{include file="文件路径"} 这个标记格式是固定的,而且这个路径必须在模板引擎指定的路径下,而条件判断的语法和php一样是if条件判断,语法如下
复制代码 代码如下:
{if变量==值或量}
为真时显示的值
{else}
为假是显示的值
{/if}
也可以不写else只有为真时显示的内容,例如常见的一种情况是网页上有一个登陆口登录前显示的是表单登录后显示的是用户信息,假设一个量已经赋值给模板了比如 $username 用户登录这个量就有用户名没有登录这个量就是空的,我们可以这样写
复制代码 代码如下:
{if $username !=""}
欢迎{$username}
{else}
请先登录
{/if}
我们只要在php把这个变量准备好,并赋值给smarty即可除了这些标记外还有的标记自行参考手册,
其次就是变量调节器了,很多时候我们从数据库中得到的数据,都要小小的处理下才输出的,比如日期格式,只显示年月日即可再如输出的内容里的换行要换成
才能在页面显示对应的样子,这个时候我们可以使用smarty自带的变量调节器,格式如下
复制代码 代码如下:
{要输出的变量|调节器名:参数}
假如内容部分在显示的时候把所有的换行显示为
只需要如下写法
复制代码 代码如下:
{$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"}
实在不行我们可以用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 = '}>';
?>