如何在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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
使用Linux五年积累的一些经验技巧
Jun 20 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
php使用文本统计访问量的方法
May 12 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP中单例模式与工厂模式详解
Feb 17 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
php格式文件打开的四种方法
Feb 24 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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连接MySQL代码的参数说明
2008/06/07 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
2020/04/20 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
《长城》教学反思
2014/02/14 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
社区国庆节活动总结
2015/03/23 职场文书
税务会计岗位职责
2015/04/02 职场文书
个人借条范本
2015/05/25 职场文书
优秀员工演讲稿
2019/06/21 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python