一棵php的类树(支持无限分类)


Posted in PHP onOctober 09, 2006

最近问无限分类的类树问题比较多,所以一高兴自己写了一个,我刚写完的,大家用用看,看看怎么实现起来更快,更简单,把你的树也贴出来(要只查询一次数据库的)<br> 

这是一棵分类列表的类树,  支持无限分类<br> 
一个分类下面可以同时有"包含子类的分类"和"最终分类";<br> 

唯一的优点是*****只需要进行一次的数据库*****查询.<br> 

样子不是很好看,不过可以自定义修改,可以自己定义css加里面<br> 

缓存方面还没有作,可以自己补上 

下面例子的目录结构是这样的。 
¦--Catagory.php                                        <br> 
¦--images----tree.jsp                            <br> 
¦--images----treeopen.gif                    <br> 
¦--images----treeclose.gif                  <br> 
¦--images----line.gif                            <br> 

/****************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  =  ' 
   <table  border="0"  cellpadding="0"  cellspacing="0"> 
<tr> 
  <td  colspan="2"><a  onclick="expand(__id__);  return  false;"  href="#"> 
    <img  src="__image__"  border="0"  width="15"  height="15"  id="img__id__"></a> 
     <a  onclick="expand(__id__);  return  false;"  href="#"> 
   __name__</a></td> 
   </tr> 
   <tr  id="node__id__"  style="display:__open__;"> 
                               <td  width="20"></td><td>__inner__</td> 
       </tr> 
  </table>'; 
       /* 
         *  这个是小分类的模板 
         * 
         *  see  $blockTpl 
       */ 
       var  $elementTpl  =  '<img  src="images/line.gif"  width="15"  height="15"><a  href="?id=__id__"><font  color="white">__name__</font></a><br/>'; 
       /* 
         *  这个是当前位置显示模板 
         * 
         *  see  $blockTpl 
       */ 
       var  $currentTpl  =  '<a  href="?id=__id__"><font  color="white">__name__</font></a>'; 
       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  =  "<script  language=\"javascript\"> 
                               imgopen  =  \"$this->imgOpen\"; 
                                   imgclose  =  \"$this->imgClose\"; 
                                   </script><script  src=\"$this->js\"  language=\"javascript\"></script>"; 
               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  .=  "<script  language=\"javascript\">$str</script>"; 
       } 
       /* 
         *  返回当前分类的路径 
       */ 
       function  getCurrentStr(){   return  $this->currentStr; 
       } 
       /* 
         *  返回分类的类树 
       */ 
       function  getTreeStr(){ 
               return  $this->treeStr; 
       } 

       function  setTpl($blockTpl,  $elementTpl,  $currentTpl,  $js){ 
               $this->blockTpl  =  $blockTpl; 
               $this->elementTpl  =  $elementTpl; 
               $this->currentTpl  =  $currentTpl; 
               $this->js  =  $js; 
       } 

       function  setImage($open,  $close,  $line){ 
               $this->imgOpen    =  $open; 
                   $this->imgClose  =  $close; 
                   $this->imgLine    =  $line; 
       } 

       function  setExpend($expand){ 
               $this->expand  =  $expand; 
       } 

//分类的基础数据的样子如下: 
$data  =  array(array('id'=>1,  'name'=>'name1',  'pid'=>0,  'order'=>1), 
                           array('id'=>2,  'name'=>'name2',  'pid'=>1,  'order'=>1), 
                           array('id'=>3,  'name'=>'name3',  'pid'=>0,  'order'=>1), 
                           array('id'=>4,  'name'=>'name4',  'pid'=>3,  'order'=>1), 
                           array('id'=>5,  'name'=>'name5',  'pid'=>6,  'order'=>1), 
                           array('id'=>6,  'name'=>'name6',  'pid'=>2,  'order'=>1), 
                           array('id'=>7,  'name'=>'name7',  'pid'=>6,  'order'=>1), 
                           array('id'=>8,  'name'=>'name8',  'pid'=>3,  'order'=>1), 
                           array('id'=>9,  'name'=>'name9',  'pid'=>6,  'order'=>1), 
                           array('id'=>10,  'name'=>'name10',  'pid'=>0,  'order'=>1),
                           array('id'=>11, 'name'=>'name11', 'pid'=>10, 'order'=>1),
                          array('id'=>12, 'name'=>'name12', 'pid'=>10, 'order'=>1),
                          array('id'=>13, 'name'=>'name13', 'pid'=>10, 'order'=>1),
                          array('id'=>14, 'name'=>'name14', 'pid'=>12, 'order'=>1),
                          array('id'=>15, 'name'=>'name15', 'pid'=>12, 'order'=>4),
                  ); echo "<body bgcolor=\"blue\">";
$tree = new Catagory($data);
echo "<hr>下面是当前分类的类树<hr>";
//$tree->setExpend(1);
$tree->parseNode(0);
//$tree->parseNode(1);
//$tree->expand(9);
echo $tree->getTreeStr();

echo "<hr>下面是当前分类(分类的编号是9)的路径<hr>";
$tree->parseCurrent(9);
echo $tree->getCurrentStr();

PHP 相关文章推荐
十天学会php之第八天
Oct 09 PHP
PHP 多进程 解决难题
Jun 22 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
php递归遍历多维数组的方法
Apr 18 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PHP中多字节字符串操作实例详解
Aug 23 PHP
基于PHP+MySQL的聊天室设计
Oct 09 #PHP
Win9x/ME下Apache+PHP安装配置
Oct 09 #PHP
关于PHP中的Class的几点个人看法
Oct 09 #PHP
PHP自动生成月历代码
Oct 09 #PHP
十天学会php(3)
Oct 09 #PHP
十天学会php(1)
Oct 09 #PHP
十天学会php(2)
Oct 09 #PHP
You might like
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php循环输出数据库内容的代码
2008/05/24 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
使用URL传输SESSION信息
2015/07/14 PHP
两种php实现图片上传的方法
2016/01/22 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Django unittest 设置跳过某些case的方法
2018/12/26 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python 解决函数返回return的问题
2020/12/05 Python
C语言编程练习
2012/04/02 面试题
Python里面如何实现tuple和list的转换
2012/06/13 面试题
英语专业推荐信
2013/11/16 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
学校与家长安全责任书
2014/07/23 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2015中秋祝酒词
2015/08/12 职场文书
python解析json数据
2022/04/29 Python