为了忘却的纪念 $bestmost->save("多多益善")
言己及众
PHP博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
69 随笔 :: 13 文章 :: 40 评论 :: 0 Trackbacks
<
2008年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(67)
ajax(2)
(rss)
fleaphp(9)
(rss)
html,web相关(12)
(rss)
js(31)
(rss)
mysql 及其他(1)
(rss)
php模块和类库(12)
(rss)
xajax
(rss)
随笔档案
(69)
2008年7月 (39)
2008年6月 (9)
2008年5月 (15)
2008年4月 (3)
2008年3月 (2)
2007年11月 (1)
文章分类
(13)
PHP(9)
(rss)
xajax(2)
(rss)
建站(1)
(rss)
手册(1)
(rss)
文章档案
(13)
2008年7月 (1)
2008年4月 (1)
2008年3月 (2)
2007年12月 (2)
2007年11月 (7)
收藏夹
(1)
php(1)
(rss)
all
pear安装 php(Appserv)
PEAR套件的管理(图)
Phpgrid php框架
php相关
PHP中相对路径问题
泉城酷仔的博客php
最新随笔
1. (转) JavaScript面向对象的支持
2. dom 复制节点 更改文本节点等
3. dom节点的小总结
4. MySQL索引分析和优化 (笔记)
5. fleaphp smarty 下 options 被选中表示
6. fleaphp 上传文件多文件多类型上传 生成jpg缩略图
7. iscn-判断是否有包括中文的字符串
8. json 可使php直接把数组赋给 js
9. 如何上传文件以及加入 fck 编辑器
10. jQuery对于单选表单(radio)以及其它表单取值
搜索
积分与排名
积分 - 13551
排名 - 9
最新随笔
1. (转) JavaScript面向对象的支持
2. dom 复制节点 更改文本节点等
3. dom节点的小总结
4. MySQL索引分析和优化 (笔记)
5. fleaphp smarty 下 options 被选中表示
6. fleaphp 上传文件多文件多类型上传 生成jpg缩略图
7. iscn-判断是否有包括中文的字符串
8. json 可使php直接把数组赋给 js
9. 如何上传文件以及加入 fck 编辑器
10. jQuery对于单选表单(radio)以及其它表单取值
最新评论
1. re: PHP中$_SERVER的详细用法[未登录]
哈哈,也就7、8个吧
--bestmost
2. re: html 的reset的含义
reset嘛,就是重置的意思
--绝想日记网
3. re: post提交时 一小的发现
只要有name的,不管是否为空,都会传递过去的
--绝想日记网
4. re: PHP中$_SERVER的详细用法
你常用的有多少呢?
--绝想日记网
5. re: 去除数组内值为空的数组项最简单方法
恩啊。简单的很
--绝想日记网
阅读排行榜
1. 一个无限分类的处理类(616)
2. PHP中$_SERVER的详细用法(546)
3. [TDG] 如何定义表关联?(451)
4. window.onload,body onload和document.onreadystatechange(419)
5. smarty的php预定义变量(409)
评论排行榜
1. Ajax 同一页面同时执行多个 XMLHTTP(4)
2. 一个无限分类的处理类(3)
3. webcontrol的简单示例(3)
4. php的数组直接赋给js数组会出现问题(3)
5. ajax返回javascript给页面执行(2)
60天内阅读排行
1. PHP中$_SERVER的详细用法(546)
2. [TDG] 如何定义表关联?(451)
3. smarty的php预定义变量(409)
4. 刚学的Flea的使用笔记.想一起学的来.绝对简单易懂.(405)
5. [Ext研究之一]Ext与JQuery的初步整合(400)
一个无限分类的处理类
PHP代码
:--------------------------------------------------------------------------------
<?
php
/*
名称: 对分类操作的业务逻辑封装
* 说明: 本类中引用的其它类(DB、Table、Item)均未提供,所以本类只能做个参考,不能直接应用
* 不是本人小气不提供其它类,实在是因为那些都是一两年前写的类,很烂。怕大家看后对大
* 造成误导. 在此发表这个类,只希望大家能从中学到一些程序设计的方法。
* 特点:
* 采用递归调用的方法,对分类数据只需一次数据库查询可生成树状结构。 无限递归层次(视机器堆栈而定)
*
* 数据库定义:
* ID smallint unsigned primary #如果数据量很大可用int
* ParentID smallint unsigned index #如果数据量很大可用int, 请索引此字段
* #如果为根分类,则ParentID = 0
*
* RootID smallint unsigned index #如果数据量很大可用int, 请索引此字段
* #如果是根分类则RootID = 0, 否则RootID = 最上层的父分类ID
* CategoryName varchar(n) #此大小自定
* 如需有其它字段定义附在后面
* 注意事项:
* 不要试图直接调用本类,除非你有和我定义那另外那几个类相对应的接口, 否则不会成功
* 在合适的地方定义 DBTABLE_CATEGORY 这个常量 190-711 190-721 ,使其指向你的分类数据表名字
*
* 程序构架:
* ├─基础类 <!-- 完成底层数据库操作、数据抽象、语言、模板、异常、杂项等)操作 -->
* │
* │
* └─业务逻辑层(此类所处层次) <!-- 利用基础类中数据操作、数据抽象等类根据表现层传递的参数完成数据处理,并返回数据或操作结果 -->
* │
* │
* └───表现层(用户界面) <!-- 利用业务逻辑层将取得的数据或操作数据的结果通过基础类中的界面等类进行显示 -->
*/
define
(
'
DBTABLE_CATEGORY
'
,
'
xxx
'
);
class
Category_Logic
{
var
$KernelRef
=
NULL
;
//
系统核心的引用
var
$tblObj
=
NULL
;
//
包含当前分类数据 Table 类的实例
var
$_CurrentItem
=
NULL
;
//
包含当前分类数据 TItem类的实例
var
$CategoryID
=
0
;
//
当前分类ID,如果没有当前分类此项为 0
//---------------------------------------------------------------------------
//private array GetNodeData(array $Data, int $ParentNode)
// 根据一颗指定根的并且以兄弟双亲法表示的树和当前分类的ID,返回当前分类在整个分类表中所处的位置
//
// @param: $Data 2维数组 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
;
}
//
---------------------------------------------------------------------------
//private String _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
)
.
'
->
'
;
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
;
}
//
---------------------------------------------------------------------------
//public Category_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
);
}
}
//
---------------------------------------------------------------------------
//public void 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
;
}
//
---------------------------------------------------------------------------
//public int GetRootID()
// 返回当前分类的根分类ID
// 注意:只有设置的当前分类时此函数才有效
//
// return value: 返回当前分类的根分类ID
//
//---------------------------------------------------------------------------
function
GetRootID()
{
return
$this
->
_SelfData
->
Get(
'
RootID
'
);
}
//
---------------------------------------------------------------------------
//public int GetParentID()
// 返回当前分类的父分类ID
// 注意:只有设置的当前分类时此函数才有效
//
// return value: 返回当前分类的父分类ID
//
//---------------------------------------------------------------------------
function
GetParentID()
{
if
(
$this
->
CategoryID)
return
$this
->
_SelfData
->
Get(
'
ParentID
'
);
}
//
---------------------------------------------------------------------------
//public String 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
);
}
//
---------------------------------------------------------------------------
//public String 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
(
"
"
,
$floor
*
3
)
.
'
├
'
.
(
$ProcessFunc
?
$ProcessFunc
(
$Data
[
$i
])
:
$Data
[
$i
][
'
CategoryName
'
])
.
"
</option>\n
"
;
}
else
{
$Str
.=
"
<option value='{$Data[$i]['ID']}'>
"
.
str_repeat
(
"
"
,
$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
;
}
//
---------------------------------------------------------------------------
//public String 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
;
}
//
---------------------------------------------------------------------------
//public String 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
);
}
//
---------------------------------------------------------------------------
//public boolean 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
'
]
,
)
);
}
//
---------------------------------------------------------------------------
//public boolean 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();
}
//
---------------------------------------------------------------------------
//public boolean 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
);
}
//
---------------------------------------------------------------------------
//public array 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());
}
}
?>
posted on 2008-03-22 15:53
bestmost
阅读(616)
评论(3)
编辑
收藏
引用
网摘
评论
#
re: 一个无限分类的处理类
2008-03-23 13:26
完美世界私服
http://www.wmsifu.cn
回复
更多评论
#
re: 一个无限分类的处理类
2008-03-25 08:41
完美世界私服
http://www.wmsifu.cn
回复
更多评论
#
re: 一个无限分类的处理类
2008-05-15 21:11
网上买书
很有实用价值的
回复
更多评论
刷新评论列表
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
Powered by:
PHP博客
Copyright © bestmost