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}

$i = 0;
$t = microtime(true);
for(;$i<1000;$i++)
{
    $str = strtr(md5($i), $p2);
}
var_dump(microtime(true)-$t);    //0.085476875305176
$t = microtime(true);
for(;$i<2000;$i++)
{
    $str = preg_replace($p, ‘‘, md5($i));
}
var_dump(microtime(true)-$t);   //0.09863805770874
结果显示,strtr的效率比preg_replace高约15%左右。
趁着周末,查看了strtr php源码:

复制代码 代码如下:

PHP_FUNCTION(strtr)
{
        zval **str, **from, **to;
        int ac = ZEND_NUM_ARGS();
        //参数检查(zend_get_parameters_ex函数定义在zend_api.c文件中)
        if (ac < 2 || ac > 3 || zend_get_parameters_ex(ac, &str, &from, &to) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
        //参数检查
        if (ac == 2 && Z_TYPE_PP(from) != IS_ARRAY) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The second argument is not an array.");
                RETURN_FALSE;
        }
        convert_to_string_ex(str);
        /* shortcut for empty string */
        //宏Z_STRLEN_PP定义在zend_operators.h
        if (Z_STRLEN_PP(str) == 0) {
                RETURN_EMPTY_STRING();
        }
        if (ac == 2) {
                php_strtr_array(return_value, Z_STRVAL_PP(str), Z_STRLEN_PP(str), HASH_OF(*from));
        } else {
                convert_to_string_ex(from);
                convert_to_string_ex(to);
                ZVAL_STRINGL(return_value, Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1);
                php_strtr(Z_STRVAL_P(return_value),
                                  Z_STRLEN_P(return_value),
                                  Z_STRVAL_PP(from),
                                  Z_STRVAL_PP(to),
                                  MIN(Z_STRLEN_PP(from),
                                  Z_STRLEN_PP(to)));
        }
}

时间: 2024-10-06 12:28:24

smarty中增加类似foreach的功能自动加载数据方法的相关文章

AngularJS:实现页面滚动到底自动加载数据的功能

要实现这个功能,可以通过https://github.com/sroze/ngInfiniteScroll这个第三方控件来实现.步骤如下: 1. 下载ng-infinite-scroll.js程序http://sroze.github.io/ngInfiniteScroll/ 目前版本是1.0.0 2. 如果你是用的jQuery2.0以上版本,还需要修改ng-infinite-scroll.js程序,将所有的将所有的$window.xxx改为$(window).xxx, elem.xxx改为$(

android Listview下滑,自动加载数据.修改多处地方,去除重绘listvew,防止闪烁

感谢其他大神的的源码支持 我仅在此源码上进行修改以及注释. 使用方法: //设置加载分页数据监听 loadingListView.setOnLoadMoreListener(new OnLoadMoreListener() { public void onLoadMore() { if(page<3){ }else{ loadingListView.onLoadMoreComplete();//移除加载更多布局,加载完成 loadingListView.setIsEnable(false); /

WP8_当滚动到滚动条的70%时,自动加载数据效果实现

Touch.FrameReported += Touch_FrameReported;   void Touch_FrameReported(object sender, TouchFrameEventArgs e) { // 传入null表明获取到的触控点信息是以屏幕左上角为原点的. var primaryPoint = e.GetPrimaryTouchPoint(null);   if (primaryPoint != null && primaryPoint.Action == T

listview滚动到底部自动加载数据

在android中listvieww加载数据,有的是分批加载,比如每次加载20条,100条就要加载5次,如果一次性加载100条,listview加载就变的慢,如果是有图片的话,一时浪费流量,二是item中带图片会出现错位的问题,listview加载数据目前好多app做法 一:分批加载 滑动到底部自动更新 二:滑动到底部 手动的点击加载更多 三:下拉刷新+底部加载更多 今天就讲下listview滑动到底部自动更新 分析:监听listview的滑动事件,判断listview是否滑动到底部,然后去加载

[转]ListView滚动到底部自动加载数据

转自:http://blog.csdn.net/shineflowers/article/details/41744241 在Android中有很多时候会选择用ListView加载数据,有的是分批加载,比如每次加载20条,100条就要加载5次,如果一次性加载100条,ListView加载就会变慢,如果是有图片的话,一是浪费流量,二是item中带图片会出现错位的问题l,ListView加载数据目前好多App的做法 1. 分批加载,滑动到底部自动更新 2. 滑动到底部,手动的点击加载更多 3. 下拉

打开页面js自动加载的方法

一.js方法: 1.在body标签加onload属性: 例:<body > 2.window.onload方法 例: <script type="text/javascript"> function myfunction(){ alert("自动加载"); } window.onload = myfun();//可不加括号 </script> 二.jQuery方法: 1.window.onload =function() {ale

echarts在.Net中使用实例(二) 使用ajax动态加载数据

前一篇文章链接:echarts在.Net中使用实例(一) 简单的Demo 通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}backgroundColor 全图默认背景,(详见backgroundColor),支持rgba,默认为无,透明 {Array} color 数值系列的颜色列表,(详见color),可配数组,eg:['#87cefa', 'rgba

鼠标滚动,自动加载数据

手动点击加载: <div class="coursecontent clearfix" id="divContent"> </div> <input type="button" value="next" onclick="getPage(false)" /> @*$(document).ready(function () { getPage(true); }); //**

ionic ion-list 滑到底部自动加载数据案例

<ion-content> <ion-list> <ion-item ng-repeat="item in items track by $index"> <p>{{item}}</p> </ion-item> <ion-infinite-scroll on-infinite="addItems()"></ion-infinite-scroll> </ion-lis