用新版的thinkphp3.2.3和新版的smarty3.1.29,配置smarty的自定义function插件,这样,在thinkphp的模板中就可以加载自定义的小功能块了。

先作个介绍,smarty的function插件,类似tp的widget插件的功能,只是widget包含了php逻辑处理部分和模板显示部分,而smarty的function插件只包含php逻辑处理部分,smarty插件经过获取数据、处理数据,并返回处理的结果,根据得到的结果,可以在模板中灵活使用这些返回的数据。

widget插件和function插件各有优缺点。

之前我使用的是TP3.0和smarty2.6,也已经在此基础上配置了smarty的function插件,但现在需要使用到新的smarty3.#,所以就研究了一下新版smarty的代码,看看得怎么修改。

先到网上大概了解了一下smarty2和smarty3的区别,了解到原来smarty3是全新编写的,好,先心里有个底,也许配置新版smarty3的function插件跟旧版的原理差不多吧,经过查看了smarty3的代码,确实是这样子的。

在smarty中有一个关于插件的变量:plugins,它的值是插件的路径,在新版smarty3中这个变量改为使用常量了,它是:SMARTY_PLUGINS_DIR,在默认的情况下,SMARTY_PLUGINS_DIR的是smarty工具包下的plugins子目录,所以在默认情况下,smarty可以识别到默认的smarty/plugins/下的所有插件。

所以,如果我们按smarty的编写一个新的自定义插件以后,并把它保存在默认的smarty/plugins/目录下,就可以在模板中使用自定义的function类型的smarty插件了。(但我没有试验)

虽然把自定义插件放在smarty默认的插件位置下,是可以使用了,但这样并不好,因为,smarty是一个公共的模板引擎,它可能同时给多个项目使用,如果多个项目的多个自定义插进都放在smarty默认的、公共的位置,那么以后就很多个插件跟某个项目是毫无关系的,但又不好剔除它,因为可能别的项目正在使用这个看起来跟本项目不相关的插件,到底谁在用积累了一堆function插件中的某一个,那可搞不清楚,最好还是别动它,即使是个垃圾插件。

在使用tp跟smarty配合的过程中,更是这样子,tp框架跟smarty模板引擎都是公用的,尽量让它们保持原来的样子,作最小的改动,而让变化的部分尽量转移到跟具体某个项目有关的地方,这样就可以为各自的项目编写各自的smarty插件。

要作到smarty可以单另识别到某个项目下的function插件,关键就是让smarty识别到插件的存放路径,也就是让smarty的可搜索插件的路径,包括各自项目的专门放插件的位置,即:

原来smarty可以识别插件的路径是:“smarty/plugins/”

现在smarty可以识别插件的路径是:“smarty/plugins/” 和 “A项目/插件目录”

这样一来,smarty在调用自定义插件时,如果在smarty/plugins/没找到某个自定义的插件,就到 A项目/插件目录/

下去查找,如果找到了,就可以使用这个自定义插件,如果没有找到这个自定义插件smarty就会报错。

关键的部分来了,在smarty3中定义了plugins的路径是一个常量,但smarty调用plugins的路径却是一个smarty的私有变量,这个私有变量就是smarty的$this->plugins_dir,具体在smarty3.1.29工具包中的主文件:Smarty.class.php,在59行,定义了

define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS);

,在这里定义了smarty插件的路径,相当于:smarty/plugins/

同时,smarty定义了一个私有变量$plugins_dir,并把插件的路径赋值给这个私有变量,以后smarty获取插件的路径,都是获取$this->plugins_dir的值。

在smarty第一次给$this->plugins_dir赋值的地方有两个位置,它们是:

在922行附近:$this->plugins_dir =

array(SMARTY_PLUGINS_DIR);

在940行附近:$this->plugins_dir =

array(SMARTY_PLUGINS_DIR);

可以看的出来,smarty可以分析的插件的路径是一个数组,每一个数组的值就是一个smarty可搜索的插件路径,这样我们就可以在数组中加上一个新的元素,作为smarty可以增加搜索的插件路径就可以了。

在smarty跟TP结合的时候,正好可以利用TP的某些常量,这些TP常量正好跟项目有关,是随着项目配置而变化的,所以我作了以下改动,就可以让smarty分别识别各个项目下的function插件了。

(既然smarty是在两个地方单独赋值给私有变量的,就需要修改两个地方)

原来的:

$this->plugins_dir = array(SMARTY_PLUGINS_DIR);

修改为:

//$this->plugins_dir =

array(SMARTY_PLUGINS_DIR);

$this->plugins_dir = array(SMARTY_PLUGINS_DIR,

COMMON_PATH);

解释说明:

COMMON_PATH 是 ThinkPHP的常量,用来放置某个项目使用的自定义函数的。COMMON_PATH的值是:

项目目录/Common/,如果项目的名称是home,那么自定义的文件就如同如下目录:

home/Common/common.php (默认的函数)

