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

在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-17 04:13:37

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

如何在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); brea

图片加载-如何在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的

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中没有对应的表示方式. 你必须自己去编号,你可以定义一个特殊符号,作为编号的起始结束位置,然后对这些段落中的行,首字符开始插入编号数字.

如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

如何在 Linux 中使用类似智能手机外观的 Conky 天气插件 智能手机都拥有一些平滑地融入手机外观的天气小插件,现在幸亏有了 Flair Weather Conky,你便可以在你的 Linux 桌面中拥有像智能手机一样的天气外观.我们将使用一个 GUI 工具Conky Manager 在 Linux 中轻松地管理 Conky.那就先让我们看看如何在 Ubuntu 14.10,14.04.Linux Mint 17 及其他 Linux 发行版本中安装 Conky Manager 吧. 安装

编写Smarty插件在模板中直接加载数据的详细介绍

之前使用smarty的时候,通常是在php程序端读取数据(一般从数据库),然后assign给模板的变量,才可以在前端使用这个变量.这样不是不好,只是数据多的时候php端的代码维护起来有点麻烦,特别是当存在很多模板块化得数据时. 所以写了个插件,结合之前的crud类实现在前端模板可以加载一些模块化得数据. 复制代码 代码如下: <?php /** * Smarty plugin * @package Smarty * @subpackage plugins */ /** * Smarty {loa