`
wangminshe89
  • 浏览: 670877 次
文章分类
社区版块
存档分类
最新评论

无限分类处理类

 
阅读更多
<?php

/* 名称: 对分类操作的业务逻辑封装

*

* 作者: 帅的像人渣QQ: 1191391E-mail: netcat2@21cn.com

*

* 完成日期: 2003-12-18 13:33

*

* 说明: 本类中引用的其它类(DB、Table、Item)均未提供,所以本类只能做个参考,不能直接应用

*不是本人小气不提供其它类,实在是因为那些都是一两年前写的类,很烂。怕大家看后对大

*造成误导. 在此发表这个类,只希望大家能从中学到一些程序设计的方法。

*授人以鱼不如授人以渔~

*

* 特点:

*采用递归调用的方法,对分类数据只需一次数据库查询可生成树状结构。 无限递归层次(视机器堆栈而定)

*

* 数据库定义:

*IDsmallint unsignedprimary#如果数据量很大可用int

*ParentIDsmallint unsignedindex#如果数据量很大可用int, 请索引此字段

*#如果为根分类,则ParentID = 0

*

*RootIDsmallint unsignedindex#如果数据量很大可用int, 请索引此字段

*#如果是根分类则RootID = 0, 否则RootID = 最上层的父分类ID

*CategoryName varchar(n)#此大小自定

*如需有其它字段定义附在后面



* 注意事项:

*不要试图直接调用本类,除非你有和我定义那另外那几个类相对应的接口, 否则不会成功

*在合适的地方定义 DBTABLE_CATEGORY 这个常量,使其指向你的分类数据表名字

*

* 程序构架:

*├─基础类<!-- 完成底层数据库操作、数据抽象、语言、模板、异常、杂项等)操作 -->

*│

*│

*└─业务逻辑层(此类所处层次)<!-- 利用基础类中数据操作、数据抽象等类根据表现层传递的参数完成数据处理,并返回数据或操作结果 -->

*│

*│

*└───表现层(用户界面)<!-- 利用业务逻辑层将取得的数据或操作数据的结果通过基础类中的界面等类进行显示 -->

*/



define('DBTABLE_CATEGORY', 'xxx');



class Category_Logic

{

var $KernelRef= NULL;//系统核心的引用

var $tblObj= NULL;//包含当前分类数据 Table 类的实例



var $_CurrentItem= NULL;//包含当前分类数据 TItem类的实例



var $CategoryID= 0;//当前分类ID,如果没有当前分类此项为 0



//---------------------------------------------------------------------------

//privatearray GetNodeData(array $Data, int $ParentNode)

//根据一颗指定根的并且以兄弟双亲法表示的树和当前分类的ID,返回当前分类在整个分类表中所处的位置

//

// @param: $Data2维数组Array(

//Array(

//'ID'=> 分类ID,

//'ParentID'=> 父分类ID,

//'RootID'=> 根分类ID,

//'CategoryName'=> 分类名称,

//),

//……

//);

//表示的一颗树

//

// @param: $ParentNode父分类ID, 每一次由调用者给出,递归时由程序计算传递

//

// return value:返回以兄弟双亲法表示的所有分类的树

//注意: 确保当前分类已经设置,否则此函数无返回

//

//---------------------------------------------------------------------------

function GetNodeData($Data, $ParentNode)

{

$arr = Array();



$ArrayCount = 0;



for($i = 0, $cnt = Count($Data); $i < $cnt; $i++)

{

if($Data[$i]['ParentID'] == $ParentNode)

{

$arr[$ArrayCount]=$Data[$i];

$arr[$ArrayCount++]['Child']=$this->GetNodeData($Data, $Data[$i]['ID']);

}

}



return $arr;

}



//---------------------------------------------------------------------------

//privateString _CurrentLevel(array $Data, int $Current, String $ProcessFunc = '')

//根据一颗指定根的并且以兄弟双亲法表示的树和当前分类的ID,返回当前分类在整个分类表中所处的位置

//

// @param: $Data兄弟双亲法表示的树, 由调用者传递

//

// @param: $Current当前分类ID,第一次调用时由调用者给出,递归时由程序自行计算

//

// @param: $ProcessFunc指定对分类数据的处理函数, 函数原型定义见 $this->PrintCurrentLevel 中的注释

//

// return value:返回当前分类在分类树中的位置

//注意: 确保当前分类已经设置,否则此函数无返回

//

//---------------------------------------------------------------------------

function _CurrentLevel($Data, $Current, $ProcessFunc = '')

{

for($i = 0; $i < Count($Data); $i++)

{

if($Data[$i]['ID'] == $Current)

{

if($Data[$i]['ParentID'] != 0)

{

$str = $this->_CurrentLevel($Data, $Data[$i]['ParentID'], $ProcessFunc) . ' -&gt; ';



if($ProcessFunc) $str .= $ProcessFunc($Data[$i]);

else $str .= $Data[$i]['CategoryName'];

}

else

{

if($ProcessFunc) $str = $ProcessFunc($Data[$i]);

else $str = $Data[$i]['CategoryName'];

}

break;

}

}



return $str;

}



//---------------------------------------------------------------------------

//publicCategory_Logic(Object &$Kernel, int $CategoryID = -1)

//本类构造函数

//

// @param: $Kernel此参数为当前系统核心类的一个引用, 核心类中包括

//数据库类、输入输出类、系统配置类等

//

// @param: $CategoryID当前分类ID。

//当想调用 PrintCurrentLevel、GetRootID、GetParentID、GenerateTypeTreeList及

//调用_CurrentItem成员的方法时请先设置此值.

//

//调用GenerateTypeTreeList时设置此值,则没有ID为此的分类默认被选择,没设置则无默认

//

// return value:none

//

//---------------------------------------------------------------------------

function &Category_Logic(&$Kernel, $CategoryID = -1)

{

$this->KernelRef = &$Kernel;



$this->tblObj = new Table($Kernel->DBObj, DBTABLE_CATEGORY);



if($CategoryID != -1)

{

$this->SetCategoryID($CategoryID);

}

}



//---------------------------------------------------------------------------

//publicvoid SetCategoryID(int $CategoryID)

//设置当前分类ID

//

// return value: none

//

//---------------------------------------------------------------------------

function SetCategoryID($CategoryID)

{

if(!$CategoryID) return;



$Item = new TItem($this->KernelRef->DBObj, DBTABLE_CATEGORY, '*', $CategoryID ,'ID');



$this->_SelfData = &$Item;



$this->CategoryID = $CategoryID;

}



//---------------------------------------------------------------------------

//publicint GetRootID()

//返回当前分类的根分类ID

//注意:只有设置的当前分类时此函数才有效

//

// return value:返回当前分类的根分类ID

//

//---------------------------------------------------------------------------

function GetRootID()

{

return $this->_SelfData->Get('RootID');

}



//---------------------------------------------------------------------------

//publicint GetParentID()

//返回当前分类的父分类ID

//注意:只有设置的当前分类时此函数才有效

//

// return value:返回当前分类的父分类ID

//

//---------------------------------------------------------------------------

function GetParentID()

{

if($this->CategoryID) return $this->_SelfData->Get('ParentID');

}





//---------------------------------------------------------------------------

//publicString GenerateTypeTreeList(array $Data, String $ProcessFunc, int $floor = 0)

//返回整个分类的树状结构放在OptionList中的列表

//

// @param: $Data此参数由 $this->DumpTypeDataToTree() 返回

//

// @param: $ProcessFunc处理显示分类信息的回调函数, 函数原型请参照: $this->PrintCurrentLevel()

//

// @param: $floor本参数不能人为给出,是程序自动计算的中间值

//

// return value:

//结构为一颗兄弟双亲表示法表示的树

//设如分类数据如下:

//├──1级分类

//│

//│

//│

//├─2级分类

//│ │

//│ └─3级分类

//│

//└─2级分类

//

//则返回值为 Array(

//0=> Array(

//'ID'=>'',

//'ParentID'=>'',

//'RootID'=>'',

//'CategoryName'=>'',

//'Child'=>....

//)

//.....

//)

//

//---------------------------------------------------------------------------

function DumpTypeDataToTree($RootID = 0, $Fields = '*')

{

$this->tblObj->SetFields($Fields);

$this->tblObj->SetCondition('');



$List = $this->tblObj->MapResult($this->tblObj->Select());



return $this->GetNodeData($List, $RootID);

}



//---------------------------------------------------------------------------

//publicString GenerateTypeTreeList(array $Data, String $ProcessFunc = '', int $floor = 0)

//返回整个分类的树状结构放在OptionList中的列表

//

// @param: $Data此参数由 $this->DumpTypeDataToTree() 返回

//

// @param: $ProcessFunc处理显示分类信息的回调函数, 函数原型请参照: $this->PrintCurrentLevel()

//

// @param: $floor本参数不能人为给出,是程序自动计算的中间值

//

// return value:返回一个<option>分类名称1</option> ... <option>分类名称n</option>

//

// ps: 调用时echo "<select name='xxxx'>" . $_c->GenerateTypeTreeList($Data, 'ProcessFunc') . "</select>";

//

//---------------------------------------------------------------------------

function GenerateTypeTreeList($Data, $ProcessFunc, $floor = 0)

{

$Str = '';

for($i = 0, $cnt = Count($Data); $i < $cnt; $i++)

{

if($this->CategoryID == $Data[$i]['ID'])

{

$Str .= "<option value='{$Data[$i]['ID']}' selected>"

. str_repeat("&nbsp;", $floor * 3)

. '├'

. ($ProcessFunc ? $ProcessFunc($Data[$i]) : $Data[$i]['CategoryName'])

. "</option>/n";

}

else

{

$Str .= "<option value='{$Data[$i]['ID']}'>"

. str_repeat("&nbsp;", $floor * 3)

. '├'

. ($ProcessFunc ? $ProcessFunc($Data[$i]) : $Data[$i]['CategoryName'])

. "</option>/n";

}



if($Data[$i]['Child']) $Str .= $this->GenerateTypeTreeList($Data[$i]['Child'], $ProcessFunc, $floor + 1);

}



return $Str;

}



//---------------------------------------------------------------------------

//publicString GenerateTypeTreeView(array $Data, String $ProcessFunc = '')

//返回整个分类的树状结构视图

//

// @param: $Data此参数由 $this->DumpTypeDataToTree() 返回

//

// @param: $ProcessFunc处理显示分类信息的回调函数, 函数原型请参照: $this->PrintCurrentLevel()

//

// return value:返回生成的一颗HTML形式显示的树

//

//---------------------------------------------------------------------------

function GenerateTypeTreeView($Data, $ProcessFunc)

{

$Str = '<ul style="Line-Height:200%">';



for($i = 0, $cnt = Count($Data); $i < $cnt; $i++)

{

if($ProcessFunc) $Str .= '<li>' . $ProcessFunc($Data[$i]) . '</li>' . "/n";

else $Str .= '<li>' . $Data[$i]['CategoryName'] . '</li>' . "/n";



if($Data[$i]['Child']) $Str .= '<li>' . $this->GenerateTypeTreeView($Data[$i]['Child'], $ProcessFunc) . '</li>';

}



$Str .= '</ul>';



return $Str;

}



//---------------------------------------------------------------------------

//publicString PrintCurrentLevel(String $ProcessFunc = '')

//对多级分类生成当前位置字符串

//设如分类数据如下,当前分类为3级分类, 则调用返回1级分类 -> 2级分类 -> 3级分类

//├──1级分类

//│

//│

//│

//├─2级分类

//│ │

//│ └─3级分类

//│

//└─2级分类

//

//

//

//

// @param: $ProcessFunc此为对分类数据如何显示的回调函数,不设置则直接显示分类名称

//函数定义原型为function (&$arr);

//其中$arr参数为每一个分类信息的一维数组如下:

//array(ID => 1, ParentID => 0, RootID => 0, CategoryName => '1级分类')

//返回值为对上述数据处理的结果,比如返回带链接的分类名字、更改显示颜色等

//

// return value: 返回当前分类在整个分类树中所处位置

//

//---------------------------------------------------------------------------

function PrintCurrentLevel($ProcessFunc = '')

{

if(!$this->CategoryID) return '';



if($this->_SelfData->Get("RootID") == 0)

{

if($ProcessFunc) return $ProcessFunc($this->_SelfData->fetchDataToArray());

else return $this->_SelfData->Get("CategoryName");

}



$Current = $this->CategoryID;



$this->tblObj->SetCondition('RootID = ' . $this->_SelfData->Get('RootID') . " or ID = " . $this->_SelfData->Get('RootID'));



$Data = $this->tblObj->MapResult($this->tblObj->Select());



return $this->_CurrentLevel($Data, $Current, $ProcessFunc);

}



//---------------------------------------------------------------------------

//publicboolean Add(array $arr)

//添加新分类到分类表中

//

// @param: $arr在此数组中包括对新添加分类的定义, 定义如下:

//

//$arr['RootID']新分类所属的根分类ID

//$arr['ParentID']新分类的父分类ID

//$arr['CategoryName']新分类的名称

//

// return value:返回添加分类操作结果

//

//---------------------------------------------------------------------------

function Add($arr)

{

$this->tblObj->SetFields(

Array(

'RootID',

'ParentID',

'CategoryName',

)

);



return $this->tblObj->Insert(

Array(

$arr['RootID'],

$arr['ParentID'],

$arr['CategoryName'],

)

);

}



//---------------------------------------------------------------------------

//publicboolean Delete(int $ID)

//删除已经存在的分类

//

// @param: $ID要删除的分类ID

//

// return value:返回删除分类操作结果

//

//---------------------------------------------------------------------------

function Delete($ID)

{

$sysOption = &$this->KernelRef->Config;



$this->tblObj->SetFields('*');

$this->tblObj->SetCondition('ID = ' . (int)$ID);



return $this->tblObj->Delete();

}



//---------------------------------------------------------------------------

//publicboolean Modify(int $ID, array $arr)

//修改已经存在的分类

//

// @param: $ID要修改的分类ID

// @param: $arr在此数组中包括修改后的分类定义, 定义如下:

//

//$arr['RootID']新分类所属的根分类ID

//$arr['ParentID']新分类的父分类ID

//$arr['CategoryName']新分类的名称

//

// return value:返回修改分类操作结果

//

//---------------------------------------------------------------------------

function Modify($ID, $arr)

{

$this->tblObj->SetCondition('ID = ' . (int)$ID);



$prev = $this->tblObj->MapOneRow($this->tblObj->Select());



$this->tblObj->SetFields(

Array(

'RootID',

'ParentID',

'CategoryName',

)

);



return $this->tblObj->Update($arr);

}



//---------------------------------------------------------------------------

//publicarray Modify(int $ID)

//修改已经存在的分类

//

// @param: $ID指定的分类ID

//

// return value: 返回指定ID分类的信息

//数组中包括:

//Array(

//'ID'=> 分类ID,

//'ParentID'=> 父分类ID,

//'RootID'=> 根分类ID,

//'CategoryName'=> 分类名称,

//);

//

//---------------------------------------------------------------------------

function GetCategory($ID)

{

$this->tblObj->SetCondition('ID = ' . (int)$ID);



return $this->tblObj->MapOneRow($this->tblObj->Select());

}

}

?>
效果如下:



分享到:
评论

相关推荐

    mysql 无限级分类实现思路

    第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类。这种算法的数据库结构设计最为简单。category表中一个字段id,一个字段fid(父id)。这样可以根据WHERE id =...

    快速无限分类PHP

    快递处理无限分类,可按指定父ID获取所有子类,且可以获取指定层数的子类

    php无限分类方法类.zip

    一个php无限分类的例子,包含了创建数据库及表 本分类方法的优势: 1,数据库结构简单,只有 cid parentid name 三个字段,无任何冗余字段 2,不使用递归查询,所有操作只需一条sql语句 3,...

    php分页类,加密类,数据库操作类,文件操作类,无限分级类

    php分页类,加密类,数据库操作类,文件操作类,无限分级类,验证类,字符串处理类

    php编写的无限级分类

    用mysql,PHP,编写的页面无限级分类处理, 在MySQL讲一个名为MySQL52的数据库侯将class数据文件、导入

    网软志成分类信息网站系统.net官方商业版

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    php无限分类方法类,包含了创建数据库及表

    一个php无限分类的例子,包含了创建数据库及表 本分类方法的优势: 1,数据库结构简单,只有 cid parentid name 三个字段,无任何冗余字段 2,不使用递归查询,所有操作只需一条sql语句 3,所有数据在读取一次...

    预排序遍历树算法的无限级分类-存储过程实现

    我这里已经把分类的移动和排序都重新处理了,实现了MPTT分类的排序和移动 为了保证分类左右节点的连续性,这个存储过程有检测节点连续性和完整性的处理。 理论上不会因为在添加、修改、删除、移动或者排序的操作中...

    仿赶集网站模板.net分类信息管理系统下载

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    生活分类信息发布网站的优秀网站管理系统正式版

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    分类信息系统正式版下载

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    无限分级下拉列表(无刷新)

    无限分级下拉列表(无刷新),ajax部分用的是jquery的,但是语法还是javascript,服务器处理数据用的是webservice,为了使大家更容易理解,就没有进行数据操作的封装。

    php 进阶:实现无限分类第1/4页

    1.分析 我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类: 第一分类(父分类)–&gt;第二分类(子分类)–&gt;第三分类(孙分类) 这种亲缘分类越多,...

    JSP无限级分类目录树-sorttree.zip

    该导航树的最大特点是可以无限级别地展开和收起,这样用户就可以根据自己的需要和兴趣,自由浏览和访问网站上的各种信息和资源。 JSP无限级分类目录树的实现需要掌握一些基本的编程技术和知识,比如HTML、CSS、...

    PHP数组无限分级数据的层级化处理代码

    在很多朋友写无限级分类数据时都直接使用递归来操作,下面我来介绍一下关于PHP无限分级代码优化方法,有需要的朋友可参考一下

    实现PHP+Mysql无限分类的方法汇总

    无限分类是个老话题了,来看看PHP结合Mysql如何实现。 第一种方法 这种方法是很常见、很传统的一种,先看表结构 表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0 顶级分类的 pid 默认...

    帖几个PHP的无限分类实现想法~

    1、做网站的一般都会遇到处理分类的问题, 偶来帖几个处理无限分类的例子数据库的结构很简单: id, fatcher_id, name, …… 这样的设计短小精悍,完全满足3NF..可以完全绝大多数要求,OK,让偶们看看这种数据库结构...

    分类信息网站建站系统正式版

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    仿百姓网模板分类信息系统下载

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

    YiTie V1.2分类信息管理系统商业正式版

    完善的多重无限分类,分站、分类栏目均可生成html页面、可选用的所见即所得编辑器、自定义信息发布字段、分站完全独立、后台管理权限控制。 操作系统 Windows Server 2003(推荐)、Windows 2000、Windows XP 数据库 ...

Global site tag (gtag.js) - Google Analytics