如何在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(1)
Oct 09 PHP
PHP 和 MySQL 开发的 8 个技巧
Jan 02 PHP
php 中英文语言转换类代码
Aug 11 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
php使用curl获取https请求的方法
Feb 11 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
php将html转成wml的WAP标记语言实例
Jul 08 PHP
php判断linux下程序问题实例
Jul 09 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
Sep 25 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 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
单点登录 Ucenter示例分析
2013/10/29 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
python处理大日志文件
2019/07/23 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
美国翻新电子产品商店:The Store
2019/10/08 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
小学生红领巾广播稿
2014/01/21 职场文书
社区学习十八大感想
2014/01/22 职场文书
机关出纳岗位职责
2014/04/03 职场文书
投资合作协议书范本
2014/04/17 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Pandas加速代码之避免使用for循环
2021/05/30 Python
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
Win11开始菜单添加休眠选项
2022/04/19 数码科技