因项目需要用到无限极分类,同时也才接触TP没多久,就把TP官方里别人的分享整理了下,记录下来以便以后用到
第一步:增加扩展配置
打开配置文件conf.php,添加
'LOAD_EXT_CONFIG' => 'tool', // 加载扩展配置文件,关于扩展配置可以查阅开发手册《3.8 扩展配置》
第二步:创建tool.php,并添加以下代码
class Tool { static public $treeList = array(); //存放无限分类结果如果一页面有多个无限分类可以使用 Tool::$treeList = array(); 清空 /** * 无限级分类 * @access public * @param Array $data //数据库里获取的结果集 * @param Int $pid * @param Int $count //第几级分类 * @return Array $treeList */ static public function columnTree(&$data,$pid = 0,$count = 1){ foreach ($data as $key => $value){ if($value['ColumnRela']==$pid){ $value['Count'] = $count; self::$treeList []=$value; unset($data[$key]); self::columnTree($data,$value['ID'],$count+1); } } return self::$treeList ; } }
第三步:控制器中调用
public function index(){ $Column = M("Column"); $result=$Column->order("ColumnRela asc,ColumnSort desc,ID desc")->select(); $this->assign("column",Tool::columnTree($result)); $this->display(); }
第四步:模板输出(也可以使用volist输出)
<foreach name="column" item="vo"> <for start="1" end="$vo.Count"><php>$Spaces.="|----";</php></for> <if condition="$vo.ColumnLevel gt 1 "> <php>$Spaces = $Spaces.$vo['ColumnName'];</php> <else /> <php>$Spaces = $vo['ColumnName'];</php> </if> <tr> <td style="text-align:left;"><{$Spaces}></td> </tr> <php>unset($Spaces);</php> </foreach>
注释:
$treeList[] 保存排序的结果,基本就是进行了一次排序,保存后就可以 unset($data[$key]);掉,因为已经使用不到了
&$data 使用按地址传参,结合unset($data[$key]); 减少循环次数,这样效率提高了好几倍,但需要对 ColumnRela 进行 ASC的排序不然会显示不完全
$value['Count'] = $count; 为当前的等级在模板里会通过等级进行生成树形结构
参数说明:
ID 分类ID ColumnName 类别名称 ColumnRela 父类ID ColumnSort 分类 ColumnLevel 分类级别