如何在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 04 PHP
PHP的分页功能
Mar 21 PHP
php 动态多文件上传
Jan 18 PHP
php抓取https的内容的代码
Apr 06 PHP
php与mysql建立连接并执行SQL语句的代码
Jul 04 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
php curl的深入解析
Jun 02 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php中strtotime函数用法详解
Nov 15 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 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
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
CI框架实现cookie登陆的方法详解
2016/05/18 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
python爬虫基础知识点整理
2020/06/02 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
用python写PDF转换器的实现
2020/10/29 Python
JAVA和C++的区别
2013/10/06 面试题
质量标语大全
2014/06/12 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
欠条范文
2015/07/03 职场文书
公司备用金管理制度
2015/08/04 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书