php递归实现树状分类结构

如果设计一个递归的树状结构只需简单的分类数据库结构就可以了



实际树状结构在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">
	版权所有 &copy; 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>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值