1.数据库设计:
CREATE TABLE `smar_category` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '栏目ID',
`pid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
`catname` varchar(30) NOT NULL COMMENT '栏目名称',
`sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`id`),
INDEX pid (pid)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
2.思路:
①设置pid 保存父级栏目
②取出所有数据
③调用递归函数进行排序
3.源码
1 <?php 2 //处理栏目 3 class CateModel extends Model{ 4 /** 5 *===============取出所有栏目===================================== 6 * @param int $issort 是否进行栏目排序 | 7 * @param string $field 取出来的字段 如多个字段中间用,隔开 | 8 * @param string $sort 数据排序 | 9 * @return array 返回数组 | 10 *================================================================ 11 */ 12 public function getAllCate($issort = true,$field = '*',$sort = 'sort ASC'){ 13 if($issort){ 14 $rows = $this->field($field)->order($sort)->select(); 15 $allCate = $this->getCate($rows); 16 }else{ 17 $allCate = $this->field($field)->order($sort)->select(); 18 } 19 20 return $allCate; 21 } 22 /** 23 *============栏目排序============================================ 24 * @param array $data 需要进行排序的数组 | 25 * @param int $parantid 父级栏目 | 26 * @param int $level 对栏目进行属于第几层进行标示 | 27 * @return array 返回排列好的数据 | 28 *================================================================ 29 */ 30 public function getCate($data , $parentid = 0 , $level = 0){ 31 static $rel = array(); 32 foreach($data as $k => $v){ 33 if($v['pid'] == $parentid){ 34 $v['level'] = $level; 35 $rel[] = $v; 36 unset($data[$k]); 37 $this->getCate($data,$v['id'],$level+1); 38 } 39 } 40 return $rel; 41 } 42 43 /** 44 *=================对栏目进行数组层层递进排序======================= 45 * @param array $data 获取的栏目 | 46 * @param int $parentid 父级栏目 | 47 * @return array 排序好的栏目 | 48 *================================================================== 49 */ 50 static function sortArrCate($data,$parentid = 0){ 51 $rel = array(); 52 foreach($data as $k => $v){ 53 if($v['pid'] == $parentid){ 54 $v['child'] =self::sortArrCate($data,$v['id']); 55 $rel[] = $v; 56 } 57 } 58 return $rel; 59 } 60 /** 61 *=================================根据ID获取下级所有栏目信息=========================== 62 * @param array $data 获取的栏目 | 63 * @param int $id 传递父级栏目的ID | 64 * @param char $isid 传递一个字段名称,默认为取全部的内容 | 65 * @param array 返回该栏目的所有子栏目 | 66 *====================================================================================== 67 */ 68 static public function getSonCate($data,$id,$isid = ''){ 69 $rel = array(); 70 foreach($data as $k => $v){ 71 if($v['pid'] == $id){ 72 $rel[] = empty($isid)?$v:$v[$isid]; 73 $rel = array_merge($rel , self::getSonCate($data,$v['id'],$isid)); 74 } 75 } 76 return $rel; 77 } 78 /** 79 *============================根据子栏目ID获取所有上级栏目信息========================== 80 * @param array $data 获取的栏目 | 81 * @param int $id 传递子级栏目的ID | 82 * @param char $isid 传递一个字段名称,默认为取全部的内容 | 83 * @param array 返回该栏目的所有子栏目 | 84 *====================================================================================== 85 */ 86 static public function getParentCate($data,$id,$isid = ''){ 87 $rel = array(); 88 foreach($data as $k => $v){ 89 if($v['id'] == $id){ 90 $rel[] = empty($isid)?$v:$v[$isid]; 91 $rel = array_merge(self::getParentCate($data,$v['pid'],$isid),$rel); 92 } 93 } 94 return $rel; 95 } 96 /** 97 *====================修改栏目======================================== 98 * @param array $data 传递过来的POST数据 | 99 * @param int $id 将要修改的栏目ID | 100 * @return boolen 返回BOOLEN值 | 101 * =================================================================== 102 */ 103 public function exitCate($data,$id){ 104 if($this->where(array('id'=>$id))->save($data)){ 105 return true; 106 }else 107 return false; 108 } 109 /** 110 *=======================删除栏目======================== 111 * @param int $id 需要删除的ID信息 112 * ====================================================== 113 */ 114 public function delCate($id){ 115 $data = self::getAllCate(false); 116 $sonId = self::getSonCate($data,$id,'id'); 117 $this->where(array('id'=>$id))->delete(); 118 foreach($sonId as $k =>$v ){ 119 $this->where(array('id'=>$v))->delete(); 120 } 121 } 122 } 123 ?>