如何在smarty中增加类似foreach的功能自动加载数据


Posted in PHP onJune 26, 2013

在smarty中使用自定义插件来加载数据(见:编写Smarty插件在模板中直接加载数据的详细介绍),在使用的时候还是感觉不够方便,灵机一动就想写成类似foreach那种标签:

第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加:

//加载数据的开始标签
case 'load':
 $this->_push_tag('load');
 return $this->_complie_load_start($tag_args);
 break;
//加载数据的结束标签
case '/load':
 $this->_pop_tag('load');
 return "<?php endforeach; endif; unset(/$_from); ?>";
 break;

第二步:增加一个方法:
/**
* 加载数据
* @param $tag_args
*/
function _complie_load_start($tag_args)
{
 $key = substr(md5($tag_args), 8, 16);   //根据参数生成一个特殊的变量名
 $attrs = $this->_parse_attrs($tag_args);
 //这里可以增加更多的处理
 $class = (!isset($attrs['class']) || empty($attrs['class'])) ? 'cls_crud' : trim($attrs['class']);
 (!isset($attrs['table']) || empty($attrs['table'])) && exit('`table` is empty!');
 $db = $class::factory(array('table' => substr($attrs['table'], 1, -1)));
 //定义新变量
 $this->_tpl_vars[$key] = $db->get_block_list(array(substr($attrs['where'], 1, -1)), $attrs['limit']);
 $tag_args = "from=/${$key} " . $tag_args; //调用foreach标签处理函数进行处理
 return $this->_compile_foreach_start($tag_args);
}

这样就可以在模板中使用load这个标签了。用法例如:
{load table="test" where="`id`<100" limit=10 item=rec}
   ...
{/load}

PHP 相关文章推荐
PHP通用检测函数集合
Nov 25 PHP
php xml-rpc远程调用
Dec 19 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
Jun 25 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
php求今天、昨天、明天时间戳的简单实现方法
Jul 28 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
PHP实现权限管理功能示例
Sep 22 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 #PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 #PHP
解析php扩展php_curl.dll不加载的解决方法
Jun 26 #PHP
php ci框架验证码实例分析
Jun 26 #PHP
解析php file_exists无效的解决办法
Jun 26 #PHP
使用HMAC-SHA1签名方法详解
Jun 26 #PHP
php读取文件内容的几种方法详解
Jun 26 #PHP
You might like
js下函数般调用正则的方法附代码
2008/06/22 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
python 读入多行数据的实例
2018/04/19 Python
python反转列表的三种方式解析
2019/11/08 Python
python正则表达式实例代码
2020/03/03 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
python3操作redis实现List列表实例
2021/08/04 Python
python区块链持久化和命令行接口实现简版
2022/05/25 Python