如何在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 相关文章推荐
深入了解php4(1)--回到未来
Oct 09 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
thinkphp特殊标签用法概述
Nov 24 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
thinkPHP5框架接口写法简单示例
Aug 05 PHP
php+websocket 实现的聊天室功能详解
May 27 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的FTP学习(一)
2006/10/09 PHP
PHP控制网页过期时间的代码
2008/09/28 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
基于initPHP的框架介绍
2013/04/18 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
python re正则表达式模块(Regular Expression)
2014/07/16 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
python属于解释语言吗
2020/06/11 Python
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
经典C++面试题一
2016/11/06 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
创新比赛获奖感言
2014/02/13 职场文书
煤矿安全生产标语
2014/06/06 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
早上好问候语大全
2015/11/10 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
银行工作心得体会范文
2016/01/23 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
pytorch 中nn.Dropout的使用说明
2021/05/20 Python