Tp5 无限极分类分享

浏览1193

无限极分类经常会用到,以下是一个案例,供大家参考:

知识点:

1、递归

2、PHP str_repeat(string,repeat)       函数把字符串重复指定的次数。

3、PHP unlink() 函数    unlink() 函数删除文件。

4、PHP file_exists() 函数   file_exists() 函数检查文件或目录是否存在。


扩展类:Catetree.php

<?php
namespace catetree;
class Catetree{

    public function catetree($cateRes){
        return $this->sort($cateRes);
    }

    public function sort($cateRes,$pid=0,$level=0){

        static $arr=array();
        foreach ($cateRes as $k => $v) {
            if($v['pid']==$pid){
                $v['level']=$level;
                $arr[]=$v;
                $this->sort($cateRes,$v['id'],$level+1);
            }
        }

        return $arr;
    }

    // 处理栏目排序
    public function cateSort($data,$obj){
    	foreach ($data as $k => $v) {
    		$obj->update(['id'=>$k,'sort'=>$v]);
    	}
    }
    //获取子栏目id

   public function childrenids($cateid,$obj){
        $data=$obj->field('id,pid')->select();
        return $this->_childrenids($data,$cateid);
   }

   private function _childrenids($data,$cateid){
        static $arr=array();
        foreach ($data as $k => $v) {
            if($v['pid']==$cateid){
                $arr[]=$v['id'];
                $this->_childrenids($data,$v['id']);
            }
        }

        return $arr;
   }

   //处理批量删除

   public function pdel($cateids){
            foreach ($cateids as $k => $v) {
                $childrenidsarr[]=$this->childrenids($v);
                $childrenidsarr[]=(int)$v;
            }  
            $_childrenidsarr=array();
            foreach ($childrenidsarr as $k => $v) {
                if(is_array($v)){
                    foreach ($v as $k1 => $v1) {
                       $_childrenidsarr[]=$v1;
                    }
                }else{
                    $_childrenidsarr[]=$v;
                }
            }
            $_childrenidsarr=array_unique($_childrenidsarr);
            $this::destroy($_childrenidsarr);
    
   }
}

调用说明:在extend目录下新建一个目录 catetree 目录,再新建文件 Catetree.php

控制器里:

<?php
namespace app\admin\controller;
use think\Controller;
use catetree\Catetree; //引入扩展类
class Cate extends controller
{
    public function lst()
    {   
        $cate=new Catetree();
        $cateObj=db('cate');
    	$cateRes= $cateObj->order('sort desc')->select();
        $cateRes = $cate->catetree($cateRes);
    	$this->assign('cateRes',$cateRes);
        return view();
    }
    public function add()
    {
        $cate=new Catetree();
        $cateObj=db('cate');
    	if(request()->isPost()){
    	    $data=input('post.');
            $cateId=$cateObj->field('pid')->find($data['pid']);
    		$add=$cateObj->insert($data);
    		if($add){
    			$this->success('操作成功!','lst');
    		}else{
    			$this->error('操作失败!');
    		}
    		return;
    	}
        $cateRes= $cateObj->order('sort desc')->select();
        $cateRes = $cate->catetree($cateRes);
        $this->assign('cateRes',$cateRes);
        return view();
    }
  //删除(实现删除顶级分类,删除所有子类文章)
    public function del($id)
    {
       $cate=db('cate');
       $cateTree = new Catetree();
       $sonids=$cateTree->childrenids($id,$cate);
       $sonids[]=intval($id);
       $article=db('article');
       foreach ($sonids as $k => $v) {
           $artRes=$article->field('id,thumb')->where(array('cate_id'=>$v))->select();
           foreach ($artRes as $k1 => $v1) {
               $thumbSrc=IMG_UPLAODS.$v1['thumb'];
               if(file_exists($thumbSrc)){//判断文件是否存在
                    @unlink($thumbSrc);
                }
                $article->delete($v1['id']);
            }
       }
       $del=$cate->delete($sonids);
       if($del){
			$this->success('操作成功!','lst');
		}else{
			$this->error('操作失败!');
		}
    }
}

视图模板:

image.png

image.png

呈现层级效果:str_repeat(string,repeat) 函数把字符串重复指定的次数。

<td><?php echo str_repeat('-', $cate['level']*8) ?>{$cate.cate_name}</td>



  • 暂无任何回答