站长论坛

标题: php无限分类生成树状的类 [打印本页]

作者: webptr    时间: 2007-10-5 11:31
标题: php无限分类生成树状的类
一个无限分类生成树状的类,一次数据查询,数据结构简单.
  1. <?php

  2. //一次数据库操作,无限分类,树状显示


  3. class CategoryClass {
  4.         var $prefix                = "tb_";            //表前缀
  5.         var $table                = "category";        //表名称
  6.         var $prikeyfield        = "cid";            //分类编号,smallint  primary auto_increment
  7.         var $parentfield        = "pid";            //上级分类编号,如果是根分类则pid=0; smallint
  8.         var $categoryfield        = "CategoryName";    //分类名称
  9.         var $orderfield            = "displayorder";    //排序字段
  10.    
  11.         var $Category_name       = array();            //所有分类名称数组,key是类别编号,var是类别名称
  12.         var $Target_Category     = array();            //目标分类数组,便于输出树状结构     
  13.         var $option              = array();            //得到的排序后的数状数组,生成select options
  14.         var $order_array         = array();          //所有类别的排序数组,key是类别编号,var是排序字段
  15.         
  16.         
  17.         function init($prefix,$table,$prikeyfield,$parentfield,$categoryfield,$orderfield){
  18.             $this->prefix             = $prefix;
  19.             $this->table             = $this->prefix.$table;
  20.             $this->prikeyfield         = $prikeyfield;
  21.             $this->parentfield         = $parentfield;
  22.             $this->categoryfield     = $categoryfield;
  23.             $this->orderfield         = $orderfield;
  24.             //得到所有数据
  25.             $this->getData();
  26.         }
  27.         
  28.         
  29.         //添加分类
  30.         function Add($category_name, $pid=0) {
  31.                 global $db;
  32.                 $query     = $db->query("SELECT * FROM ".$this->table." WHERE ".$this->categoryfield."='".$category_name."'");
  33.                 if($db->num_rows($query)) {
  34.                     return false;
  35.                 } else {
  36.                     $db->query("INSERT INTO  ".$this->table." (".$this->categoryfield.",
  37.                                ".$this->parentfield.") VALUES ('".$category_name."', '".$pid."')");
  38.                     return true;
  39.                 }
  40.         }
  41.         //得到所有分类数据
  42.         function getData() {
  43.                 global $db;
  44.                 $query     = $db->query("SELECT * FROM ".$this->table." ORDER BY ".$this->orderfield." ASC");
  45.                 while ($sort = $db->fetch_array($query)) {
  46.                   $this->Target_Category[$sort[$this->parentfield]][$sort[$this->prikeyfield]]     = $sort;
  47.                   $this->Category_name[$sort[$this->prikeyfield]]                                 = $sort[$this->categoryfield];
  48.                   $this->order_array[$sort[$this->prikeyfield]]                                   = $sort[$this->orderfield];
  49.                 }
  50.                 $db->free_result($query);
  51.         }
  52.         /***
  53.         * $sortid:   类别ID, 0表示生成所有类别的树状select option
  54.         * $p     :   是否显示本身(例如:如果要找出sortid=1的所有子类及其本身,则P=1)
  55.         *
  56.         * 根据类别ID,找到所有子类,生成$option   
  57.         */   
  58.         function getArrayById($sortid = "0", $p="1", $level = 1) {
  59.                $tmp_array=array();
  60.                foreach($this->Target_Category AS $k => $v) {
  61.                          $tmp_array[]=$k;
  62.                   }
  63.                   if(!empty($this->Category_name)) {
  64.                       if(!in_array($sortid, $tmp_array)) {
  65.                              if($p==1) $this->option[$sortid] = $this->Category_name[$sortid];
  66.                       } else {
  67.                           foreach($this->Target_Category[$sortid] AS $key => $sort) {
  68.                            if($sortid != '0' && $p=='1') {
  69.                                    $this->option[$sortid] = $this->Category_name[$sortid];
  70.                                    $level = 2;
  71.                            }
  72.                            $m = ($sortid==$sort[$this->prikeyfield]||$sortid==0) ? "" : "|- ";
  73.                            $this->option[$sort[$this->prikeyfield]] = str_repeat("   ", $level-1) .$m.$sort[$this->categoryfield];
  74.                            $this->getArrayById($sort[$this->prikeyfield], '0', $level + 1);
  75.                        }
  76.                       }
  77.                   }
  78.           }
  79.          
  80.           //更新分类排序
  81.           function updateOrder($cid, $displayorder) {
  82.                  global $db;
  83.                  $db->unbuffered_query("UPDATE ".$this->table." SET ".$this->orderfield."='".$displayorder."' WHERE ".$this->prikeyfield."='".$cid."'");
  84.           }
  85.          
  86.           //更新类别数据
  87.           function updateCategoryData($category_name, $pid, $cid) {
  88.                  global $db;
  89.                  $db->unbuffered_query("UPDATE ".$this->table." SET ".$this->categoryfield."='".$category_name."',
  90.                                            ".$this->parentfield."='".$pid."' WHERE ".$this->prikeyfield."='".$cid."'");
  91.           }
  92.          
  93.           //得到指定类别数据
  94.           function getCategoryData($cid) {
  95.                  global $db;
  96.                  return $db->fetch_one_array("SELECT * FROM ".$this->table." WHERE ".$this->prikeyfield."='".$cid."'");
  97.           }
  98.          
  99.           //删除指定类别数据
  100.           function deleteCategoryData($cid) {
  101.               global $db;
  102.               $db->query("DELETE  FROM ".$this->table." WHERE ".$this->prikeyfield."='".$cid."'");
  103.               
  104.           }
  105.          
  106.           //删除指定类别及其所有子类
  107.           function deleteAllCategoryData($cid) {
  108.                  global $db;
  109.                  $sql = '';
  110.                  $this->getArrayById($cid,1);
  111.                  foreach($this->option AS $key => $var) {
  112.                         $sql .=$key.",";  
  113.                  }
  114.                  $sql = "DELETE  FROM ".$this->table." WHERE ".$this->prikeyfield." IN (".substr($sql,0,-1).")";
  115.                  $db->query($sql);
  116.           }
  117.          
  118. }
  119. ?>
复制代码





欢迎光临 站长论坛 (https://tzlink.com/bbs/) Powered by Discuz! X3.2