最近问无限分类的类树问题比较多,所以一高兴自己写了一个,我刚写完的,大家用用看,看看怎么实现起来更快,更简单,把你的树也贴出来(要只查询一次数据库的)
这是一棵分类列表的类树, 支持无限分类
一个分类下面可以同时有"包含子类的分类"和"最终分类";
唯一的优点是*****只需要进行一次的数据库*****查询.
样子不是很好看,不过可以自定义修改,可以自己定义css加里面
缓存方面还没有作,可以自己补上
下面例子的目录结构是这样的。
¦--Catagory.php
¦--images----tree.jsp
¦--images----treeopen.gif
¦--images----treeclose.gif
¦--images----line.gif
/****************tree.jsp********************/
function expand(id){
node = document.all('node'+id);
if(node.style.display==''){
node.style.display = 'none';
document.images('img'+id).src = imgopen;
}else{
node.style.display = '';
document.images('img'+id).src = imgclose;
}
}
/****************Catagory.php********************/
<?php
define('CATAGORY_TREE_EXPEND_NONE',0);
define('CATAGORY_TREE_EXPEND_ALL',1);
class Catagory{
//基础分类数据
var $treeData = array();
//分类的等级结构数组,以分类的id值作为数组的关键字
var $treePList = array();
//自分类对应上级类的关系
var $treeCList = array();
/*
* 这个是大分类的模板
*
* __id__ 分类的编号
* __name__ 分类的名称
* __image__ 分类前面显示的图像名称 $imgOpen or $imgClose
* __open__ 分类当前是否是展开的
* __inner__ 子分类显示的位置
* 样式可以根据自己的需要任意修改 ,但是不能删除现有的元素
*/
var $blockTpl = '
__inner__ |
';
/*
* 这个是小分类的模板
*
* see $blockTpl
*/
var $elementTpl = '
__name__
';
/*
* 这个是当前位置显示模板
*
* see $blockTpl
*/
var $currentTpl = '__name__';
var $js = "images/tree.js";
var $imgOpen = 'images/treeopen.gif';
var $imgClose = 'images/treeclose.gif';
var $imgLine = 'images/line.gif';
var $cachFile = '';
var $expand = 0;
var $result = array();
var $treeStr = '';
var $currentStr = '';
/*
* 用来初始化,传入分类数据
*
*param $data array()
*/
function Catagory(&$data){
$this->_init($data);
}
function _init($tmpData){
$plevel = $clevel = $treeData = array();
foreach($tmpData as $value){
$treeData[$value['id']] = $value;
$plevel[$value['pid']][$value['id']] = 'END';
$clevel[$value['id']] = $value['pid'];
}
$this->treeData = &$treeData;
$this->treePList = &$plevel;
$this->treeCList = &$clevel;
}
/*
* 解析分类列表
*
*param $cataId int 要解析的主分类的编号
*/
function parseNode($cataId=0){
$this->result = $this->treePList[$cataId];
if($this->result==null) die("Catagory id error");
$this->treeStr = $this->_doNode($this->result);
$this->treeStr .= $this->_jsParse();
}
function &_doNode(&$result){
$nstr = $estr = '';
foreach($result as $key=>$value){
if(isset($this->treePList[$key])){
$result[$key] = $this->treePList[$key];
$inner = $this->_doNode($result[$key]);
$nstr .= $this->_parseNodeTpl($key, $inner);
}else{
$estr .= $this->_parseElementTpl($key);
}
}
return $nstr.$estr;
}
function &_parseNodeTpl($cataId, $inner){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->blockTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
$str = preg_replace(' ¦__image__ ¦', ($this->expand? $this->imgClose:$this->imgOpen), $str);
$str = preg_replace(' ¦__open__ ¦', ($this->expand?'':'none'), $str);
$str = preg_replace(' ¦__inner__ ¦', $inner, $str);
return $str;
}
function _parseElementTpl($cataId){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->elementTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
$str = preg_replace(' ¦__image__ ¦', $this->imgLine, $str);
return $str;
}
function _jsParse(){
$str = "";
return $str;
}
/*
* 展开分类$cataId
*
*param $cataId int 要展开的分类的编号
*/
function parseCurrent($cataId){
$str = '';
$str .= $this->_parseCurrentTpl($cataId);
while(isset($this->treeCList[$cataId]) && $this->treeCList[$cataId]!=0){
$cataId = $this->treeCList[$cataId];
$str = $this->_parseCurrentTpl($cataId).'->'.$str;
}
$this->currentStr = &$str;
}
function _parseCurrentTpl($cataId){
$data = $this->treeData[$cataId];
$str = preg_replace(' ¦__id__ ¦', $data['id'], $this->currentTpl);
$str = preg_replace(' ¦__name__ ¦', $data['name'], $str);
return $str;
}
/*
* 解析当前分类的路径
*
*param $cataId int 要解析的主分类的编号
*/
function expand($cataId){
if($this->expand>0) return ;
$str = '';
if(isset($this->treePList[$cataId])) $str .= "expand($cataId);";
while(isset($this->treeCList[$cataId]) && $this->treeCList[$cataId]!=0){
$str .= "expand(".$this->treeCList[$cataId].");";
$cataId = $this->treeCList[$cataId];
}
$this->treeStr .= "$str
相关视频
相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3
最新文章
微信3.6.0测试版更新了微信支付漏洞会造成哪
360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗
人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本
查看所有0条评论>>