zl程序教程

您现在的位置是:首页 >  后端

当前栏目

yii框架分类树扩展示例

扩展框架 示例 分类 yii
2023-06-13 09:15:25 时间

提供两种方式的分类树格式,表格和下拉框形式的树形结构
可以自定义表格和下拉框的样式,自定义以哪一列的参数为格式化数据,自定义层级关系参数,自定义表格列名称,也可以设置时间的格式化。



调用方式

表格方式:

复制代码代码如下:

<?php$this->widget("ext.tree.widgets.TreeWidget",array(
       "dataProvider" =>$dataProvider,          //传递数据
       "pid"          =>"pid",                  //设置层级关系id
       "tableClass"   =>"itemstabletable-stripedtable-borderedtable-condensed", //表格样式
       "formatParam"  =>"name",                 //设置格式化字段   
       "formatTime"   =>array(                  //设置格式化的时间参数
           "created"
       ),              
       "tableHead"    =>array(                  //设置表格列头信息
               "分类ID",
               "频道",
               "中文名",
               "英文名",
               "首字母",
               "排序",
               "分类级别",
               "父ID",
               "创建时间",
       ),   
   ));?>

下拉框方式

复制代码代码如下:

<?php$this->widget("ext.tree.widgets.TreeWidget",array(
           "dataProvider" =>$cate,          //传递数据
           "pid"          =>"pid",                  //设置父ID           
           "formatParam"  =>"name",                 //设置格式化字段
           "treeType"     =>false,                  //输出树格式
           "selectClass" =>"class="span11"",        //设置下拉框样式
            "defaultSelectValue"=>array(            //设置下拉框的默认值和选项
                   0,"≡作为一级栏目≡"
            ),
       ));?>

TreeWidget.php

复制代码代码如下:
<?php

/*
 *Tochangethistemplate,chooseTools|Templates
 *andopenthetemplateintheeditor.
 */

/**
 *DescriptionofTree
 *
 *@author汪嘉诚
 *@email819434425@qq.com
 * 
 *表格方式调用
   <?php$this->widget("ext.tree.widgets.TreeWidget",array(
       "dataProvider" =>$dataProvider,          //传递数据
       "pid"          =>"pid",                  //设置层级关系id
       "tableClass"   =>"itemstabletable-stripedtable-borderedtable-condensed", //表格样式
       "formatParam"  =>"name",                 //设置格式化字段   
       "formatTime"   =>array(                  //设置格式化的时间参数
           "created"
       ),              
       "tableHead"    =>array(                  //设置表格列头信息
               "分类ID",
               "频道",
               "中文名",
               "英文名",
               "首字母",
               "排序",
               "分类级别",
               "父ID",
               "创建时间",
       ),   
   ));?>
 *
 *下拉框方式调用
 *<?php$this->widget("ext.tree.widgets.TreeWidget",array(
           "dataProvider" =>$cate,          //传递数据
           "pid"          =>"pid",                  //设置父ID           
           "formatParam"  =>"name",                 //设置格式化字段
           "treeType"     =>false,                  //输出树格式
           "selectClass" =>"class="span11"",        //设置下拉框样式
            "defaultSelectValue"=>array(            //设置下拉框的默认值和选项
                   0,"≡作为一级栏目≡"
            ),
       ));?>
 */
