<?php
/*
-----------程序说明-------------
程序名称：多级(无限)分类操作样例(PHP+文本)
程序作者：Redhat
发布时间：2003.5.24
主页：http://2002.buyionline.net
授权：免费、自由传播及自由修改但请保留原作者信息
版本：无
说明：使用递归完成一些父类和子孙类别的遍历
注：如果是在ＬＩＮＵＸ下使用请把tree.txt文件属性设置为７７７或６６６
运行:解压后直接运行本文件,如:http://somesitedomain/otherpath/Tree.php
*/
?>
<html><head><title>多级(无限)分类操作样例</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><style type="text/css">.f9 { font-size: 12px}.f14 { font-size: 14.8px}.formfont {font-family: "Verdana", "Arial", "Helvetica", "sans-serif"; font-size: 16px;}A:link{cursor: hand; font-family: "宋体";; text-decoration: underline}A:visited{font-family: "宋体";; text-decoration: underline}A:active{font-family: "宋体";; text-decoration: underline}A:hover {font-family: "宋体"; text-decoration: underline}.pm { font-size: 12px}a.mm:link{color:#000000; cursor: hand; font-family:"宋体"; text-decoration: none}a.mm:visited{color:#000000; font-family:"宋体"; text-decoration: none}a.mm:active{font-family:"宋体";color:#000000; text-decoration: underline}a.mm:hover{color: #000000;text-decoration: underline;font-family:"宋体"}</style>
<?php
echo "<script language=\"JavaScript\">function checkdel(url){if(confirm('是否确定删除?'))window.location.href=url;else return false;}</script>";
?>
</head>
<body>
<?php
//文件格式:当前ID|父ID|类别名称
#注:第一次(1级类别)建立的类别的父ID为0
#   第二次(2级类别)建立的类别的父ID为某个1级类别的ID号
#   第三次(3级类别)建立的类别的父ID为某个2级类别的ID号
#   以此类推....
#   所有类别ID(1级类别的父ID除外)号为建立时类别时的time()函数返回值
#################################
//初始化一些参数
$fileData = "tree.txt";//存储类别数据文件
$sp = "{*}";//分隔符
$allMsg = file($fileData);//把记录取出来存储在数组$allMsg中
$dataLen = count($allMsg);//数组$allMsg共有多少条记录
$allMsg = array_reverse($allMsg);//反转数组(升序排列),不要修改,否则会不正常
##################################
if(!file_exists($fileData)) {$fp = @fopen($fileData,"w") or exit("不能创建文件<b>".$fileData."</b>");fclose($fp);}
$parentId = $_GET['parentId'];
if($parentId=="") $parentId = 0;//如果没有指定父类别,则此类别是祖宗


#基本的文件操作
//执行添加,修改,删除________________________________________________________________+_+_+_+_+
//__________________________________________________________________________________+_+_+_+_+

//如果执行了添加类别操作
if($_POST['action'] == "addType"){
$typeName = trim($_POST['typeName']);
$parentId = $_POST['parentId'];
##################
for($i=0;$i<=$dataLen;$i++){
	$allMsg[$i] = trim($allMsg[$i]);
	if($allMsg[$i] == "") continue;
	$msg .= $allMsg[$i]."\n";
}
#################
$msg .= time().$sp.$parentId.$sp.$typeName."\n";
$fp = fopen($fileData,"w");
fwrite($fp,$msg);
fclose($fp);
echo "<a href=\"".$_SERVER['PHP_SELF']."?parentId=".$parentId."\" tilte=\"添加类别成功,点击此处返回查看\">添加成功,点击此处返回查看</a>";
echo "</body></html>";
exit;
}

//如果是修改类别(第1步)
elseif($_GET['action'] == "modify"){
$id = $_GET['id'];
$typeName = $_GET['typeName'];
$parentId = $_GET['parentId'];
echo "<form action=".$_SERVER['PHP_SELF']." method=\"post\">";
echo "<input type=\"hidden\" name=\"parentId\" value=\"".$parentId."\">";
echo "<input type=\"hidden\" name=\"id\" value=\"".$id."\">";
echo "<input type=\"hidden\" name=\"action\" value=\"modify\">";
echo "<table cellspacing=1 cellpadding=3 width=95% bgcolor=\"#383839\"><tr><th bgcolor=\"#efefef\" align=\"center\" colspan=2>修改类别</th></tr>";
echo "<tr bgcolor=\"white\"><td width=20%>类别名称:</td><td align=\"left\" width=40%><input type=\"text\" name=\"typeName\" value=\"".$typeName."\"></td></tr>";
echo "<tr><td align=center colspan=2><input type=\"submit\" value=\"修改\"></td></tr>";
echo "</table>";
echo "</form>";
echo "</body></html>";
exit;
}


//如果是修改类别(第2步)
elseif($_POST['action'] == "modify"){
$id = $_POST['id'];
$typeName = $_POST['typeName'];
$parentId = $_POST['parentId'];
  for($i=0;$i<=$dataLen;$i++){
     $allMsg[$i] = trim($allMsg[$i]);
     if($allMsg[$i] == "") unset($allMsg[$i]);
     $tmp = explode($sp,$allMsg[$i]);
     if($tmp[0] == $id) {
        $allMsg[$i] = $tmp[0].$sp.$tmp[1].$sp.$typeName;
        #
        $tmpMsg = array();
        //去除一些无效的空白字符
        foreach($allMsg as $var) {
           if($var != "") $tmpMsg[] = $var;
        }
        #
        $msg = join("\n",array_reverse($tmpMsg));
        $fp = fopen($fileData,"w");
        fwrite($fp,$msg."\n");
        fclose($fp);
        echo "<a href=\"".$_SERVER['PHP_SELF']."?parentId=".$parentId."\" tilte=\"修改类别成功,点击此处返回查看\">添加成功,点击此处返回查看</a>";
        break;
     }
  }
echo "</body></html>";
exit;
}


//删除当前类别及当前类别下的所有子类别
elseif($_GET['action'] == "delete"){
$id = $_GET['id'];//当前类别下的父类别
$typeName = $_GET['typeName'];
$saveId = array();//初始化类别ID数组
$saveMsg = array();//初始化类别数组
$Tmp = getAllSon($id);//调用得到所有子孙类别的函数

//把当前类别也删除
$Tmp[0][] = $id;
$Tmp[1][] = $typeName;
//
  //循环(扫描所有记录)删除
  for($i=0;$i<=$dataLen;$i++){
     $allMsg[$i] = trim($allMsg[$i]);
     if($allMsg[$i] == "") unset($allMsg[$i]);
     $tmp = explode($sp,$allMsg[$i]);
     if(in_array($tmp[0],$Tmp[0])){
      unset($allMsg[$i]);
      echo "删除类别<b>".$Tmp[1][$i]."</b>成功<br>";
      }
  }
     $tmpMsg = array();
    //去除一些无效的空白字符
     foreach($allMsg as $var) {
        if($var != "") $tmpMsg[] = $var;
      }
     #
     $msg = join("\n",array_reverse($tmpMsg));
     $fp = fopen($fileData,"w");
     fwrite($fp,$msg."\n");
     fclose($fp);
     echo "<a href=\"".$_SERVER['PHP_SELF']."?parentId=".$parentId."\" tilte=\"修改类别成功,点击此处返回查看\">添加成功,点击此处返回查看</a>";
     echo "</body></html>";
exit;
}

//执行添加,修改,删除结束____________________________________________________________+_+_+_+_+
//__________________________________________________________________________________+_+_+_+_+


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
#   显示类别                                                                            #
#   显示类别                                                                            #
#########################################################################################
//显示当前类别的所有父类别
echo "<p><a href=\"".$_SERVER['PHP_SELF']."?parentId=0\">总类别</a>->";
$saveId = array();
$saveMsg = array();
$Tmp = getParentId($parentId,$saveId);
/*
echo "<pre>";
print_r($Tmp[0]);
print_r($Tmp[1]);
echo "</pre>";
*/
for($i=0;$i<=count($Tmp[0]);$i++){
if($Tmp[0][$i] == "") continue;
echo "<a href=\"".$_SERVER['PHP_SELF']."?parentId=".$Tmp[0][$i]."\">".$Tmp[1][$i]."</a>->";
}
echo "</p>";


//所有子孙类别显示列表
$Tmp = getFirstSon($parentId);//得到所有子孙类别的ID及相关信息
/*
echo "<pre>";
print_r($Tmp[0]);
print_r($Tmp[1]);
echo "</pre>";
*/
echo "<table cellspacing=1 cellpadding=3 align=center width=95% bgcolor=darkblue><tr><td align=center colspan=3><font color=white>当前类别下的所有子类别</font></td></tr>\n";
for($i=0;$i<=count($Tmp[0]);$i++){
if($Tmp[0][$i] == "") continue;
if($bgcolor == "#efefef") $bgcolor="#fefef0";
else $bgcolor = "#efefef";
echo "<tr align=center bgcolor=$bgcolor><td align=\"left\" width=50%><a href=\"".$_SERVER['PHP_SELF']."?parentId=".$Tmp[0][$i]."\">".$Tmp[1][$i]."</a></td><Td width=20%><a href=\"".$_SERVER['PHP_SELF']."?action=modify&id=".$Tmp[0][$i]."&typeName=".urlencode($Tmp[1][$i])."&parentId=".$parentId."\" title=\"修改当前类别\">修改</a></td><Td width=20%><a href=\"#\" onClick=\"JavaScript:checkdel('".$_SERVER['PHP_SELF']."?action=delete&id=".$Tmp[0][$i]."&typeName=".urlencode($Tmp[1][$i])."&parentId=".$parentId."');\" title=\"修改当前类别\">删除</a></td></tr>\n";
}
echo "</table>\n";
/////////////////////////////




########################################
//添加类别
echo "<form action=".$_SERVER['PHP_SELF']." method=\"post\">";
echo "<input type=\"hidden\" name=\"parentId\" value=\"".$parentId."\">";
echo "<input type=\"hidden\" name=\"action\" value=\"addType\">";
echo "<table cellspacing=1 cellpadding=3 width=95% bgcolor=\"#383839\" align=center><tr><th bgcolor=\"#efefef\" align=\"center\" colspan=2>在当前类别下添加新类别</th></tr>";
echo "<tr bgcolor=\"white\"><td width=20%>类别名称:</td><td align=\"left\" width=40%><input type=\"text\" name=\"typeName\"></td></tr>";
echo "<tr><td align=center colspan=2><input type=\"submit\" value=\"确定\"></td></tr>";
echo "</table>";
echo "</form>";
////////////////////////////
################################################################################
#                                        显示结束,下面是定义函数               #
################################################################################

#*******************************************************************************
//定义一些公共函数

#取出某个类别的所有父类别ID(用递归)
/**
参数说明:
    $parentId:当前类别的ID号
返回值
   二维数组(所有父类的ID号,所有父类的名称)
*/
function getParentId($parentId){
global $allMsg,$dataLen,$firstParentId,$sp,$saveId,$saveMsg;
if($parentId == 0) return array(array_reverse($saveId),array_reverse($saveMsg));
  for($i=0;$i<=$dataLen;$i++){
    $allMsg[$i] = trim($allMsg[$i]);
    if($allMsg[$i] == "") continue;
    $tmp = explode($sp,$allMsg[$i]);

      //找到符合条件的记录
      if($tmp[0] == $parentId) {
          $saveId[] = $tmp[0];
          $saveMsg[] = $tmp[2];
          //继续下次查找(把查找到的当前父类Id作为下次的当前Id)
          getParentId($tmp[1]);
          break;
      }
  }
  return array(array_reverse($saveId),array_reverse($saveMsg));
}

#取出当前类别的1级子类别
/**
参数说明:
    $parentId:当前类别的ID号
返回值
   二维数组(所有父类的ID号,所有父类的名称)
*/
function getFirstSon($parentId){
global $allMsg,$dataLen,$sp;
$saveId = array();
$saveMsg = array();
   for($i=0;$i<=$dataLen;$i++){
     $allMsg[$i] = trim($allMsg[$i]);
      if($allMsg[$i] == "") continue;
     $tmp = explode($sp,$allMsg[$i]);
     if($tmp[1] == "") $tmp[1] = 0;
        if($tmp[1] == $parentId){
            $saveId[] = $tmp[0];
            $saveMsg[] = $tmp[2];
        }
   }
   return array($saveId,$saveMsg);
}

#取出当前类别下的所有子类别(用在删除类别时)
/**
参数说明:
    $parentId:当前类别的ID号
返回值
   二维数组(所有子孙类的ID号,所有子孙类的名称)
*/
function getAllSon($parentId){
global $allMsg,$dataLen,$sp,$saveId,$saveMsg;
   for($i=0;$i<=$dataLen;$i++){
      $allMsg[$i] = trim($allMsg[$i]);
      if($allMsg[$i] == "") continue;
      $tmp = explode($sp,$allMsg[$i]);
        if($tmp[1] == $parentId) {
            $saveId[] = $tmp[0];
            $saveMsg[] = $tmp[2];
            getAllSon($tmp[0]);
        }
   }
   return array($saveId,$saveMsg);
}
#*******************************************************************************
?>
<p><center><a href="http://2002.buyionline.net" title="http://2002.buyionline.net">http://2002.buyionline.net</a> By <a href="mailto:redhat@hnwj.net" title="redhat@hnwj.net">Redhat</a></center></p>
</body>
</html>