|
|

一个无限分类生成树状的类,一次数据查询,数据结构简单.- <?php
- //一次数据库操作,无限分类,树状显示
- class CategoryClass {
- var $prefix = "tb_"; //表前缀
- var $table = "category"; //表名称
- var $prikeyfield = "cid"; //分类编号,smallint primary auto_increment
- var $parentfield = "pid"; //上级分类编号,如果是根分类则pid=0; smallint
- var $categoryfield = "CategoryName"; //分类名称
- var $orderfield = "displayorder"; //排序字段
-
- var $Category_name = array(); //所有分类名称数组,key是类别编号,var是类别名称
- var $Target_Category = array(); //目标分类数组,便于输出树状结构
- var $option = array(); //得到的排序后的数状数组,生成select options
- var $order_array = array(); //所有类别的排序数组,key是类别编号,var是排序字段
-
-
- function init($prefix,$table,$prikeyfield,$parentfield,$categoryfield,$orderfield){
- $this->prefix = $prefix;
- $this->table = $this->prefix.$table;
- $this->prikeyfield = $prikeyfield;
- $this->parentfield = $parentfield;
- $this->categoryfield = $categoryfield;
- $this->orderfield = $orderfield;
- //得到所有数据
- $this->getData();
- }
-
-
- //添加分类
- function Add($category_name, $pid=0) {
- global $db;
- $query = $db->query("SELECT * FROM ".$this->table." WHERE ".$this->categoryfield."='".$category_name."'");
- if($db->num_rows($query)) {
- return false;
- } else {
- $db->query("INSERT INTO ".$this->table." (".$this->categoryfield.",
- ".$this->parentfield.") VALUES ('".$category_name."', '".$pid."')");
- return true;
- }
- }
- //得到所有分类数据
- function getData() {
- global $db;
- $query = $db->query("SELECT * FROM ".$this->table." ORDER BY ".$this->orderfield." ASC");
- while ($sort = $db->fetch_array($query)) {
- $this->Target_Category[$sort[$this->parentfield]][$sort[$this->prikeyfield]] = $sort;
- $this->Category_name[$sort[$this->prikeyfield]] = $sort[$this->categoryfield];
- $this->order_array[$sort[$this->prikeyfield]] = $sort[$this->orderfield];
- }
- $db->free_result($query);
- }
- /***
- * $sortid: 类别ID, 0表示生成所有类别的树状select option
- * $p : 是否显示本身(例如:如果要找出sortid=1的所有子类及其本身,则P=1)
- *
- * 根据类别ID,找到所有子类,生成$option
- */
- function getArrayById($sortid = "0", $p="1", $level = 1) {
- $tmp_array=array();
- foreach($this->Target_Category AS $k => $v) {
- $tmp_array[]=$k;
- }
- if(!empty($this->Category_name)) {
- if(!in_array($sortid, $tmp_array)) {
- if($p==1) $this->option[$sortid] = $this->Category_name[$sortid];
- } else {
- foreach($this->Target_Category[$sortid] AS $key => $sort) {
- if($sortid != '0' && $p=='1') {
- $this->option[$sortid] = $this->Category_name[$sortid];
- $level = 2;
- }
- $m = ($sortid==$sort[$this->prikeyfield]||$sortid==0) ? "" : "|- ";
- $this->option[$sort[$this->prikeyfield]] = str_repeat(" ", $level-1) .$m.$sort[$this->categoryfield];
- $this->getArrayById($sort[$this->prikeyfield], '0', $level + 1);
- }
- }
- }
- }
-
- //更新分类排序
- function updateOrder($cid, $displayorder) {
- global $db;
- $db->unbuffered_query("UPDATE ".$this->table." SET ".$this->orderfield."='".$displayorder."' WHERE ".$this->prikeyfield."='".$cid."'");
- }
-
- //更新类别数据
- function updateCategoryData($category_name, $pid, $cid) {
- global $db;
- $db->unbuffered_query("UPDATE ".$this->table." SET ".$this->categoryfield."='".$category_name."',
- ".$this->parentfield."='".$pid."' WHERE ".$this->prikeyfield."='".$cid."'");
- }
-
- //得到指定类别数据
- function getCategoryData($cid) {
- global $db;
- return $db->fetch_one_array("SELECT * FROM ".$this->table." WHERE ".$this->prikeyfield."='".$cid."'");
- }
-
- //删除指定类别数据
- function deleteCategoryData($cid) {
- global $db;
- $db->query("DELETE FROM ".$this->table." WHERE ".$this->prikeyfield."='".$cid."'");
-
- }
-
- //删除指定类别及其所有子类
- function deleteAllCategoryData($cid) {
- global $db;
- $sql = '';
- $this->getArrayById($cid,1);
- foreach($this->option AS $key => $var) {
- $sql .=$key.",";
- }
- $sql = "DELETE FROM ".$this->table." WHERE ".$this->prikeyfield." IN (".substr($sql,0,-1).")";
- $db->query($sql);
- }
-
- }
- ?>
复制代码 |
|