如何在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可生成缩略图的文件上传类实例
Dec 17 PHP
PHP中使用BigMap实例
Mar 30 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
php简单复制文件的方法
May 09 PHP
smarty的section嵌套循环用法示例
May 28 PHP
浅谈PHP的反射API
Feb 26 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
浅谈PHP封装CURL
Mar 06 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
js验证上传图片的方法
2015/05/12 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
2018/09/18 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Python编写一个优美的下载器
2018/04/15 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
Python callable内置函数原理解析
2020/03/05 Python
Python如何将字符串转换为日期
2020/07/31 Python
Europcar比利时:租车
2019/08/26 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
行政助理工作职责范本
2014/03/04 职场文书
助学金感谢信
2015/01/20 职场文书
防暑降温通知书
2015/04/27 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js