[導入]一個無限分類處理類
系統
2147 0
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());?
}?
}?
?>
?
文章來源:
http://www.phpweblog.net/susam119/archive/2007/12/19/2573.html
[導入]一個無限分類處理類
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元