home/Common/function.load_data.php (smarty插件1)

home/Common/function.load_data2.php (smarty插件2)

home/Common/function.load_data3.php (smarty插件3)

=============================

smarty的function插件的使用例子:

比如,以前需要在模板中显示一组产品类别的时候,需要先在控制器的方法中从数据库提取类别数组,再把获取的类别数组赋值给smarty,最后在模板中循环输出类别名称,如果使用了smarty的插件时,就变化为编写一个自定义的插件,从插件中获取产品类别数据,并赋值给smarty,然后在模板中循环输出类别名称,在这个简单例子中,似乎smarty的function插件的作用不大,但在多次使用类似的功能的时候,就可以体现出smarty的function插件的优势了,因为编写了一个比较通用的插件,就可以一次编写,多此使用,而且逻辑思路简洁。

具体表现:

(注:产品类别表的字段有:类别id,父类别id,类别名称,分别是:cat_id , pid , cat_name

)

以前的情况是:

控制器中获取类别数组,并赋值给smarty:

class ProductAction extends Action {

public function lists(){

$arr = M("category")->where("pid=0")->select();

//从数据库获取类别

$this->assign("arr", $arr);

//把类别数组赋值给smarty模板引擎

$this->display();

}

}

在模板中循环类别名称:

{foreach from=$arr item=list}

{$list.cat_name} //循环显示类别名称

{/foreach}

========================

现在,使用smarty的function插件时,是这样写:

在Common/function.load_data.php 文件中编写:

function smarty_function_load_data($params,

&$smarty){

$pid = intval($params['pid']);

$arr =

M("Category")->where("pid='$pid'")->select();

$smarty->assign($params['assign'], $arr);

}

在模板中获取类别function插件的类别数组:

{load_data assign="arr" pid=0}

{if $arr}

{foreach from=$arr item=list}

{$list.cat_name}

{/foreach}

{/if}

==============================

以上的插件可以进一步丰富,使查询类别的条件可变化:

function smarty_function_load_data($params,

&$smarty){

$where = " 1 ";

if(isset($params['where'])){

$where .= " AND ". $params['where'];

}

$arr =

M("Category")->where($where)->select();

$smarty->assign($params['assign'], $arr);

}

模板变成可变化的查询条件:

{load_data assign="arr" where="pid_id=0"}

{if $arr}

{foreach from=$arr item=list}

{$list.cat_name}

{/foreach}

{/if}

===========================

或者变成一个更通用的查询插件:

function smarty_function_load_data($params,

&$smarty){

$sql = $params['sql']

$sql = str_replace("##__", DB_PREFIX, $sql);

$arr = M()->query($sql);

$smarty->assign($params['assign'], $arr);

}

模板修改为:

