最近用织梦做了两个网站,发现生成栏目树的需求很多,而网上的解决方案都用cattree,但是这个玩意不好用,所以自己写了一个,给大家做参考:
一、在织梦数据里增加一个自定函数:
CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst2table`(rootId varchar(50)) RETURNS varchar(1000) CHARSET latin1
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =rootId;
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM dede_arctype where reid<>id and FIND_IN_SET(reid,sTempChd)>0;
END WHILE;
set sTemp=replace(sTemp,concat('$,',rootId,','),'');
set sTemp=concat('|',replace(sTemp,',','|,|'),'|');
set sTemp=replace(sTemp,concat('|$|,|',rootId,'|'),'');
RETURN sTemp;
END
二、使用如下查询查询某点下的所有子节点:
select id,reid,topid,sortrank,typename,typedir,concat('/plus/list.php?tid=',id)as url,defaultname,char_length(typedir)-char_length(replace(typedir,'/','')) as layer
from dede_arctype where instr(getChildLst2table('3'),trim(concat('|',id,'|')))>0 order by sortrank;
注意:
一定在要织梦后台对你的栏目按层次设好排序和存储目录,这里通过存储目录中的/个数来确定层级,用排序号来确定归属。
三、在/plus/增加一个PHP程序来调用这个查询:如下:
<?php
require_once("wangsirDAO.php");
header("Content-type: text/html; charset=gb2312");
$rootid=$_REQUEST["rootid"];
if (!isset($rootid))
{
echo "没有父节点";
return;
}
$dao=new wangsirDAO();
$sql="select id,reid,topid,sortrank,typename,typedir,concat('/plus/list.php?tid=',id)as url,defaultname,char_length(typedir)-char_length(replace(typedir,'/','')) as layer "." from dede_arctype where instr(getChildLst2table('$rootid'),trim(concat('|',id,'|')))>0 order by sortrank;";
$res=$dao->query($sql);
echo "<ul class='treecotainer'>";
$left=0;
foreach($res as $v)
{
$tname=$v["typename"];
$tid=$v["reid"];
$cid=$v["id"];
$layer=$v["layer"];
$s="";
for($i=0;$i<$layer;$i++)
{
$s=$s." ";
}
echo "<li class='submenuitem'><h4>".
$s."<img src='./images/box_icon1.png' border=0><a href='/plus/list.php?tid=".$tid."' style='color:#000;font-weight:bold'>".$tname."</a></h4>";
echo "</li>";
}
echo "</ul>";
?>
四、在页面模板中通过ajax来调用这个PHP页面来生成层次显示在该显示的地方。