基本思路是先用递归把栏目整成多维数组,并缓存之。多维数组表示一级一级的,然后输出的时候再用递归把多维数组循环输出出来,另外我写了JQUERY代码,可以展开关闭子分类
前天哥哥写了个递归,发现查库次数太多,所以修改了一下,现在只查库一次了,有问题的发我邮箱交流 576272452@qq.com,没代码没真相,下面上代码
1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存/*更新缓存文件*/<br>
$map['topid'] = 0;<br>
$map['yiyuanid'] = $this->_get('yiyuanid');<br>
$other['order'] = 'sort desc,keshi.id asc';<br>
$other['field'] = 'keshi.*,yiyuan.name as yiyuan';<br>
$other['join'] = 'yiyuan on yiyuan.id=keshi.yiyuanid';<br>
$digui = digui('keshi',$map,$other);<br>
S('keshi',$digui);//缓存数据
2、核心的三个递归函数/*<br>
* 递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存<br>
* @param string $table 查询的表名<br>
* @param array $where 查询的where条件<br>
* @param array $other 其它查询需要的变量<br>
* @return array $list 一个表示层级关系的多维数组<br>
*/<br>
function digui($table,$where,$other){<br>
$Form = M($table);<br>
if($other['join']){<br>
$list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();<br>
}else{<br>
$list = $Form->field($other['field'])->where($where)->order($other['order'])->select();<br>
}<br>
foreach ($list as $k => $v) {<br>
if($digui = digui($table,array('topid'=>$v['id']),$other)){<br>
$list[$k]['childs'] = $digui;//递归子类<br>
} <br>
}<br>
return $list;<br>
}<br>
<br>
/*<br>
* 读取递归数据的函数,使用前请把digui()函数的返回值进行缓存<br>
* @param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的<br>
* @return void 无返回值直接输出<br>
*/<br>
function KeshiType($list){<br>
foreach ($list as $k => $v) {<br>
echo '<tr>
<td>
<span></span>'.$v['id'].'</td>
<td>'.$v['yiyuan'].'</td>
<td>'.$v['name'].'</td>
<td>
<span>编辑</span> <span>编辑</span> <a>编辑</a> <a>删除</a>
</td>
</tr>';<br>
KeshiTypeSeed($v['childs']);<br>
} <br>
}<br>
/*<br>
* 楼上KeshiType的子函数配合递归<br>
*/ <br>
function KeshiTypeSeed($list){<br>
if($list){<br>
echo '<tr><td><table>';<br>
foreach ($list as $k => $v) {<br>
echo '<tr>
<td>
<span></span>'.$v['id'].'</td>
<td>'.$v['yiyuan'].'</td>
<td>'.$v['name'].'</td>
<td>
<span>编辑</span> <span>管理2</span> <a>管理</a> <a>删除</a>
</td>
</tr>';<br>
KeshiTypeSeed($v['childs']);<br>
}<br>
echo '</table></td></tr>';<br>
}<br>
}
3、在模板中使用缓存进行递归栏目/我增加了点击展开关闭栏目的jquery代码,<br>
<script><br />
/*<br />
* 点击展开子类<br />
*<br />
*/<br />
$(".jia").click(function(){<br />
if($(this).parent("td").parent("tr").next(".seed").is(":hidden")){<br />
$(this).parent("td").parent("tr").next(".seed").show();<br />
$(this).html("-");<br />
}else{<br />
$(this).parent("td").parent("tr").next(".seed").hide();<br />
$(this).html("+"); <br />
}<br />
<br />
});<br />
<br />
$(".seed").prev(".fid").find("td").find("span.jia").html("-");<br />
<br />
/*<br />
* 点击关闭所有子类<br />
*<br />
*/<br />
$("#closeseed").click(function(){<br />
if($(this).val() == "展开所有子类"){<br />
$(".seed").show();<br />
$(this).val("关闭所有子类");<br />
$.each($(".jia"),function(k,v){<br />
if($(this).html()){<br />
$(this).html("-");<br />
}<br />
}); <br />
}else{<br />
$(".seed").hide();<br />
$(this).val("展开所有子类");<br />
$.each($(".jia"),function(k,v){<br />
if($(this).html()){<br />
$(this).html("+");<br />
}<br />
}); <br />
} <br />
});<br />
<br />
});<br />
</script><br>
//模板递归的部分 <br>
<php><br>
$keshis = S('keshi');//读取缓存<br>
KeshiType($keshis);//递归输出数据<br>
</php>
AD:真正免费,域名+虚机+企业邮箱=0元