块函数的形式是这样的:{func} .. {/func}。换句话说,它们被封闭在一个模板区域内,然后对该区域的内容进行操作。默认地,你的函数实现会被Smarty调用两次:一次是在开始标签,另一次是在闭合标签。块函数在模板中使用和函数还是有一些区别的,但自定义添加的方式差距不大,也可以使用两种方式进行添加。使用Smarty对象中的addPluginsDir()方法动态注册时,将第一个参数改为“block”。如果以特定文件的方式扩充块函数,文件的命名规则是“block.块函数名.php”的结构,函数命令规则是“smarty_block_块函数名($params, $content, $smarty,&$repeat)”。只有块函数的开始标签具有属性,所有属性包含在作为关联数组的$params变量中,经由模板传递给模板函数。当处理闭合标签时,函数同样可访问开始标签的属性。$content变量值取决于你的函数是被开始标签调用还是被闭合标签调用。假如是开始标签,则变量值将为NULL,如果是闭合标签,则$content变量值为模板块的内容。请注意这时模板块已经被Smarty处理过,因此你所接收到的是模板的输出而不是模板资源。&$repeat参数通过引用传递给函数执行,并为其提供控制块显示多少次的可能性。在默认情况下,在首次调用块函数(块开始标签)时&$repeat变量为true,在随后的所有块函数(闭合标签)调用中其值始终为false。函数每次执行返回的&$repeat值为true时,{func} .. {/func}之间的内容会被求值,同时参数$content里的新块内容会再次调用执行函数(运行方法有点类似于递归函数)。如果你嵌套了块函数,可以通过$smarty->_tag_stack变量访问找出父块函数。

//函数中的$params代表标签中传入的参数的数组;变量 $content 的值取决于是否因开始标记或结束标
           //记或结束标记调用你的函数。假如是开始标记,它会是空的,如果是结束标记,它会是模板块的内容。
           //参数 &$repeat 通过参考引用传递给函数执行过程并为其提供一个可能值来控制显示块多少遍。默认情况下
           //首次调用块函数(块开始标记)时变量 $repeat 是真,在随后的所有块函数调用中其始终是假。每当函数执行
           //返回的 &$repeat 是真时,在{func} .. {/func}之间的内容再次求值,函数执行接收一个新块参数 $content
           //内容值被再次调用。
 
    function smarty_block_products($params, $content, &$smarty, &$repeat) {
 
        global $db, $config;
 
    //仅仅是获取一个和当前block相对应的值而已
        $l = count($smarty->_tag_stack);
        //指派变量名
        if(empty($params['name'])) $params['name'] = "products";
        //判断是否是第一次运行(前半部标签),如果这个变量存在了,那么说明数据已经被注册进$smarty->blocvars[$l]里面了
    //其中$smarty->blockvars是自定义的变量,smarty本身没有该属性,在smarty上面注册该变量的好处是, smarty每次都会默认以引用的方式进行传递,当然,如果你乐意,也可以使用$GLOBALS['blockvars'][$l]
    //
        if(empty($smarty->blockvars[$l])) {
            /*
            sql process
            */
            $smarty->blockvars[$l] = $db->get_results($sql);
            //如果没有数据,那就不用再执行了(repeat)
            if(!$smarty->blockvars[$l]) return $repeat = false;
            if(!empty($params['pager'])) $smarty->assign($params['pager'], $pager);
        }
 
 
        //利用each的特点,逐一遍历$smarty->blockvars[$l]子元素
        if(list($key, $item) = each($smarty->blockvars[$l])) {
            $repeat = true;
            //重要的,指派变量,以供结束标签显示(下一次调用)
            $smarty->assign($params['name'], $item);
        }
        else {
            $repeat = false;
            //清除each产生的指针记录,不解
            reset($smarty->blockvars[$l]);
        }
        //print 这里的$content其实是在上一次的运行中解析过(已经插入数据的最终结果)的$content,直接打印即可
        if(!is_null($content)) print $content;
 
        //循环结束时,清理变量
        if(!$repeat) $smarty->blockvars[$l] = array();
    }

