[導(dǎo)入]一個(gè)無(wú)限分類處理類
系統(tǒng)
2082 0
PHP代碼
:--------------------------------------------------------------------------------
?
<?
php?
/*
?名稱:?對(duì)分類操作的業(yè)務(wù)邏輯封裝?
*?說(shuō)明:?本類中引用的其它類(DB、Table、Item)均未提供,所以本類只能做個(gè)參考,不能直接應(yīng)用?
*?不是本人小氣不提供其它類,實(shí)在是因?yàn)槟切┒际且粌赡昵皩懙念?,很爛。怕大家看后對(duì)大?
*?造成誤導(dǎo).?在此發(fā)表這個(gè)類,只希望大家能從中學(xué)到一些程序設(shè)計(jì)的方法。?
*?特點(diǎn):?
*?采用遞歸調(diào)用的方法,對(duì)分類數(shù)據(jù)只需一次數(shù)據(jù)庫(kù)查詢可生成樹(shù)狀結(jié)構(gòu)。?無(wú)限遞歸層次(視機(jī)器堆棧而定)?
*?
*?數(shù)據(jù)庫(kù)定義:?
*?ID?smallint?unsigned?primary?#如果數(shù)據(jù)量很大可用int?
*?ParentID?smallint?unsigned?index?#如果數(shù)據(jù)量很大可用int,?請(qǐng)索引此字段?
*?#如果為根分類,則ParentID?=?0?
*?
*?RootID?smallint?unsigned?index?#如果數(shù)據(jù)量很大可用int,?請(qǐng)索引此字段?
*?#如果是根分類則RootID?=?0,?否則RootID?=?最上層的父分類ID?
*?CategoryName?varchar(n)?#此大小自定?
*?如需有其它字段定義附在后面?
*?注意事項(xiàng):?
*?不要試圖直接調(diào)用本類,除非你有和我定義那另外那幾個(gè)類相對(duì)應(yīng)的接口,?否則不會(huì)成功?
*?在合適的地方定義?DBTABLE_CATEGORY?這個(gè)常量?190-711?190-721??,使其指向你的分類數(shù)據(jù)表名字?
*?
*?程序構(gòu)架:?
*?├─基礎(chǔ)類?<!--?完成底層數(shù)據(jù)庫(kù)操作、數(shù)據(jù)抽象、語(yǔ)言、模板、異常、雜項(xiàng)等)操作?-->?
*?│?
*?│?
*?└─業(yè)務(wù)邏輯層(此類所處層次)?<!--?利用基礎(chǔ)類中數(shù)據(jù)操作、數(shù)據(jù)抽象等類根據(jù)表現(xiàn)層傳遞的參數(shù)完成數(shù)據(jù)處理,并返回?cái)?shù)據(jù)或操作結(jié)果?-->?
*?│?
*?│?
*?└───表現(xiàn)層(用戶界面)?<!--?利用業(yè)務(wù)邏輯層將取得的數(shù)據(jù)或操作數(shù)據(jù)的結(jié)果通過(guò)基礎(chǔ)類中的界面等類進(jìn)行顯示?-->?
*/
?
define
(
'
DBTABLE_CATEGORY
'
,
?
'
xxx
'
);?
class
?Category_Logic?
{?
var
?
$KernelRef
?
=
?
NULL
;?
//
系統(tǒng)核心的引用?
var
?
$tblObj
?
=
?
NULL
;?
//
包含當(dāng)前分類數(shù)據(jù)?Table?類的實(shí)例?
var
?
$_CurrentItem
?
=
?
NULL
;?
//
包含當(dāng)前分類數(shù)據(jù)?TItem類的實(shí)例?
var
?
$CategoryID
?
=
?
0
;?
//
當(dāng)前分類ID,如果沒(méi)有當(dāng)前分類此項(xiàng)為?0?
//---------------------------------------------------------------------------?
//private?array?GetNodeData(array?$Data,?int?$ParentNode)?
//?根據(jù)一顆指定根的并且以兄弟雙親法表示的樹(shù)和當(dāng)前分類的ID,返回當(dāng)前分類在整個(gè)分類表中所處的位置?
//?
//?@param:?$Data?2維數(shù)組?Array(?
//?Array(?
//?'ID'?=>?分類ID,?
//?'ParentID'?=>?父分類ID,?
//?'RootID'?=>?根分類ID,?
//?'CategoryName'?=>?分類名稱,?
//?),?
//?……?
//?);?
//?表示的一顆樹(shù)?
//?
//?@param:?$ParentNode?父分類ID,?每一次由調(diào)用者給出,遞歸時(shí)由程序計(jì)算傳遞?
//?
//?return?value:?返回以兄弟雙親法表示的所有分類的樹(shù)?
//?注意:?確保當(dāng)前分類已經(jīng)設(shè)置,否則此函數(shù)無(wú)返回?
//?
//---------------------------------------------------------------------------?
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?=?'')?
//?根據(jù)一顆指定根的并且以兄弟雙親法表示的樹(shù)和當(dāng)前分類的ID,返回當(dāng)前分類在整個(gè)分類表中所處的位置?
//?
//?@param:?$Data?兄弟雙親法表示的樹(shù),?由調(diào)用者傳遞?
//?
//?@param:?$Current?當(dāng)前分類ID,第一次調(diào)用時(shí)由調(diào)用者給出,遞歸時(shí)由程序自行計(jì)算?
//?
//?@param:?$ProcessFunc?指定對(duì)分類數(shù)據(jù)的處理函數(shù),?函數(shù)原型定義見(jiàn)?$this->PrintCurrentLevel?中的注釋?
//?
//?return?value:?返回當(dāng)前分類在分類樹(shù)中的位置?
//?注意:?確保當(dāng)前分類已經(jīng)設(shè)置,否則此函數(shù)無(wú)返回?
//?
//---------------------------------------------------------------------------?
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)?
//?本類構(gòu)造函數(shù)?
//?
//?@param:?$Kernel?此參數(shù)為當(dāng)前系統(tǒng)核心類的一個(gè)引用,?核心類中包括?
//?數(shù)據(jù)庫(kù)類、輸入輸出類、系統(tǒng)配置類等?
//?
//?@param:?$CategoryID?當(dāng)前分類ID。?
//?當(dāng)想調(diào)用?PrintCurrentLevel、GetRootID、GetParentID、GenerateTypeTreeList及?
//?調(diào)用_CurrentItem成員的方法時(shí)請(qǐng)先設(shè)置此值.?
//?
//?調(diào)用GenerateTypeTreeList時(shí)設(shè)置此值,則沒(méi)有ID為此的分類默認(rèn)被選擇,沒(méi)設(shè)置則無(wú)默認(rèn)?
//?
//?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)?
//?設(shè)置當(dāng)前分類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()?
//?返回當(dāng)前分類的根分類ID?
//?注意:只有設(shè)置的當(dāng)前分類時(shí)此函數(shù)才有效?
//?
//?return?value:?返回當(dāng)前分類的根分類ID?
//?
//---------------------------------------------------------------------------?
function
?GetRootID()?
{?
return
?
$this
->
_SelfData
->
Get(
'
RootID
'
);?
}?
//
---------------------------------------------------------------------------?
//public?int?GetParentID()?
//?返回當(dāng)前分類的父分類ID?
//?注意:只有設(shè)置的當(dāng)前分類時(shí)此函數(shù)才有效?
//?
//?return?value:?返回當(dāng)前分類的父分類ID?
//?
//---------------------------------------------------------------------------?
function
?GetParentID()?
{?
if
(
$this
->
CategoryID)?
return
?
$this
->
_SelfData
->
Get(
'
ParentID
'
);?
}?
//
---------------------------------------------------------------------------?
//public?String?GenerateTypeTreeList(array?$Data,?String?$ProcessFunc,?int?$floor?=?0)?
//?返回整個(gè)分類的樹(shù)狀結(jié)構(gòu)放在OptionList中的列表?
//?
//?@param:?$Data?此參數(shù)由?$this->DumpTypeDataToTree()?返回?
//?
//?@param:?$ProcessFunc?處理顯示分類信息的回調(diào)函數(shù),?函數(shù)原型請(qǐng)參照:?$this->PrintCurrentLevel()?
//?
//?@param:?$floor?本參數(shù)不能人為給出,是程序自動(dòng)計(jì)算的中間值?
//?
//?return?value:?
//?結(jié)構(gòu)為一顆兄弟雙親表示法表示的樹(shù)?
//?設(shè)如分類數(shù)據(jù)如下:?
//?├──1級(jí)分類?
//?│?
//?│?
//?│?
//?├─2級(jí)分類?
//?│?│?
//?│?└─3級(jí)分類?
//?│?
//?└─2級(jí)分類?
//?
//?則返回值為?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)?
//?返回整個(gè)分類的樹(shù)狀結(jié)構(gòu)放在OptionList中的列表?
//?
//?@param:?$Data?此參數(shù)由?$this->DumpTypeDataToTree()?返回?
//?
//?@param:?$ProcessFunc?處理顯示分類信息的回調(diào)函數(shù),?函數(shù)原型請(qǐng)參照:?$this->PrintCurrentLevel()?
//?
//?@param:?$floor?本參數(shù)不能人為給出,是程序自動(dòng)計(jì)算的中間值?
//?
//?return?value:?返回一個(gè)<option>分類名稱1</option>?
?<option>分類名稱n</option>?
//?
//?ps:?調(diào)用時(shí)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?=?'')?
//?返回整個(gè)分類的樹(shù)狀結(jié)構(gòu)視圖?
//?
//?@param:?$Data?此參數(shù)由?$this->DumpTypeDataToTree()?返回?
//?
//?@param:?$ProcessFunc?處理顯示分類信息的回調(diào)函數(shù),?函數(shù)原型請(qǐng)參照:?$this->PrintCurrentLevel()?
//?
//?return?value:?返回生成的一顆HTML形式顯示的樹(shù)?
//?
//---------------------------------------------------------------------------?
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?=?'')?
//?對(duì)多級(jí)分類生成當(dāng)前位置字符串?
//?設(shè)如分類數(shù)據(jù)如下,當(dāng)前分類為3級(jí)分類,?則調(diào)用返回?1級(jí)分類?->?2級(jí)分類?->?3級(jí)分類?
//?├──1級(jí)分類?
//?│?
//?│?
//?│?
//?├─2級(jí)分類?
//?│?│?
//?│?└─3級(jí)分類?
//?│?
//?└─2級(jí)分類?
//?
//?
//?
//?
//?@param:?$ProcessFunc?此為對(duì)分類數(shù)據(jù)如何顯示的回調(diào)函數(shù),不設(shè)置則直接顯示分類名稱?
//?函數(shù)定義原型為?function?(&$arr);?
//?其中$arr參數(shù)為每一個(gè)分類信息的一維數(shù)組如下:?
//?array(ID?=>?1,?ParentID?=>?0,?RootID?=>?0,?CategoryName?=>?'1級(jí)分類')?
//?返回值為對(duì)上述數(shù)據(jù)處理的結(jié)果,比如返回帶鏈接的分類名字、更改顯示顏色等?
//?
//?return?value:?返回當(dāng)前分類在整個(gè)分類樹(shù)中所處位置?
//?
//---------------------------------------------------------------------------?
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?在此數(shù)組中包括對(duì)新添加分類的定義,?定義如下:?
//?
//?$arr['RootID']?新分類所屬的根分類ID?
//?$arr['ParentID']?新分類的父分類ID?
//?$arr['CategoryName']?新分類的名稱?
//?
//?return?value:?返回添加分類操作結(jié)果?
//?
//---------------------------------------------------------------------------?
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)?
//?刪除已經(jīng)存在的分類?
//?
//?@param:?$ID?要?jiǎng)h除的分類ID?
//?
//?return?value:?返回刪除分類操作結(jié)果?
//?
//---------------------------------------------------------------------------?
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)?
//?修改已經(jīng)存在的分類?
//?
//?@param:?$ID?要修改的分類ID?
//?@param:?$arr?在此數(shù)組中包括修改后的分類定義,?定義如下:?
//?
//?$arr['RootID']?新分類所屬的根分類ID?
//?$arr['ParentID']?新分類的父分類ID?
//?$arr['CategoryName']?新分類的名稱?
//?
//?return?value:?返回修改分類操作結(jié)果?
//?
//---------------------------------------------------------------------------?
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)?
//?修改已經(jīng)存在的分類?
//?
//?@param:?$ID?指定的分類ID?
//?
//?return?value:?返回指定ID分類的信息?
//?數(shù)組中包括:?
//?Array(?
//?'ID'?=>?分類ID,?
//?'ParentID'?=>?父分類ID,?
//?'RootID'?=>?根分類ID,?
//?'CategoryName'?=>?分類名稱,?
//?);?
//?
//---------------------------------------------------------------------------?
function
?GetCategory(
$ID
)?
{?
$this
->
tblObj
->
SetCondition(
'
ID?=?
'
?
.
?(int)
$ID
);?
return
?
$this
->
tblObj
->
MapOneRow(
$this
->
tblObj
->
Select());?
}?
}?
?>
?
文章來(lái)源:
http://www.phpweblog.net/susam119/archive/2007/12/19/2573.html
[導(dǎo)入]一個(gè)無(wú)限分類處理類
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元