如果设计一个递归的树状结构只需简单的分类数据库结构就可以了
实际树状结构在Model层和view层实现相应的业务逻辑就可以了
Model层代码(tree函数主要实现了递归思想):
<?php
class CategoryModel extends Model{
//查询所有分类的信息
public function getCats(){
$sql = "select * from {$this->table}";
$cats = $this->db->getAll($sql);
return $this->tree($cats);
}
//定义一个方法,用于形成树状结构
/**
* @param $arr array 给定数组
* @param $pid int 指定从哪个节点开始找
* @return array 构造好的数组
*/
public function tree($arr, $pid = 0, $level = 0){
static $tree = array();
foreach($arr as $v){
if($v['parent_id'] == $pid){
$v['level'] = $level;
$tree[] = $v;
$this->tree($arr, $v['cat_id'], $level + 1);
}
}
return $tree;
}
}
controller实现业务跳转:
class CategoryController extends Controller{
//显示商品分类
public function indexAction(){
$categoryModel = new CategoryModel("category");
$cats = $categoryModel->getCats();
//载入显示页面
include CUR_VIEW_PATH . "cat_list.html";
}
view层显示逻辑:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SHOP 管理中心 - 商品分类 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="application/views/admin/styles/general.css" rel="stylesheet" type="text/css" />
<link href="application/views/admin/styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>
<span class="action-span"><a href="index.php?p=admin&c=category&a=add">添加分类</a></span>
<span class="action-span1"><a href="index.php?p=admin&c=index&a=index">SHOP 管理中心</a> </span><span id="search_id" class="action-span1"> - 商品分类 </span>
<div style="clear:both"></div>
</h1>
<form method="post" action="" name="listForm">
<!-- start ad position list -->
<div class="list-div" id="listDiv">
<table width="100%" cellspacing="1" cellpadding="2" id="list-table">
<tbody>
<tr>
<th>分类名称</th>
<th>商品数量</th>
<th>数量单位</th>
<th>是否显示</th>
<th>排序</th>
<th>操作</th>
</tr>
<?php foreach($cats as $cat) : ?>
<tr align="center" class="0" id="<?php echo $cat['parent_id']; ?>_<?php echo $cat['cat_id']; ?>">
<td align="left" class="first-cell">
<?php echo str_repeat(" ", $cat['level']); ?>
<img src="application/views/admin/images/menu_minus.gif" id="icon_0_1" width="9" height="9" border="0" style="margin-left:0em" οnclick="rowClicked(this)">
<span><a href="goods.php?act=list&cat_id=1"><?php echo $cat['cat_name']; ?></a></span>
</td>
<td width="10%">0</td>
<td width="10%"><span οnclick="listTable.edit(this, 'edit_measure_unit', 1)" title="点击修改内容" style=""><?php echo $cat['unit']; ?></span></td>
<td width="10%"><?php echo $cat['is_show'] == 1 ? "√ " : "X"; ?></td>
<td width="10%" align="right"><span οnclick="listTable.edit(this, 'edit_sort_order', 1)" title="点击修改内容" style=""><?php echo $cat['sort_order']; ?></span></td>
<td width="24%" align="center">
<a href="category.php?act=move&cat_id=1">转移商品</a> |
<a href="index.php?p=admin&c=category&a=edit&cat_id=<?php echo $cat['cat_id']; ?>">编辑</a> |
<a href="index.php?p=admin&c=category&a=delete&cat_id=<?php echo $cat['cat_id']; ?>" οnclick="listTable.remove(1, '您确认要删除这条记录吗?')" title="移除">移除</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</form>
</table>
</div>
</form>
<div id="footer">
版权所有 © dancheng - </div>
</div>
<script>
/**
* 折叠分类列表
*/
var imgPlus = new Image();
imgPlus.src = "application/views/admin/images/menu_plus.gif";
function rowClicked(obj) {
// 当前图像
img = obj;
// 取得上二级tr>td>img对象
obj = obj.parentNode.parentNode;
// 整个分类列表表格
var tbl = document.getElementById("list-table");
// 当前分类级别
var lvl = parseInt(obj.className);
// 是否找到元素
var fnd = false;
var sub_display = img.src.indexOf('menu_minus.gif') > 0 ? 'none' : 'table-row' ;
// 遍历所有的分类
for (i = 0; i < tbl.rows.length; i++) {
var row = tbl.rows[i];
if (row == obj) {
// 找到当前行
fnd = true;
//document.getElementById('result').innerHTML += 'Find row at ' + i +"<br/>";
} else {
if (fnd == true {
var cur = parseInt(row.className);
var icon = 'icon_' + row.id;
if (cur > lvl) {
row.style.display = sub_display;
if (sub_display != 'none') {
var iconimg = document.getElementById(icon);
iconimg.src = iconimg.src.replace('plus.gif', 'minus.gif');
}
} else {
fnd = false;
break;
}
}
}
}
for (i = 0; i < obj.cells[0].childNodes.length; i++){
var imgObj = obj.cells[0].childNodes[i];
if (imgObj.tagName == "IMG" && imgObj.src != 'application/views/admin/images/menu_arrow.gif'){
imgObj.src = (imgObj.src == imgPlus.src) ? 'application/views/admin/images/menu_minus.gif' : imgPlus.src;
}
}
}
</script>
</body>
</html>