如何在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 相关文章推荐
基于mysql的论坛(5)
Oct 09 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
php实现简易聊天室应用代码
Sep 23 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
详解提高使用Java反射的效率方法
Apr 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
php日历制作代码分享
2014/01/20 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
详解supervisor使用教程
2017/11/21 Python
使用Python设计一个代码统计工具
2018/04/04 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
写给女生的道歉信
2014/01/08 职场文书
单位成立周年感言
2014/01/26 职场文书
小学生考试获奖感言
2014/01/30 职场文书
运动会入场词200字
2014/02/15 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
数学复习课教学反思
2016/02/18 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript