麻辣堂|资源主站|开发论坛|在线手册
首页 Apache Linux Java MySQL 注册帮助 
PHP项目开发组是PHP开发资源网于2007组年建成立的项目开发团队,目前核心开发成员有27人, 项目协作成员8名.下设7个开发组,主要承接大/中型网站项目开发任务。

    由于开发任务较多,人员比较紧张,现面向社会招聘全职或者兼职开发人员,不管你是在校大学生,还是全职开发人员,以及SOHO都可以联系本站,我们可以长期合作,并为您带来丰厚的报酬。
  您现在的位置:PHP开发资源网 > 麻辣堂 > 详细资料
待解决
无限分类类,噼噼啪啪~~
悬赏分:20 - 2007年08月18日

[PHP]<?
/**
* 类名 树型分类类
*
* 本类配合一个数据表实现无限分类和排序
*
* 表结构 id,类名,父类,层次,序列
*
*
* 分页类
* 分类类
* 用户类
* 资源类
* 模版类
* 数据库类
*
* 过程
*/
class Tree
{
var $DB; //ADODB类型的对象
var $TBname; //分类表的名字

/**
* 初始化DB连接
*
*/
function Tree($DBlink){
//**如果不成功调用 父类的Error方法
//**应该把分类表的名字放到一个变量中
$TBname = "class";
$this->DB = $DBlink;
}

/**
* 添加一个节点
* 参数
* 返回值 : 分类的名字不能重复,如果重复,返回fasle 否则返回插入执行是否成功
*/
function addClass($ClassName,$Father = 0)
{
$FatherId = $this->getId($Father);
//获得id 如果已经是id了就直接返回id;

if($FatherId==0){
$Floor=1;
}else{
$sql = "select Floor from class where id=".$FatherId." ";
$res = $this->DB->execute($sql);

//获得查询结果中Floor
$Floor = $res->fields['Floor']+1;
}


//查询同层最大值并将结果加一当作自己的顺序值
//如果当前还没有存在该层那么序列号为1
$sql = "select max(ListOrder) maxListOrder from class where Floor=$Floor && FatherId = $FatherId";
$res = $this->DB->execute($sql);
$ListOrder = $res->fields['maxListOrder']+1;

//分类中不能有重复的元素名字 更合理的应该是同级别中不能存在重复元素的名字
$sql = "select id from class where name='".$ClassName."' && Floor=$Floor";
$res = $this->DB->execute($sql);
if($res->_numOfRows > 0 ){
//有同层重名分类
return 0;
}
// 执行插入
$sql = "insert into class set name='".$ClassName."',FatherId = ".$FatherId.",Floor=".$Floor.",ListOrder=".$ListOrder."";
if($this->DB->execute($sql))
return true;
else
return false;
}

/**
* 删除一棵树
* 接收一个 id 或者 名字
* 参数:分类的id。
* 返回: 删除的元素序列。
* 处理:如果是叶子节点直接删除,如果是非叶子节点,删除相关所有节点
*/
function delClass($ClassName){
//echo $ClassName;
$ClassId = (int)$this->getId((int)$ClassName); //获得id 如果已经是id了就直接返回id;
//该类如果存在删除该类
$sql = "delete from class where id = $ClassId";
$this->DB->execute($sql);
//查找该类的子类
$sql = "select id from class where FatherId =$ClassId";
$res = $this->DB->execute($sql);
while(!$res->EOF){
$this->delClass((int)$res->fields['id']); //强制类型转换为整形
$res->MoveNext();
}
//return null;
}

/**
* 获得单个层的名字
* 序列号可以使用静态变量完成 首先统计层次,然后按照层次实现显示层次
*/
function getChildClass($Cls)
{
$ClassId = $this->getId($Cls);
$sql = "select * from class where FatherId=$ClassId";
$res = $this->DB->execute($sql);
return $res->getArray();
}

/**
* 获得下层分类的名字和ID
*/
function getChildClassNameAndId($Cls){
$Ary = $this->getChildClass($Cls);
$NameAndId = array();
foreach($Ary as $key=>$val){
$NameAndId[$val['id']] = $val['name'];
}
return $NameAndId;
}

/**
* 获得一颗树中所有值的name和ID
* @param 类的id;
*
*/
function getTreeName($Cls)
{
//!!!!对象数组
static $Ary= array();
$ClassId = $this->getId($Cls); //获得id 如果已经是id了就直接返回id;

//搜索类信息
$sql = "select id,name,Floor from class where id = $ClassId";
$res = $this->DB->execute($sql);
$Ary[] = $res->fields;
//查找该类的子类
$sql = "select id,name,Floor from class where FatherId =$ClassId";
$res = $this->DB->execute($sql);
while(!$res->EOF){
$Ary[] = $res->fields;
$this->getTreeName((int)$res->fields['id']); //强制类型转换为整形
$res->MoveNext();
}
//print_r($Ary);
//!!!!组织tree
$className = array();
foreach($Ary as $key=>$val){
$b="";
for($a = 1;$a<$val['Floor'];$a++){
$b .="├";
//$b .="..";
}
$className[$val['id']] = $b.$val['name'];
}

return $className;

}

/**
* 获得分类的路径
* 递归函数中使用 while时候应该小心 尤其容易陷入无穷循环;其实不是递归了,而是陷入while 循环了
*/
function getClassPath($Cls)
{
$ClassId = $this->getId($Cls);
static $Path = array();
$sql = "select id,name,FatherId from class where id = $ClassId";
$res = $this->DB->execute($sql);
//echo $res->fields['id'];
$Path[$res->fields['id']] = $res->fields['name'];
//echo_r($Path);
if(intval($res->fields['FatherId'])!=intval(0)){
$this->getClassPath((int)$res->fields['FatherId']);
}
//echo_r($Path);
return array_reverse($Path,TRUE); //返回一个反序的一维数组
}

/**
* 清空分类表
*/
function emptyClass()
{
$sql = "TRUNCATE TABLE `class`";
return $this->DB->execute($sql);
}

/**
* 根据类名称获得id
*/
function getIdByClassName($name)
{
$sql = "select * from class where name = '$name'";
$res = $this->DB->execute($sql);
return $res->fields['id'];
}

/**
* 根据id获得父id
*/
function getFatherId($ClsId)
{
$sql = "select FatherId from class where id = $ClsId";
$res = $this->DB->execute($sql);
return $res->fields['FatherId'];
}

/**
//修改一个分类的信息 参数:分类的id,修改的信息。返回:BOOL。 处理:本方法仅修改非关系分类信息
*/
function changeClass()
{
;
}

/**
//获得一个分类的信息 参数:分类的id。返回:分类的信息数组
*/
function getClassInfo()
{
;
}

/**
//获得一组分类的信息 参数:分类的id。返回:本组分类的所有信息
*/
function getTermClass()
{
;
}

/**
//获得一个分类的所有子分类的信息 参数:分类的id。 返回:分类和分类的子节点以及更深层节点的信息
*/
function getAllChildClass()
{
;
}

/**
//修改分类的顺序 参数:分类的id,分类希望的位置数字。返回:BOOL。 操作:如果是非0数字就重新排列该分类所有数据,如果是"UP"就表示把分类上移,如果是"Down"就表示把分类下移
*/
function changeClassOrder()
{
;
}
/**
//操作选取函数:{如果输入为数字 就当作id处理,如果传入为字符串就当作name处理,即调用getIdByClassName()}
*/
function getId($msg)
{
if(is_int($msg))
return $msg;
else
return $this->getIdByClassName($msg);
}

/**
* 最小需求(又称理想化需求)
*
* 创建一棵树 如果没有指定父亲其父亲就是根 如果传递的是一个字符串就是叶子 如果传递的是多维数组 按照数组结构填充树
* 删除一棵树
* 获得一棵树的信息 获得一颗树的相关信息,包括其子树 可以接收id或者name;
* 修改一棵树的位置 传入希望把一颗已经存在的树 移动到的地方来达到更改树位置的目的 涉及层次和顺序问题
* 获得一棵树的路径 传入节点的id或名字 来获得节点和根之间的路径
*/
}
?> [/PHP]

提问者:pplboy   08-18 11:11
答复
路过。。。顺便帮顶:)
回答者:玉米づ冰冻可乐 - 瓦岗村民 8-22 09:10
我也来回答:
不管你有没有帮助我们,瓦岗寨8万村民将感谢你。。。。。

为防止灌水,您需要计算一道数学题: 答案:
96 + 36 = ? 请将计算结果填在上面

 
[]
©2007 PhpRes.COM