因项目需要用到无限极分类,同时也才接触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 分类级别