如何在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版 汉字转码的实现详解
Jun 09 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
在SAE上搭建最新wordpress的方法
Dec 21 PHP
PHP date函数常用时间处理方法
May 11 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
一段实用的php验证码函数
May 19 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
在laravel中实现事务回滚的方法
Oct 10 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
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
vant中的toast轻提示实现代码
2020/11/04 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[01:08:09]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第二局
2016/03/02 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python反编译学习之字节码详解
2019/05/19 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
浅析python中的del用法
2020/09/02 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
会计辞职信范文
2014/01/15 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
运动会闭幕词
2015/01/28 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android