classTreeWidgetextendsWidget{
   /**
    *CArrayDataProvider数据对象或数组数据
    *组件数据接收参数
    *@varObject||array
    */
   public$dataProvider;

   /**
    *赋值接收数据
    *@vartype
    */
   public$arrAll=array();

   /**
    *按_ID作键名的多维关系
    *@vartype
    */
   public$arrIdRelation=array();

   /**
    *按_ID作键名的多维关系的简化,用来输出树状图
    *@vartype
    */
   public$arrIdRelationSimple=array();

   /**
    *将原始数据转化成的_ID作键名的数组
    *@vartype
    */
   public$arrIdAll=array();

   /**
    *所有的父子关系
    *@vartype
    */
   public$arrIdSon=array();

   /**
    *叶子节点的_ID
    *@vartype
    */
   public$arrIdLeaf=array();

   /**
    *根节点的_ID
    *@vartype
    */
   public$arrIdRoot=array();

   /**
    *每个节点下的子孙后代_ID
    *@vartype
    */
   public$arrIdChildren=array();

   /**
    *每个节点回逆到根
    *@vartype
    */
   public$arrIdBackPath=array();

   /**
    *输出树的结构
    *@vartype
    */
   public$strItem="<br/>{$strSep}{$name}";

   /**
    *设置表格样式
    *@vartype
    */
   public$tableClass ="itemstabletable-stripedtable-borderedtable-condensed";

   /**
    *数据字段参数数组
    *@vartype
    */
   public$dataKey  =array();

   /**
    *指定需要格式化的字段
    *@vartype
    */
   public$formatParam="name";

   /**
    *表格列名称
    *@vartype
    */
   public$tableHead  =array();

   /**
    *父ID
    *@vartype
    */
   public$pid="pid";

   /**
    *指定树的类型
    *true表格类型树
    *false下拉框类型树
    *@vartype
    */
   public$treeType=true;       

   /**
    *绑定下拉框value值
    *@vartype
    */
   public$optionValue="id";

   /**
    *格式化时间
    *@vartype
    */
   public$formatTime=array();

   /**
    *下拉框样式
    *@vartype
    */
   public$selectClass="class="span3"";

   /**
    *设置下拉框的默认值和选项
    *@vartype
    */
   public$defaultSelectValue=array(
       0,"≡作为一级栏目≡",
   );

   /**
    *设置下拉框是否多选
    *true多选
    *false单选
    *@vartype
    */
   public$isMultiple=false;

   /**
    *绑定到下拉框的默认值
    *@vartype
    */
   public$bindSelectValue=0;
   

   /**
    *运行
    */
   publicfunctionrun(){               
           if(is_array($this->dataProvider)&&count($this->dataProvider)>0)
                   $data=$this->_run($this->dataProvider);
           elseif(is_object($this->dataProvider)&&count($this->dataProvider->rawData)>0)
                   $data=$this->_run($this->dataProvider->rawData);                   

                               
           $this->render("tree",array("data"=>$data));
   }

   /**
    *
    *@returntype
    */
   privatefunction_run($datas){           
           foreach($datasas$data)
                   $this->arrAll[]=$data;
                   $this->dataKey=array_keys($data);

           $this->processData();
           if($this->treeType===true)
                   $data=$this->getTable();
           else
                   $data=$this->getSelect($this->pid,$this->bindSelectValue,$this->isMultiple,$this->selectClass,$this->defaultSelectValue);

           return$data;
   }

   /**
    *获得html
    *@returntype
    */
   publicfunctiongetHtml(){
           return$this->genHtml();
   }

   /**
    *设置分层字段
    *表格类型
    *@returnstring
    */
   publicfunctiongetItemName(){           
           $html="<tr>";
           foreach($this->dataKeyas$v){                   
                   if($this->formatParam==$v)
                           $str="{$strSep}";
                   else
                           $str="";

                   $html.="<td>".$str."{$".$v."}</td>";
           }
           $html.="</tr>";
           return$html;
   }

   /**
    *获取表格列名称
    *@returnstring
    */
   publicfunctiongetTableHead(){
           $html="<tr>";
           foreach($this->tableHeadas$v)
                   $html.="<th>".$v."</th>";

           $html.="</tr>";
           return$html;
   }

   /**
    *获得表格形式的树
    *@returnstring
    */
   publicfunctiongetTable(){                   
           $this->strItem=$this->getItemName();
           $strRe="<tableclass="".$this->tableClass."">";
           $strRe.="<thead>".$this->getTableHead()."</thead><tbody>";
           $strRe.=$this->genHtml();
           $strRe.="</tbody></table>";
           return$strRe;
   }   

   /**
    *获取下拉框形式的树
    *@paramtype$strName
    *@paramarray$arrValue
    *@paramtype$blmMulti
    *@paramtype$strExt
    *@paramtype$arrFirst
    *@returnstring
    */
   publicfunctiongetSelect($strName="tree",$arrValue=array(),$blmMulti=false,$strExt="",$arrFirst=null){
           !is_array($arrValue)&&$arrValue=array($arrValue);
           foreach($this->arrIdAllas$strTemp=>$arrTemp){
                   $this->arrIdAll[$strTemp]["selected"]="";

                   if(in_array($arrTemp["id"],$arrValue)){
                           $this->arrIdAll[$strTemp]["selected"]="selected="selected"";
                   }
           }
           $this->strItem="<optionvalue=\"{$".$this->optionValue."}\"{$selected}title=\"{$".$this->formatParam."}\">{$strSep}{$".$this->formatParam."}</option>";
           $strRe="<selectid="id_".$strName.""name="".$strName.($blmMulti?"[]":"").""";
           $strRe.=($blmMulti?"multiple="multiple"":"").(empty($strExt)?"":"".$strExt).">";

           if(is_array($arrFirst)&&count($arrFirst)==2){
                   $strRe.="<optionvalue="".$arrFirst[0]."">".$arrFirst[1]."</option>";
           }

           $strRe.=$this->getHtml()."</select>";           
           return$strRe;
   }

   /**
    *数据处理
    *@paramtype$arrData
    *@returntype
    */
   privatefunctionhelpForGetRelation($arrData){
           $arrRe=array();
           foreach($arrDataas$strTemp=>$arrTemp){
                   $arrRe[$strTemp]=$arrTemp;
                   if(isset($this->arrIdRelation[$strTemp])){
                           $arrRe[$strTemp]=$this->arrIdRelation[$strTemp];
                   }
                   if(count($arrRe[$strTemp])>0){
                           $arrRe[$strTemp]=$this->helpForGetRelation($arrRe[$strTemp]);
                   }else{
                           array_push($this->arrIdLeaf,$strTemp);
                   }
           }
           return$arrRe;
   }

   /**
    *数据处理
    *@paramtype$arrData
    *@returntype
    */
   privatefunctionhelpForGetChildren($arrData){
           $arrRe=array_keys($arrData);
           foreach($arrDataas$arrTemp){
                   $arrRe=array_merge($arrRe,$this->helpForGetChildren($arrTemp));
           }
           return$arrRe;
   }

   /**
    *数据处理
    *@paramtype$str
    *@returntype
    */
   privatefunctionhelpForGetBackPath($str){
           $arrRe=array();
           $intTemp=$this->arrIdAll[$str][$this->pid];
           if($intTemp>0){
                   $intTemp="_".$intTemp;
                   array_push($arrRe,$intTemp);
                   $arrRe=array_merge($arrRe,$this->helpForGetBackPath($intTemp));
           }
           return$arrRe;
   }

   /**
    *数据处理
    */
   privatefunctionprocessData(){
           $count=count($this->arrAll);
           foreach($this->arrAllas$arrTemp){           
                   $strTemp="_".$arrTemp["id"];
                   $this->arrIdAll[$strTemp]=$arrTemp;
                   if($arrTemp[$this->pid]>0&&$count>1){
                           $strTemp_="_".$arrTemp[$this->pid];
                           !isset($this->arrIdRelation[$strTemp_])&&$this->arrIdRelation[$strTemp_]=array();
                           $this->arrIdRelation[$strTemp_][$strTemp]=array();
                           !isset($this->arrIdSon[$strTemp_])&&$this->arrIdSon[$strTemp_]=array();
                           array_push($this->arrIdSon[$strTemp_],$strTemp);
                   }else{
                           !isset($this->arrIdRelation[$strTemp])&&$this->arrIdRelation[$strTemp]=array();
                           array_push($this->arrIdRoot,$strTemp);
                   }
           }

           $this->arrIdRelation=$this->helpForGetRelation($this->arrIdRelation);
           $this->arrIdLeaf=array_unique($this->arrIdLeaf);
           foreach($this->arrIdRelationas$strTemp=>$arrTemp){
                   $this->arrIdChildren[$strTemp]=$this->helpForGetChildren($arrTemp);
                   in_array($strTemp,$this->arrIdRoot)&&$this->arrIdRelationSimple[$strTemp]=$arrTemp;
           }
           $arrTemp=array_keys($this->arrIdAll);
           foreach($arrTempas$strTemp){
                   $this->arrIdBackPath[$strTemp]=$this->helpForGetBackPath($strTemp);
           }
   }

   /**
    *数据处理
    *@paramtype$intLen
    *@returnstring
    */
   privatefunctiongenSeparator($intLen){
           $strRe="";
           $i=0;
           while($i<$intLen){
                   $strRe.=" ".(($i+1==$intLen)?"├":"│");
                   $i++;
           }

           !empty($strRe)&&$strRe.="─";
           return$strRe;
   }

   /**
    *数据处理
    *@paramtype$arrRelation
    *@paramtype$intSep
    *@returntype
    */
   privatefunctiongenHtml($arrRelation=null,$intSep=0){
           $strRe="";
           null===$arrRelation&&$arrRelation=$this->arrIdRelationSimple;
           foreach($arrRelationas$strKey=>$arrTemp){
                   if(count($this->arrIdAll[$strKey])>0){
                           if(!empty($this->formatTime)&&count($this->formatTime)>0){
                                   foreach($this->formatTimeas$formatTime){
                                           if($this->arrIdAll[$strKey][$formatTime]>0){
                                                   $this->arrIdAll[$strKey][$formatTime]=date("Y-m-dH:i:s",$this->arrIdAll[$strKey][$formatTime]);
                                           }
                                   }                                   
                           }

                           $strSep=$this->genSeparator($intSep);                       
                           extract($this->arrIdAll[$strKey]);
                           eval("$strRe.="".$this->strItem."";");                                               
                           count($arrTemp)>0&&$strRe.=$this->genHtml($arrTemp,($intSep+1));
                   }
           }           
           return$strRe;
   }
}
?>

tree.php

复制代码代码如下:
<?php if(!empty($data)):?>
<?phpecho$data; ?>
<?phpelse: ?>
<tr><tdcolspan="4"class="empty"><spanclass="empty">没有找到数据.</span></td></tr>
<?phpendif;?>