{load_data assign="arr" sql="SELECT * from ##__category WHERE pid=0

ORDER BY cat_id DESC LIMIT 10"}

{if $arr}

{foreach from=$arr item=list}

{$list.cat_name}

{/foreach}

{/if}

============================

smarty的function插件的更多用途,还等待我们去发现。

顺便说一下,TP配置smarty,

首先把smarty的工具包复制到TP的插件指定的位置,例如:

ThinkPHP/Extend/Vendor/Smarty/Autoloader.php

ThinkPHP/Extend/Vendor/Smarty/debug.tpl

ThinkPHP/Extend/Vendor/Smarty/Smarty.class.php

ThinkPHP/Extend/Vendor/Smarty/SmartyBC.class.php

ThinkPHP/Extend/Vendor/Smarty/plugins/*.*

ThinkPHP/Extend/Vendor/Smarty/sysplugins/*.*

接着在TP的项目配置文件config.php中配置smarty的相关信息:

'TMPL_ENGINE_TYPE' => 'Smarty',

'TMPL_ENGINE_CONFIG' => array( //

另外注意:一旦定义TMPL_ENGINE_CONFIG,必须定义template_dir,compile_dir,cache_dir这三项

'template_dir'=>TMPL_PATH,

'compile_dir'=>CACHE_PATH,

'cache_dir'=>TEMP_PATH ,

'caching' => false, //是否启用缓存

'left_delimiter' => '{',

'right_delimiter' => '}',

),

就以上两步就可以在TP中配置成功smarty。

php smarty thinkphp,用新版的thinkphp3.2.3和新版的smarty3.1.29相关推荐

  1. iVMS-4200 Vs区别_死神vs火影新版柱间下载-死神vs火影新版柱间手机版下载

    详情 死神vs火影新版柱间是小编为你推荐的横版格斗游戏,玩家可以选择喜欢的橘色进行战斗,畅享经典的格斗旅程,每一场战斗都将充满激情与热血.熟知英雄们的连招技能,巧妙灵活的释放技能来KP你的对手吧,感兴 ...

  2. tp5.0 php版本,ThinkPHP v5.0.2官方下载-ThinkPHP v5.0.2 完整版官方最新版-东坡下载

    ThinkPHP是一个免费的PHP框架,性能优秀,可以开发稳定的商业门户,ThinkPHPv5.0.2版本已经正式发布,小编带来了ThinkPHP v5.0.2 完整版源码,欢迎来下载! ThinkP ...

  3. 一点通路由器模拟软件最新版_驾校宝典通最新版2020下载-驾校宝典通手机版 v1.0.2免费版...

    驾校宝典通最新版2020是一款专门为想要考驾照的小伙伴打造的驾考服务平台!在这里用户找驾校更高效更轻松,海量精选优质驾校,在线即可快速筛选查找,让用户考驾照省心更省钱! [软件介绍] 驾校宝典通app ...

  4. 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 框框博客在线报时:2018-11-07 19:31:06 当前MySQL最新版本:8.0.13 (听说比5.7快2倍 ...

  5. wolframalpha最新版_WolframAlpha安卓版中文最新版

    WolframAlpha安卓版中文最新版是一款非常强大的计算知识的引擎,当我们在这款软件中进行问题搜索的时候,它将会直接给出答案,有的题目还会给出解答过程,这样我们就再也不用不断的点击不同的网页,寻找 ...

  6. 烹饪冒险最新版下载android,烹饪冒险最新版下载安卓

    烹饪冒险最新版下载安卓是一款超级有趣的模拟经营类手机游戏.玩家可以在游戏里面经营自己的店铺,可以在游戏里面给客人送上很多的菜肴哦.游戏里面还有很多的游戏关卡等着大家来进行游戏的哦. 烹饪冒险最新版下载 ...

  7. 尚硅谷_springcloud(2020新版 思维导图_2020年新版KET官方真题解析 Reading Part 4

    官方真题:Test 1 Reading Part 4 题型要求及分析 此题型为新版KET的Reading Part 4. 此题型要求学生阅读一篇长文章,并在文章中留有6处空题,要求学生们按照上下文逻辑 ...

  8. 01-Win10家庭版修改C盘下的用户目录中账户文件夹名称(新版家庭版不能改了,新版家庭版此方法无效)

    注意:新版家庭版用此方法无法更改.(2019-10-10更新) 新电脑开机进入系统时,当时设置了一个中文名称,导致C:\Users目录下文件夹名称为中文,导致许多软件在安装运行上出现问题. 解决问题的 ...

  9. php windows 下载,PHPForWindows官方下载_PHPForWindows最新版_PHPForWindows7.2.1官方最新版-华军软件园...

    php 是一种新型的 cgi 程序编写语言,易学易用,运行速度快,可以方便快捷地编写出功能强大,运行速度快,并可同时运行于 windows.unix.linux 平台的web后台程序,内置了对文件上传 ...

最新文章

  1. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
  2. syslinux引导扇区不支持ntfs文件系统_实战 FAT12 文件系统
  3. 1025 反转链表 (25 分)(c语言)
  4. 全国大学生数学建模2019年C题机场的出租车问题论文与代码
  5. 带你学习AOP框架之Aspect.Core[1]
  6. js有没有类似php的sleep函数,JavaScript-jQuery有没有类似sleep方法?
  7. HttpClient 指南思维导图笔记
  8. Node.js: exports 和 module.exports 的区别
  9. “干掉”程序员饭碗后,OpenAI 又对艺术家下手了!
  10. 小编带着小白看springboot源码2
  11. c语言printf打印字符串,puts()vs printf()用于以C语言打印字符串
  12. 快速确定HIve表中数据是否重复
  13. WinEdt Latex使用人家提供的模板时无法插入参考文献的方法
  14. 接口压力测试工具(推荐)
  15. 华为云计算hcip证书有效期_华为云计算HCIP V4.0认证要发布了!
  16. 教你如何使用github+jsDelivr搭建免费图床
  17. linux--设置屏幕的锁屏时间
  18. EAN13条形码了解,有c测试代码
  19. 超级微商系统开发,社交电商3.0时代的概念
  20. mysql slave_pending_jobs_size_max_MySQL:关于Wating for Slave workers to free pending events等待...

热门文章

  1. oracle 触发器 insert 前检查_一文看懂INSTEAD OF 与AFTER 触发器区别与联系
  2. 湖南2021普通高考专业成绩查询,2021年湖南高考成绩查询时间 高考成绩查询入口...
  3. csv java 科学计数法_Java入门笔记1/0(输入与输出)
  4. [独家放送]Unity2020规划预览,可视化编程又双叒叕来了!
  5. ARCore-Unity3d教程2 - 基本概念
  6. 使用开源ASR框架在Mono和.NET C#中进行语音识别
  7. 官宣!vue.ant.design 低调上线
  8. c# rar解压大小_Linux压缩解压指令-bzip2、xz、compress、rar
  9. python第三方库文件传输_本地 Python 代码上传到 Python 第三方库(Pypi)
  10. python向lt新增5个元素_Python学习第十一课-MOOC嵩天