本文实例讲述了关于thinkphp中html:list标签传多个参数问题解决办法,分享给大家供大家参考。具体分析如下:
此改动 针对thinkphp 2.0 版本有效,thinkphp 3.0 版本 未测试.
主要修改这个文件 /Thinkphp/Lib/Think/Template/Taglib/TabLibHtml.class.php 的 _list 方法
注释有新增内容的代码部分是新增加的
主要通过 -- 分割多个参数(会自动替换为,)
public function _list($attr)
{
$tag = $this->parseXmlAttr($attr,\'list\');
$id = $tag[\'id\']; //表格ID
$datasource = $tag[\'datasource\']; //列表显示的数据源VoList名称
$pk = empty($tag[\'pk\'])?\'id\':$tag[\'pk\'];//主键名,默认为id
$style = $tag[\'style\']; //样式名
$name = !empty($tag[\'name\'])?$tag[\'name\']:\'vo\'; //Vo对象名
$action = $tag[\'action\']==\'true\'?true:false; //是否显示功能操作
$key = !empty($tag[\'key\'])?true:false;
$sort = $tag[\'sort\']==\'false\'?false:true;
$checkbox = $tag[\'checkbox\']; //是否显示Checkbox
if(isset($tag[\'actionlist\'])) {
$actionlist = explode(\',\',trim($tag[\'actionlist\'])); //指定功能列表
}
if(substr($tag[\'show\'],0,1)==\'$\') {
$show = $this->tpl->get(substr($tag[\'show\'],1));
}else {
$show = $tag[\'show\'];
}
$show = explode(\',\',$show); //列表显示字段列表
//计算表格的列数
$colNum = count($show);
if(!empty($checkbox)) $colNum++;
if(!empty($action)) $colNum++;
if(!empty($key)) $colNum++;
//显示开始
$parseStr = \"<!-- Think 系统列表组件开始 -->n\";
$parseStr .= \'<table id=\"\'.$id.\'\" class=\"\'.$style.\'\" cellpadding=0 cellspacing=0 >\';
$parseStr .= \'<tr><td height=\"5\" colspan=\"\'.$colNum.\'\" class=\"topTd\" ></td></tr>\';
$parseStr .= \'<tr class=\"row\" >\';
//列表需要显示的字段
$fields = array();
foreach($show as $val) {
$fields[] = explode(\':\',$val);
}
if(!empty($checkbox) && \'true\'==strtolower($checkbox)) {//如果指定需要显示checkbox列
$parseStr .=\'<th width=\"8\"><input type=\"checkbox\" id=\"check\" onclick=\"CheckAll(\'\'.$id.\'\')\"></th>\';
}
if(!empty($key)) {
$parseStr .= \'<th width=\"12\">No</th>\';
}
foreach($fields as $field) {//显示指定的字段
$property = explode(\'|\',$field[0]);
$showname = explode(\'|\',$field[1]);
if(isset($showname[1])) {
$parseStr .= \'<th width=\"\'.$showname[1].\'\">\';
}else {
$parseStr .= \'<th>\';
}
$showname[2] = isset($showname[2])?$showname[2]:$showname[0];
if($sort) {
$parseStr .= \'<a xhref=\"javascript:sortBy(\'\'.$property[0].\'\',\'{$sort}\',\'\'.ACTION_NAME.\'\')\" title=\"按照\'.$showname[2].\'{$sortType} \">\'.$showname[0].\'<eq name=\"order\" value=\"\'.$property[0].\'\" ><img xsrc=\"/Public/images/{$sortImg}.gif\" width=\"12\" height=\"17\" border=\"0\" align=\"absmiddle\"></eq></a></th>\';
}else{
$parseStr .= $showname[0].\'</th>\';
}
}
if(!empty($action)) {//如果指定显示操作功能列
$parseStr .= \'<th >操作</th>\';
}
$parseStr .= \'</tr>\';
$parseStr .= \'<volist name=\"\'.$datasource.\'\" id=\"\'.$name.\'\" ><tr class=\"row\" \'; //支持鼠标移动单元行颜色变化 具体方法在js中定义
if(!empty($checkbox)) {
$parseStr .= \'onmouseover=\"over(event)\" onmouseout=\"out(event)\" onclick=\"change(event)\" \';
}
$parseStr .= \'>\';
if(!empty($checkbox)) {//如果需要显示checkbox 则在每行开头显示checkbox
$parseStr .= \'<td><input type=\"checkbox\" name=\"key\" value=\"{$\'.$name.\'.\'.$pk.\'}\"></td>\';
}
if(!empty($key)) {
$parseStr .= \'<td>{$i}</td>\';
}
foreach($fields as $field) {
//显示定义的列表字段
$parseStr .= \'<td>\';
if(!empty($field[2])) {
// 支持列表字段链接功能 具体方法由JS函数实现
$href = explode(\'|\',$field[2]);
if(count($href)>1) {
//指定链接传的字段值
// 支持多个字段传递
$array = explode(\'^\',$href[1]);
if(count($array)>1) {
foreach ($array as $a){
$temp[] = \'\'{$\'.$name.\'.\'.$a.\'|addslashes}\'\';
}
$parseStr .= \'<a xhref=\"javascript:\'.$href[0].\'(\'.implode(\',\',$temp).\')\">\';
}else{
$parseStr .= \'<a xhref=\"javascript:\'.$href[0].\'(\'{$\'.$name.\'.\'.$href[1].\'|addslashes}\')\">\';
}
}else {
//如果没有指定默认传编号值
$parseStr .= \'<a xhref=\"javascript:\'.$field[2].\'(\'{$\'.$name.\'.\'.$pk.\'|addslashes}\')\">\';
}
}
if(strpos($field[0],\'^\')) {
$property = explode(\'^\',$field[0]);
foreach ($property as $p){
$unit = explode(\'|\',$p);
if(count($unit)>1) {
$parseStr .= \'{$\'.$name.\'.\'.$unit[0].\'|\'.$unit[1].\'} \';
}else {
$parseStr .= \'{$\'.$name.\'.\'.$p.\'} \';
}
}
}else{
$property = explode(\'|\',$field[0]);
if(count($property)>1) {
//转换 -- 为 , 传递多个参数
$property[1] = str_replace(\'--\',\',\',$property[1]);//此处为新增内容
$parseStr .= \'{$\'.$name.\'.\'.$property[0].\'|\'.$property[1].\'}\';
}else {
$parseStr .= \'{$\'.$name.\'.\'.$field[0].\'}\';
}
}
if(!empty($field[2])) {
$parseStr .= \'</a>\';
}
$parseStr .= \'</td>\';
}
if(!empty($action)) {//显示功能操作
if(!empty($actionlist[0])) {//显示指定的功能项
$parseStr .= \'<td>\';
foreach($actionlist as $val) {
//应用 javascript
if(strpos($val,\':\')) {
$a = explode(\':\',$val);
if(count($a)>2) {
$parseStr .= \'<a xhref=\"javascript:\'.$a[0].\'(\'{$\'.$name.\'.\'.$a[2].\'}\')\">\'.$a[1].\'</a> \';
}else {
$parseStr .= \'<a xhref=\"javascript:\'.$a[0].\'(\'{$\'.$name.\'.\'.$pk.\'}\')\">\'.$a[1].\'</a> \';
}
}else{
//应用 php 函数
$array = explode(\'|\',$val);
if(count($array)>2) {
$parseStr .= \' <a xhref=\"javascript:\'.$array[1].\'(\'{$\'.$name.\'.\'.$array[0].\'}\')\">\'.$array[2].\'</a> \';
}else{
//转换 -- 为 , 传递多个参数
$val = str_replace(\'--\',\',\',$val);//此处为新增内容
$parseStr .= \' {$\'.$name.\'.\'.$val.\'} \';
}
}
}
$parseStr .= \'</td>\';
//echo $parseStr;
//exit();
}
}
$parseStr .= \'</tr></volist><tr><td height=\"5\" colspan=\"\'.$colNum.\'\" class=\"bottomTd\"></td></tr></table>\';
$parseStr .= \"n<!-- Think 系统列表组件结束 -->n\";
return $parseStr;
}
模版调用演示:
<html:list id=\"checkList\" name=\"user\" style=\"list\" checkbox=\"true\" action=\"true\" datasource=\"list\" show=\"id:编号,task_title:任务标题:edit,task_type|getTaskType:任务类型,task_category|getTaskCategory=$user[\'exe_user\']--$user[\'id\']:所属栏目,hope_time|toDate=\'Y-m-d H#i\':期望完成时间,process_rate|printRate:当前进度,exe_user|getUserName:处理人,status|getTaskStatus:状态\" actionlist=\"status|printAccept=$user[\'exe_user\']--$user[\'id\'],task_track:跟踪\" />
方法 getTaskCategory 传递了3个参数 顺序是:
$user[\'task_category\']
$user[\'exe_user\']
$user[\'id\']
方法 printAccept 传递了3个参数 顺序是:
$user[\'status\']
$user[\'exe_user\']
$user[\'id\']
其中:
task_category|getTaskCategory=$user[\'exe_user\']--$user[\'id\']:
与
status|printAccept=$user[\'exe_user\']--$user[\'id\'],task_track:跟踪
为 传递多个参数的演示
希望本文所述对大家的ThinkPHP框架程序设计有所帮助。