最近做一个项目,要用到smarty模板引擎,于是花了点时间学习了下。期间碰到一个应用,想在模板文件内将一个字符串定义成数组循环。通常做法可以在php文件内定义数组,然后以变量形式传给模板文件。但我只是想在模板文件内生成一串循环的HTML(比如生成10个select的option,中间有循环的自定义属性),节省些代码,而并不需要与php文件有任何的数据交互,所以最好能在模板文件内直接定义数组。把smarty手册找了个遍,没有发现内置的函数有如此功能,于是去扩展函数库(Plugins)找,也没有发现,那就干脆自己写一个吧。

其实象assign,cycle,还有生成HTML代码的html_image,html_radios其实都是扩展函数,可以在Plugins目录下找到这些函数。研究了几个函数的代码还是蛮简单的,于是参考了一下,写了用于定义字符串数组的array函数,代码如下:
function smarty_function_array($params, &$smarty)
{

    if (!isset($params['var'])) {
        $smarty->trigger_error("array: missing 'var' parameter");
        return;
    }
    if (!isset($params['assign'])) {
        $smarty->trigger_error("array: missing 'assign' parameter");
        return;
    }  
  
    if($params['var'] == '') {
        return;
    }
    
    if(!empty($params['separator'])) {
       $_contents = explode($params['separator'],$params['var']);
    } else {
      $_contents = explode(",",$params['var']);
    }
  
    $smarty->assign($params['assign'], $_contents);
  
}

在模板文件内的调用方式为{array var="aa,bb,cc,dd" assign="arrayoptions"}
其中params有3个参数,第一个是欲定义的字符串$params['var'],第二个是数组名称$params['assign'],第三个是字符串分割符params['separator'],默认是",",可以不传。字符串可以在调用时直接列举,也可以是某个变量,比如来自php输出的。
然后就可以循环语句了
{section name=option loop=$arrayoptions}
    <option value="{$arrayoptions[option]}">{$arrayoptions[option]}</option>
{/section}

smarty中有内置的html_options函数,它需要php抛出定义好的数组。现在有了这个array函数,那就直接可以在tpl中定义数组了,而且可以应用到很多方面。
提供此扩展函数下载,放在smarty的plugins目录下便可使用
Download ( 390 downloads)
WEB相关 | Comments(2) | Trackbacks(0) | Reads(6584)
很方便的函数,正在思考用smarty定义数组的问题。感谢老乡grin
gis
2009/08/03 22:22
正在为这个问题发愁,正好看到你的文章,终于解决了问题,谢谢
smarty
2008/08/01 23:42
Pages: 1/1 First page 1 Final page
Add a comment
 Site URI
 Email
  Password Optional
 Nickname  *  [Register]
               

 
Emots
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
Enable HTML
Enable UBB
Enable Emots
Hidden
Remember