自定义、个性化smarty里的html_checkboxes

  2007-08-04


最近这个项目里,涉及到很多表单的处理,select, radio, checkbox等等。而且这些都是动态生成的,所以就必须得找一个好办法处理这些表单元素。

由于系统采用smarty,所以首先考虑用smarty自带的表单处理函数,html_checkboxes,html_options, html_radios,html_select_date,html_select_time,html_select_time等。。

但是在使用的过程中,html_checkboxes却很讨厌。只有一个separator方法,要么弄成一行,要么弄成一列,元素一多了都很丑。比不上用表格控制。

解决方案一:给smarty的源文件动了一下小手术。

先加一个参数:

case 'cols':  
    $$_key = intval($_val);  
    break;  

修改返回值:

if(!emptyempty($params['assign'])) {  
    $smarty->assign($params['assign'], $_html_result);  
} else {  
    if ( isset($cols) ) {  
        $ret = '';  
        $_i = 0;  
        foreach ($_html_result as $_val) {  
            $_i++;  
            $ret .= "$_val";  
            if ($_i%$cols===0) {  
                $ret .= "";  
            }  
        }  
        $ret .= "";  
        return $ret;  
    } else {  
        return implode("\n",$_html_result);  
    }  
      
}  

大功告成,smarty模板文件里的调用:

html_checkboxes name="stateserve" options=$stateserve cols=8

解决方案二:
不直接显示,先取得返回值,再用html_table显示它:
使用html_checkboxes里的隐藏参数assign:

html_checkboxes name="stateserve" options=$stateserve cols=8 assign="checkboxes"

这里,相应于执行了一次

$smarty->assign("checkboxes",$_html_result);  

得到了$checkboxes这个smarty变量。下面用html_table显示它:

html_table loop=$checkboxes cols=8 table_attr='border="0"'

两种方案的效果一样。