tznktg 发表于 2007-9-27 22:04:06

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

 最近问无限分类的类树问题比较多,所以一高兴自己写了一个,我刚写完的,大家用用看,看看怎么实现起来更快,更简单,把你的树也贴出来(要只查询一次数据库的)<br>
  
  这是一棵分类列表的类树,支持无限分类<br>
  一个分类下面可以同时有"包含子类的分类"和"最终分类";<br>
  


  唯一的优点是*****只需要进行一次的数据库*****查询.<br>
  
  样子不是很好看,不过可以自定义修改,可以自己定义css加里面<br>
  
  缓存方面还没有作,可以自己补上
  
  下面例子的目录结构是这样的。
   &brvbar;--Catagory.php                                        <br>
   &brvbar;--images----tree.jsp                            <br>
   &brvbar;--images----treeopen.gif                  <br>
   &brvbar;--images----treeclose.gif                  <br>
   &brvbar;--images----line.gif                            <br>
  
  /****************tree.jsp********************/
  functionexpand(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);
  
  classCatagory{
         //基础分类数据
           var$treeData=array();
         //分类的等级结构数组,以分类的id值作为数组的关键字
         var$treePList=array();
         //自分类对应上级类的关系
         var$treeCList=array();
 /*
             *这个是大分类的模板
         *
             *__id__          分类的编号
           *__name__      分类的名称
           *__image__    分类前面显示的图像名称$imgOpenor$imgClose
           *__open__      分类当前是否是展开的
           *__inner__    子分类显示的位置



  
           *样式可以根据自己的需要任意修改,但是不能删除现有的元素
         */
         var$blockTpl='
     <tableborder="0"cellpadding="0"cellspacing="0">
   <tr>
 <tdcolspan="2"><aonclick="expand(__id__);returnfalse;"href="#">
     <imgsrc="__image__"border="0"width="15"height="15"id="img__id__"></a>
    <aonclick="expand(__id__);returnfalse;"href="#">
   __name__</a></td>
    </tr>
    <trid="node__id__"style="display:__open__;">
                                   <tdwidth="20"></td><td>__inner__</td>
        </tr>
 </table>';
         /*
           *这个是小分类的模板
           *
           *see$blockTpl
         */
         var$elementTpl='<imgsrc="images/line.gif"width="15"height="15"><ahref="?id=__id__"><fontcolor="white">__name__</font></a><br/>';
         /*
           *这个是当前位置显示模板
           *
           *see$blockTpl
         */
         var$currentTpl='<ahref="?id=__id__"><fontcolor="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$dataarray()
         */
           functionCatagory(&$data){
               $this->_init($data);
         }
    
         function_init($tmpData){
                 $plevel=$clevel=$treeData=array();





  
                     foreach($tmpDataas$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$cataIdint要解析的主分类的编号
         */
         functionparseNode($cataId=0){
                 $this->result=$this->treePList[$cataId];
                 if($this->result==null)die("Catagoryiderror");
                     $this->treeStr=    $this->_doNode($this->result);
                 $this->treeStr.=$this->_jsParse();
         }
  
           function&_doNode(&$result){
                     $nstr=$estr='';
                     foreach($resultas$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('&brvbar;__id__&brvbar;',$data['id'],$this->blockTpl);
                 $str=preg_replace('&brvbar;__name__&brvbar;',$data['name'],$str);
                 $str=preg_replace('&brvbar;__image__&brvbar;',($this->expand?$this->imgClose:$this->imgOpen),$str);
                 $str=preg_replace('&brvbar;__open__&brvbar;',($this->expand?'':'none'),$str);
                 $str=preg_replace('&brvbar;__inner__&brvbar;',$inner,$str);
                 return$str;
         }
  
         function_parseElementTpl($cataId){
                 $data=$this->treeData[$cataId];
                 $str=preg_replace('&brvbar;__id__&brvbar;',$data['id'],$this->elementTpl);
               $str=preg_replace('&brvbar;__name__&brvbar;',$data['name'],$str);
               $str=preg_replace('&brvbar;__image__&brvbar;',$this->imgLine,$str);
               return$str;
       }






  

       function_jsParse(){
                   $str="<scriptlanguage=\"javascript\">
                               imgopen=\"$this->imgOpen\";
                                 imgclose=\"$this->imgClose\";
                                 </script><scriptsrc=\"$this->js\"language=\"javascript\"></script>";
               return$str;
       }
       /*
         *展开分类$cataId
         *
         *param$cataIdint要展开的分类的编号
       */
       functionparseCurrent($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('&brvbar;__id__&brvbar;',$data['id'],$this->currentTpl);
               $str=preg_replace('&brvbar;__name__&brvbar;',$data['name'],$str);
               return$str;
       }
       /*
         *解析当前分类的路径
         *
         *param$cataIdint要解析的主分类的编号
       */
       functionexpand($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.="<scriptlanguage=\"javascript\">$str</script>";
       }
       /*
         *返回当前分类的路径
       */
       functiongetCurrentStr(){





                  return$this->currentStr;
       }
       /*
         *返回分类的类树
       */
       functiongetTreeStr(){
               return$this->treeStr;
       }

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

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

       functionsetExpend($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();
页: [1]
查看完整版本: 一棵php的类树(支持无限分类)

网站推广