站长论坛
标题:
php无限分类生成树状的类
[打印本页]
作者:
webptr
时间:
2007-10-5 11:31
标题:
php无限分类生成树状的类
一个无限分类生成树状的类,一次数据查询,数据结构简单.
<?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);
}
}
?>
复制代码
欢迎光临 站长论坛 (https://tzlink.com/bbs/)
Powered by Discuz! X3.2