如何在smarty中增加类似foreach的功能自动加载数据_php技巧

在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}

时间: 2024-09-26 08:03:07

如何在smarty中增加类似foreach的功能自动加载数据_php技巧的相关文章

如何在smarty中增加类似foreach的功能自动加载数据

在smarty中使用自定义插件来加载数据(见:编写Smarty插件在模板中直接加载数据的详细介绍),在使用的时候还是感觉不够方便,灵机一动就想写成类似foreach那种标签: 第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加: 复制代码 代码如下: //加载数据的开始标签 case 'load': $this->_push_tag('load'); return $this->_complie_load_start($tag_args); bre

图片加载-如何在android中的ListView实现图片的异步加载?

问题描述 如何在android中的ListView实现图片的异步加载? 想要实现对ListView Item 中图片的加载?各位帮忙怎么实现? 解决方案 我封装了一个异步加载类 开放源码并且提供示例代码 这是地址ImageAsyncLoader 解决方案二: Java代码 package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftRefere

在struts2 项目中 同一个页面有多个 模块 加载数据的时候 怎么加载呢?

问题描述 最近心里边一直有一个问题在我们做struts2项目的时候我们加载首页比如说http://www.dangdang.com在网站左边有那么多商品的分类信息的数据然后中间部分加载的数据量也相当的大我有个疑问就是它在页面请求的时候是怎么做到的呢(也许当当不是的用jsp我只是举这样一个例子)我们在请求一个页面的时候一次只能请求一个action也就是说页面加载是串行的但是现在的需求是并行的当加载左边商品分类的同时也要加载中间正文中商品的信息算起来的话应该有好多的List集合我们在做action的

php中filter函数验证、过滤用户输入的数据_php技巧

PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 复制代码 代码如下: //除去html标签,或除去编码特殊字符 var_dump(filter_var("<html>中文ABC@#</html><script>abc</script><b>BBB</b><span>",FILTER_SANITIZE_STRING)); //url_encoded编码

shopex中集成的站长统计功能的代码简单分析_php技巧

复制代码 代码如下: <?php //我们的域名,这里可以不唯一的 $domain = 'localhost'; //这个应该是CNZZ授权给shopex的加密密钥,如果错了就不能快捷申请账号 $encodestr = 'A34dfwfF'; //这个就是CNZZ授权给shopex的快捷申请账号的URL地址 $url = 'http://wss.cnzz.com/user/companion/shopex.php?domain='.$domain.'&key='.md5($domain.$e

c-求问如何在linux中实现类似top这样,可以不断刷新屏幕字符的命令?

问题描述 求问如何在linux中实现类似top这样,可以不断刷新屏幕字符的命令? 我的要求是,不断刷新屏幕中显示的字符串. 比如我在屏幕中输出abc,每秒变换一次,下一秒钟也许就变成了def了. 如果只是printf(),那不会覆盖原来的abc,只会在abc后面增加def而已. 我知道有个curses库函数. 不过这个使用总感觉比较困难,难道top命令也是用那个实现的? 解决方案 我也是刚刚解决这个问题,不知道现在回答你还晚不晚,但是不管怎么样,我觉得还是回一下比较好.一方面,可能你还没解决这个

如何在phpMyAdmin中增加innoDB

  如何在phpMyAdmin中增加innoDB 使用phpNow(Win32下绿色免费的Apache+PHP+MySQL环境套件包)发现默认不支持innoDB引擎的数据库,尝试了网上很多方法,发下如下方法有效,记录下来供大家参考: 1,修改my.ini 在phpNow的工具MySQL目录(如...PHPnow-1.5.6MySQL-5.0.90)中找到my.ini, 搜索skip-innodb,搜索到之后,将其注释掉(#skip-innodb),注意网上有人说还要将下面以innoDB开头对去掉

jsp 绘图-如何在JSP中绘制类似方波的波形图

问题描述 如何在JSP中绘制类似方波的波形图 如何在JSP中绘制类似方波的波形图最好能就是方波 给的 数据类似于 时间和电压值 例子 如下 13:00 1 13:01 0 13:01 0 13:01 0 13:01 0 13:00 1 13:00 1 13:00 1

如何在richtextbox中实现类似word中的每行的数字编号功能,求大神指导下给个示例

问题描述 如何在richtextbox中实现类似word中的每行的数字编号功能,求大神指导下给个示例 项目编号我会做的,但是数字编号无从下手了就像这样 1...... 2...... 3...... 4...... 5 . . . 解决方案 数字编号在rtf中没有对应的表示方式. 你必须自己去编号,你可以定义一个特殊符号,作为编号的起始结束位置,然后对这些段落中的行,首字符开始插入编号数字.