如何在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.04简明安装
Oct 09 PHP
PHP中文汉字验证码
Apr 08 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
php 代码优化之经典示例
Mar 24 PHP
2014过年倒计时示例
Jan 31 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
PHP-FPM实现性能优化
Mar 31 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
PHP与Perl之间知识点区别整理
Mar 19 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
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
Jquery异步请求数据实例代码
2011/12/28 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
javascript获取select值的方法完整实例
2019/06/20 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
Python实现批量下载文件
2015/05/17 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
python如何调用java类
2020/07/05 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
小学庆六一活动总结
2014/08/28 职场文书
银行求职自荐信范文
2015/03/04 职场文书
关于迟到的检讨书
2015/05/06 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python