作者: 帅的像人渣 加入时间: 2004-02-21 浏览次数: 134
<?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) . ' -> ';
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(" ", $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;
}
//---------------------------------------------------------------------------
//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());
}
}
?>
|
相关推荐
会话bean通常代表业务流程里面的操作,譬如“处理订单”。可根据对话状态的保持性,即有状态和无状态对会话bean进行分类。 无状态的会话 bean没有内部状态。它们不跟踪记录从一个方法调用传递到另一个方法调用的...
前后端分离:前端页面由JSP实现,后端业务逻辑由Servlet处理,JavaBean负责数据传输和业务逻辑封装。 功能设计: 商品管理:提供对商品的增删改查功能,包括商品名称、价格、描述等信息的管理。 购物车功能:用户...
利用MVC设计模式将业务逻辑和表示逻辑分离,在表示逻辑层利用JSP技术实现了页面制作、利用AJAX实现无刷新技术,在业务逻辑层,利用Struts、Spring技术实现了系统设置、资产管理以及分类统计三个主要模块的开发,...
存储过程是数据库开发人员为了使用某一特定的功能而编写的数据库过程,它具有良好的逻辑封装体。 使用存储过程的优点 易于维护。正确使用存储过程能够将数据库应用与应用程序的业务逻辑分开,当维护数据库相关功能时...
在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...
1.4_逻辑功能模块 1.5_SDH路径层次和开销应用 2.1_系统简介 2.2_机柜、子架、机盒 2.3_单板、常见的网元类型及其配置和设备功能特性 3.1_设备级保护 3.2_网络级保护 4.1_以太网分类 4.2_以太网基本原理 4.3_以太网...
1.4_逻辑功能模块 1.5_SDH路径层次和开销应用 第二章 MSTP系统概述 2.1_系统简介 2.2_机柜、子架、机盒 2.3_单板、常见的网元类型及其配置和设备功能特性 第三章 MSTP保护原理 3.1_设备级保护 3.2_网络...
5.6.6 实现业务逻辑 123 5.6.7 部署应用及测试体验 125 5.7 小结 126 第6章 高级接口的使用 127 6.1 语音识别 127 6.1.1 开启语音识别功能 128 6.1.2 如何获取语音消息 128 6.2 客服接口 129...
安全性要求比较高,对业务逻辑必须封装,避免有人登陆他没权限的网页,避免黑客从数据流中截取敏感数据。 § 2.6 其他需求 普通用户的需求:对于只有查看权限的用户,一般是通过上网浏览学校网页来查看数据的。 各...
由于存储过程将应用程序绑定到数据库,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。 (5)存储过程的应用场景 1.通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户...
把业务逻辑所有进⾏封装。通过WCF提供统⼀的接⼝供项⽬调⽤。 6. 针对缺陷6的"没有单元測试"。 做法是⽆论⽤MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元測试覆盖,同⼀时候对⼀些公⽤的组件也要有单独的...
做法是⽤WCF做为中间层,把业务逻辑全部进⾏封装,通过WCF提 供统⼀的接⼝供项⽬调⽤。 6. 针对缺陷6的"没有单元测试"。做法是不管⽤MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元测试 覆盖,同时对⼀些公...
系统采用界面与业务逻辑分离的三层结构设计,把业务逻辑封装,提高了系统的安全 性、可维护性、重用性和可扩展性。 关键词:网上拍卖, C#,Access 目录 引言 1 1 绪论 2 1.1 系统需求 2 1.1.1 销售展示模块 2 ...
13封装性 将对象的数据和操作组合在一起的封装体,称为封装性 14数据流程图: 是一种能全面地描述信息系统逻辑模型的主要工具,它可以用少数几种符号综合反映出 信息在系统中的流动、处理和存储情况 15数据库的概念...
系统采用界面与业务逻辑分离的三层结构设计,把业务逻辑封装,提高了系统的安全 性、可维护性、重用性和可扩展性。 关键词:网上拍卖, C#,Access 目录 引言 1 1 绪论 2 1.1 系统需求 2 1.1.1 销售展示模块 2 ...
二、系统性能分析 1)多层结构设计 严格意义上的三层结构设计,其程序逻辑结构分为用户界面层、业务逻辑处理层和数据 存储层。本系统采用的上有三层结构进一步扩展而成的多层结构。 2)面向对象设计 在系统中将商品...
虚拟化是指从逻辑角度对资源进行配置,是物理实际的逻辑抽象。通常所说的虚拟化是指服务器虚拟化技术,除此之外,还有网络虚拟化和存储虚拟化技术。随着云计算和虚拟化技术的发展,虚拟化成为校园信息化建设或改造...
API负责满足表决程序集的请求,生成和使用。 项目结构 ... 实用程序:API使用的实用程序类,用于在模型对象和DTO之间进行转换并封装对API引发的可能异常的处理; 验证:具有关于在申请书中接收到的
对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。 对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序...