如何在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常用函数 推荐收藏保存
Feb 21 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
PHP的password_hash()使用实例
Mar 17 PHP
php定界符
Jun 19 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 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
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
php的debug相关函数用法示例
2016/07/11 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
JS面向对象编程之对象使用分析
2010/08/19 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
如何启动时不需输入用户名与密码
2014/05/09 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
军校本科大学生自我评价
2014/01/14 职场文书
党支部综合考察材料
2014/05/19 职场文书
2014年民政工作总结
2014/11/26 职场文书
孔子观后感
2015/06/08 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL
Python之matplotlib绘制折线图
2022/04/13 Python