smarty框架块函数的更多相关文章

  1. 第八十八天请假 PHP smarty模板 变量调节器,方法和块函数基本书写格式

    变量调节器 : 文件命名格式(modifier.名称.php)  前端调用方式<{变量|名称:参数:参数……}>可组合使用,用|隔开 <?php /* 命名格式 smarty_mod ...

  2. iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明

    iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业 ...

  3. [Effective JavaScript 笔记]第15条:当心局部块函数声明笨拙的作用域

    嵌套函数声明.没有标准的方法在局部块里声明函数,但可以在另一个函数的顶部嵌套函数声明. function f(){return "global"} function test(x) ...

  4. 很少有人知道的c++中的try块函数

    c++有一些在现实世界中很少看到的结构.这些结构有着自己的用法,但是要特别小心保守的予以运用.就像是网站 The Old New Thing首页标题上面的说的那样: “代码通常被读的次数原因超过了被写 ...

  5. smarty的ASSIGN()函数

    http://blog.sina.com.cn/s/blog_6721f25c01011qdj.html 主要是把程序里面的值付给模板,因为使用smarty时,模板里面是没有PHP代码的,无法显示在操 ...

  6. block 块函数

    定义模块函数: <?php function smarty_block_text($args,$content,$smarty,$a) { $color=$args["color&qu ...

  7. smarty 内置函数if 等判断

    {if},{elseif},{else} Smarty的{if}条件判断和PHP的if 非常相似,只是增加了一些特性. 每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {else ...

  8. smarty内置函数

      1.{append} 追加 2.{assign} 赋值 3.{block} 块 4.{call} 调用 5.{capture}捕获 6.{config_load}用来从配置文件中加载config变 ...

  9. Xposed框架之函数Hook学习

    作者:Fly2015 Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架而且据说cydiasubstrate框架能实现Android的Java层和Nat ...

随机推荐

  1. ios - 带动画圆形旋转的进度条

    #import <UIKit/UIKit.h> @interface TJCircleProgressView : UIView /** * 图标 */ @property(nonatom ...

  2. IOS开发UI篇之自动滚动图片

    我们在做项目是有时候会遇到设置自动滚动图片,所以我自己也遇到过两次.觉得他是一个挺有意思东西,所以做了下总结 DEMO: .h #import <UIKit/UIKit.h> @inter ...

  3. 新手留言薄asp.net MVC 学习(适合新手学习)

    以下是发布到IIS后的效果截图: 1)首页展示: 2)登录后台页面展示: 3)后台页面展示: 该项目源代码下载地址:http://files.cnblogs.com/files/f12-liugang ...

  4. javascript 特性

    作用域: javascript的作用域称为静态作用域,在定义语法上就能确认了,而不是运行时. if (true) { var i = 'moersing' } console.log(i); //可以 ...

  5. 怒刷DP之 HDU 1087

    Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64 ...

  6. Java之阶乘数的计算

    说起“阶乘数”,我们应该都不会感到陌生.当老师布置了这样的作业,我们大多数人是一贯用笔算,还有的同学会用计算机去计算.数学是讲究原理和方法的,我们知其然,也要知其所以然.下面我们就用编程来计算阶乘数. ...

  7. 2015英特尔® 实感™ (Intel® RealSense™) 动手开发实验课

    2015年英特尔® 全球实感技术动手实验课路演来到中国, 这次在中国将有北京和广州两站,包括一天的动手实验室活动 - 面向对感知计算.3D 开发和虚拟现实兴趣浓厚的开发人员.英特尔专家将会指导您如何借 ...

  8. ios卡牌游戏项目源码

    上传者fu_sion,源码CardGame,一副牌从中抽取十二张牌,翻开牌可以相同的花色+1 相同的数字+4分 同一张牌翻开后可以盖上(算是一个BUG)就酱紫~~ 项目源码下载:http://code ...

  9. ArrayList与List对象用法与区别

    比如: 代码如下 复制代码 string[] s=new string[3];//赋值s[0]="a";s[1]="b";s[2]="c"; ...

  10. C#DateTime的用法

    本文较详细地介绍了C#的DateTime对象的使用方法.DateTime.Now.ToShortTimeString() DateTime dt = DateTime.Now; dt.ToString ...