Smarty

 

前言:
很久不用smarty了,因为大多数项目都是比较轻量型的。前段时间笔者接了个还算可以的项目,下面有几个程序员,与一个美工组为项目团队。为了做快速的布署应用,也为了小组成员能形成一个统一的view层的控制,选择了smarty。发现smarty果然还是那么的强大,那么的很黄很暴力。
作者:无喱头

故事背景:
小张是个很漂亮的美工MM,与无喱头搭档已经很多年。请不要误解,无喱头是有老婆女儿的,他们之前没有任何的暧昧关系,仅仅是同事,或者是上下级。
在两人的多年合作过程中,在很多地方,已经形成了一种默契。在很多时候,喱头提供封装好的php函数,然后通过一些技术上的修改,可以直接使用小张在模板里引入php函数,这样可以很方便的把模板切成很多小块,便于维护。并且由于可以自定义一些关键字,小张可能很快的取出想要的一些数据。
比如:
{phpsoho “sort=article&order=ID DESC&limit=10&tplfolder=article&tplname=article.list”}

,无喱头为小张同学提供了类似于上面的自定义函数,并且明确的给出了使用文档:
Sort: 类别(文章?下载?图片?) article|download|picture
Order:排序方式 id,hot,? DESC|ASC
Limit:取出多少条? Limit number|limit start,end
…….
当然,不仅仅是这些,也不仅仅只有phpsoho这个自定义的函数来定义。小张可能很快的通过这些她能看得懂的文档(打印稿)来很方便的进行界面的操作。
由于种种原因,现在准备使用SMARTY。现在问题来了,怎么让SMARTY也支持用户自定义的函数呢?
解决方案:
SMARTY手册是这样介绍register_function函数的

Use this to dynamically register template function plugins. Pass in the template function name, followed by the PHP function name that implements it.
The php-function callback impl can be either (a) a string containing the function name or (b) an array of the form array(&$object, $method) with &$object being a reference to an object and $method being a string containing the mehod-name or (c) an array of the form array(&$class, $method) with $class being a classname and $method being a class method of that class.

其实,那么多英语我也不太看得懂,经过两天的摸索,终于还是有了一些心得的。

基础篇

我们可以直接使用SMARTY::register_function来注册一个程序员自定义的php函数,只要这个函数所在的文件已经被引入,就可以正确使用它。
DEMO 1:

$smarty = set_smarty();
$smarty->register_function('example','format_data');
$smarty->assign('time',time());
$smarty->display('demo.htm');

自定义函数如下:

function format_data( $params )
{
extract($params);
echo date($format,$time);
}

模板文件如下:

{example time="$time" format="Y-m-d"}

不难看出,我们很轻松的就布署使用了我们的自定义函数了。有一点我们需要注意到的是,在format_data函数里,我们是以一个数组对值进行传入的,而在模板文件里,我们可以任意的建一些关键字,只要你能记得住。当然,除了SMARTY的保留字之外。
而后我们通过extract把这个数组里面的值释放放出来,当然这种方案是有多种多样的,你可以使用list,也可以使用explode,总之你能想到的办法就是好办法,只要你用得熟悉。

进阶篇

有一种情况很快发生了,小张总是搞不清楚我到底注册了多少个自定义函数供她使用,她总是忘记一些关键字的定义,比如在一个取出热门的连载小说里,她不知道有没有hot这个关键词。因为这种自定义的函数太多了,她不得不经常的拿着我给她打印出来的技术文档苦着脸查找,我很内疚。于是,另一种解决方案应运而生。
本文开始时,曾经举了了像{phpsoho “sort=article&order=ID DESC&limit=10&tplfolder=article&tplname=article.list”}这样的字符串在模板里的例子。或者你会说,头哥在骗人呀,这根本跟第一个例子是一样的嘛,无非是传来的值不一样而已。那么,咱们接着往下看。。。
DEMO 2:
我们假装smarty已经被实例化,并且资源名为$smarty.
首先我们注册一个自定义函数到smarty中,这个跟上例一样,完全是为了骗几个字。

$smarty->register_function( 'phpsoho','tags_extends' );
//引入文件
include_once __ROOT_PATH__ . '/include/tags.func.php';

