如何在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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
PHP实现用户登录的案例代码
May 10 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
Laravel框架实现文件上传的方法分析
Sep 29 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
javascript 判断整数方法分享
2014/12/16 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
PyQT实现多窗口切换
2018/04/20 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
外国人聘用意向书
2014/04/01 职场文书
党性心得体会
2014/09/03 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书