yii框架分类树扩展示例
提供两种方式的分类树格式,表格和下拉框形式的树形结构
可以自定义表格和下拉框的样式,自定义以哪一列的参数为格式化数据,自定义层级关系参数,自定义表格列名称,也可以设置时间的格式化。
调用方式
表格方式:
<?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
/* /** /** $this->processData(); /** /** /** /** tree.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);
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;
}
}
?>
<?php if(!empty($data)):?>
<?phpecho$data; ?>
<?phpelse: ?>
<tr><tdcolspan="4"class="empty"><spanclass="empty">没有找到数据.</span></td></tr>
<?phpendif;?>
相关文章