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