如何在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 session有效期session.gc_maxlifetime
Apr 20 PHP
基于PHP常用函数的用法详解
May 10 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
php计算整个mysql数据库大小的方法
Jun 19 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
Laravel 5+ .env环境配置文件详解
Apr 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
php Rename 更改文件、文件夹名称
2011/05/24 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
[转]JS宝典学习笔记
2007/02/07 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
Python爬虫工程师面试问题总结
2018/03/22 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
安全生产检讨书
2014/01/21 职场文书
青年文明号创建承诺
2014/03/31 职场文书
励志演讲稿800字
2014/08/21 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
Moment的feature导致线上bug解决分析
2022/09/23 Javascript