这里需要注意的是,我们注册的到phpsoho句柄中的函数为tags_extends,函数名是什么意思不做一一解释,具体可以看PHP函数命名规范这样的文档。

function tags_extends( $params )
{
$action = $params['action'];
$optional = $params['optional'];

/**
  * 关键词检测
*/
if ( !$action )
{
  Error::putMsg('tags_extends_error','tags_extends action is null.');
}

if( !function_exists($action) )
{
  Error::putMsg( 'function_exists','function null. class file.'.$extend_tags_file . '. classname:'.$action );
}
$action($optional);
}

模板文件:

{phpsoho action="getAffiche" optional="fileds=id,title,posttime&titlelen=17&and[stauts]=1&limit=5&order=id DESC&tpl=afiche.right"}

上面的函数执行流程是这样子的:
在模板文件里面,我们使用phpsoho这个资源句柄把请求定位到'tags_extends'函数中,在这个函数中,我们做了几种检查:
Check Action:检查动作是否被设置,这个为必须的关键字.其实我是以这个action来进行下面的函数定位操作的.
Check function_exists:检查相应执行的函数是否存在或者是否已经被加载进入
这里我们不用检查optional,因为我们会在下一步里进行另一步检查.
$action($optional)被执行,也就是说上例中的getAffiche被引入了,并且设置$optional的值为fileds=id,title,posttime&titlelen=17&and[stauts]=1&limit=5&order=id DESC&tpl=afiche.right,里面的一些一一对应的关系,我就不一一过多的讲解。我是有文档给小张的,你们谁想要,可以联系她。她可是美女哟~!
回过头来,我们看$action($optional),为什么我说看$action而不是getAffiche呢?因为谁知道你将来会让他引入什么函数呢?(狂笑,得意的笑)
$action()DEMO:

function getAffiche($optional)
{
global $db;
parse_str($optional);
$res = $db->getFetchArray('litou_affiche',$fileds,$and,$order,$limit);

/**
  * 声明并发送到模板
*/
$smarty = set_smarty();
$smarty->assign('titlelen',$titlelen);
$smarty->assign('affiche',$res);
$smarty->display( $tpl .$GLOBALS['tplEx']);
}

大家看到了吗?原来如此简单。。。
原来我们在函数的内容完成了指定内容的一些操作。当然,我这个完全是为了写这篇文章临时写出来的,但你们可以在这里面加上一些php的高级特性,比如:缓存,在你的字符上加入cache=3600(一般我们使用的是秒,就是一个小时),那你可以通过上面的一些关键词定义引入你的cache,并且可以根据时间来更新后引入,加上过滤或者其它任何你想要的功能。
总之,只要你有想法,一切皆有可能。
知识点:

parse_str, Parses the string into variables
void parse_str ( string $str [, array &$arr ] )

这是个很好用的函数,包括它的家族兄弟们 parse_ini_file及parse_url,具体用法自己去测试。
汗,快下班了,估计今天写不完高级使用了。。。先简单介绍一下,留个悬念,以后再过来编辑一下。

高级篇

小张很开心。这样她仅仅只需要使用这一个函数就行了,并且里面需要的记的也不多,A4纸一张不到。但苦了我呀,小张经常这样说:头哥,我需要取出一些图片资料,并且要求横排四张,竖排八张@$#^%$%*&^*&(*&(),,,,天啊,我做错了吗?我不得不给她写N多的函数,让她使用...
每次看到小张一脸诡笑的样子,我心里在发汗,唉。不行,我要再进行深入的研究…

未完待续…
关于作者:无喱头。七零后人,03年进入php大家庭。曾参与过北京法院网案件执行系统核心流程设计、河南八方电器有限公司B/S系统核心流程及上海骄阳网公会系统、上海理想动画有限公司B/S核心系统开发,现在上海尊涵商务有限公司任技术主管。

时间: 2024-10-02 05:00:56

Smarty的相关文章

几个smarty小技巧

1,capture标签 capture的中文意思是抓取,它的作用是抓取模板输出的数据,当我们需要它的时候,调用它,以得到抓取数据的目的.例子: Java代码   {capture name=test}       <img src="testimg.jpg">   {/capture}   <div class="image">       {$smarty.capture.test}   </div>    说明: 在{capt

php 如何用smarty代码实现二级联动下拉菜单

问题描述 php 如何用smarty代码实现二级联动下拉菜单 在一页面上,如何实现选中一个下拉菜单,同步更新另外一个下拉菜单的值?

Smarty实例教程-模板设计部分

一.什么是smarty? smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目 中显的尤为重要. 二.smarty优点: 1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的. 2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PH

动态网页制作技巧PHP:详细彻底学习Smarty

Smarty是一个php模板引擎,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法. Smarty要求web服务器运行php4.0.6和以上版本. smarty安装需要smarty库文件.可以去官方网站http://smarty.php.net下载. 网上讲了很多安装的教程,但是我都没有成功,所以直接把整个目录名改为smarty直接复制到了网站所在的目录下,然后打开 http://网站路径/smarty/demo/index.php,显示正常,应该算是安装成功了. 基本语法 所有的smar

介绍smarty模板

模板 PHP代码:-------------------------------------------------------------------------------- 以下的介绍是基于2.5版的,也不知有BUG没,OS是win2000,php应该 4.1以后的就可以.,兄弟只是开发时使用过几次,没太深的研究, 介绍的在手册上都能找到,如果有错误之处难免多包涵吧 smarty模板据说是php.net推荐使用的,据说功能比较强,据说速度 也不慢,据说用的人越来越多<img src=htt

PHP模板引擎Smarty介绍

模板 用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择,但是官方引擎SMARTY诞生后,选择就有了变化.它的理念和实现都是相当"前卫"的.本文主要讨论SMARTY之于其他模板引擎的不同特点,简要介绍了该引擎的安装及使用,并用一个小的测试案例对比了SMARTY和PHPLIB template的速度和易用性. 一.MVC需要模板 MVC最早是在SmallTalk语言的开发过程中总结出的一种设计模式,MVC分别代表了"模型"."视图"和

菜鸟学PHP之Smarty入门

    刚开始接触模版引擎的 PHP 设计师,听到 Smarty 时,都会觉得很难.其实笔者也不例外,碰都不敢碰一下.但是后来在剖析 XOOPS 的程序架构时,开始发现 Smarty 其实并不难.只要将 Smarty 基础功练好,在一般应用上就已经相当足够了.当然基础能打好,后面的进阶应用也就不用怕了. 这篇文章的主要用意并非要深入探讨 Smarty 的使用,这在官方使用说明中都已经写得很完整了.笔者仅在此写下一些自己使用上的心得,让想要了解 Smarty 却不得其门而入的朋友,可以从中得到一些

Smarty实例教学 实例篇

Smarty实例教学 实例篇(三.使用ADODB连接数据库) 前两个月因为工作上的原因一直很忙,所以没有及时完成这个教程,正好今天周六不用加班,抽个空完成它吧! 在开始新的的教程的时候,我 先把以前的我写的那个教程中的一些错误的地方修改过来,在这里要感谢 nesta2001zhang兄弟,是他找出了文章中的一些错误,否则真的被别人 骂"误人子弟了"(说来真是惭愧,我的初稿发布后后就发现在一大堆的问题,后来一些时候发重新修改后的文件中居然也出现了错误,真是不应 该...)在上几篇教程中的

手把手教你Smarty缓存技术

大家应该知道缓存机制能能有效的减轻网站的服务器压力,Smarty模板引擎的一大亮点就是为我们提供了非常简单的缓存操作,下面就让我们学习一下. 首先我们要知道Smarty缓存机制分为全局缓存,部分缓存,局部缓存三种,我们一一介绍. 1.全局缓存 顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面. 首先我们要操作smarty的配置文件,开启缓存,指定缓存文件目录,并设置缓存的存活时间 $smarty->cache_dir = './cache/'; //设置存放缓存文件的文件夹 $smart

模板引擎SMARTY

模板 用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择,但是官方引擎SMARTY诞生后,选择就有了变化.它的理念和实现都是相当"前卫"的.本文主要讨论SMARTY之于其他模板引擎的不同特点,简要介绍了该引擎的安装及使用,并用一个小的测试案例对比了SMARTY和PHPLIB template的速度和易用性.一.MVC需要模板MVC最早是在SmallTalk语言的开发过程中总结出的一种设计模式,MVC分别代表了"模型"."视图"和&q