Feb
11
无限分类(无递归) + 无限联动 + 树状显示(多显示方式) +导航输出 +批量移动 正式版1.1
主要功能:
不使用递归,直接采用order by按级排序;
支持无限分类;
显示类别时可设置从某类别下开始显示,以及设置是否显示子分类;是否带格式输出;
支持从任何目录的导航输出;
批量移动分类,批量移动文章,改写关联属性;
添加文章内容时,要存放亲缘树序列,目的:当选择某一分类查看时,可设置其子分类的文章是否也显示出来。
程序:无限分类(无递归) + 无限联动 + 树状显示(多显示方式) +导航输出 +批量移动 正式版1.1
作者:欣然随风(QQ:276624915)
时间:2005-10-28
主要功能:
不使用递归,直接采用order by按级排序;
支持无限分类;
显示类别时可设置从某类别下开始显示,以及设置是否显示子分类;是否带格式输出;
支持从任何目录的导航输出;
批量移动分类,批量移动文章,改写关联属性;
添加文章内容时,要存放亲缘树序列,目的:当选择某一分类查看时,可设置其子分类的文章是否也显示出来。
数据表字段参考:
class_id 类别i++号
class_kiss 亲缘树序列(资源内容指向此作为奴属,格式1:1:1.. 包括自己当前序列)
class_base 根分类序列
class_son 子分类序列
class_tier 分类所在层
class_name 分类名称
其它:
填写好数据库信息类便可直接运行。
--------------------------------------------------------------------------------
类文件:sort_class.php
// 数据库信息类
class db
{
const mysql_hdb = "localhost"; // 数据库主机名
const mysql_udb = "root"; // 数据库用户名
const mysql_pdb = "jjfzzzm"; // 数据库密码
const mysql_ddb = "test"; // 数据库名
static $cn; // 数据库连接ID
const table_sort = "class"; // 数据表名
function __construct()
{
self::$cn = @mysql_connect(self::mysql_hdb,self::mysql_udb,self::mysql_pdb)
or die("数据库连接失败,请联系管理员!");
@mysql_select_db(self::mysql_ddb,self::$cn)
or die("数据库选择失败,请联系管理员!");
@mysql_query("Set Names 'gb2312'");
}
}
// 分类信息类
class sort_info
{
/*
方法用途: 取得某分类的信息
参数设置: $post_kiss 分类亲缘树
返回值: 父分类SQL执行号
*/
static function sortinfo($post_kiss)
{
$sql = "select * from `".db::table_sort."`
where `class_kiss`='$post_kiss'
LIMIT 1";
return $fs = @mysql_query($sql,db::$cn);
}
}
// 分类添加类
class sort_add
{
/*
方法用途: 添加根分类
参数设置: $post_name 分类名称
$post_js 是否写入JS,默认0不写入,否则值为路径/文件名
返回值: 添加成功/失败
*/
function sort_add_base($post_name,$post_js=0)
{
//取根分类class_base的最大值
$sql = "select max(`class_base`) as `class_base` from `".db::table_sort."`";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$nub = ++$tmp['class_base'];
//插入新记录
$sql = "insert into `".db::table_sort."` values('', '$nub', '$nub', '0', '1', '$post_name')";
if(@mysql_query($sql,db::$cn))
$result = TRUE;
else
$result = FALSE;
//插入JS文件
if($result and $post_js!==0)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
return $result;
}
/*
方法用途: 添加子分类
参数设置: $post_name 分类名称
$post_kiss 上一层分类亲缘树
$post_js 是否写入JS,默认0不写入,否则值为路径/文件名
返回值: 添加成功/失败
*/
function sort_add_son($post_kiss,$post_name,$post_js=0)
{
$fs = sort_info::sortinfo($post_kiss); // 查询父分类信息
$tmp = @mysql_fetch_array($fs);
$class_base = $tmp['class_base']; //取得根分类
$class_tier = ++$tmp['class_tier']; //取得当前分类所处层号
$sql = "select max(`class_son`) as `class_son`
from `".db::table_sort."`
where `class_kiss` LIKE '$post_kiss%' AND `class_tier`='$class_tier'";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$class_son = ++$tmp['class_son']; //取得当前分类在子层的排列序号
$post_kiss .=":".$class_son; //取得当前分类的亲缘树序列
//插入新记录
$sql = "insert into `".db::table_sort."`
values('', '$post_kiss', '$class_base', '$class_son', '$class_tier', '$post_name')";
if(@mysql_query($sql,db::$cn))
$result = TRUE;
else
$result = FALSE;
//插入JS文件
if($result and $post_js!==0)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
return $result;
}
}
// 分类编辑类
class sort_ovr
{
/*
方法用途: 更新分类名称/批量移动目录(连带移动子目录)
参数设置: $post_kiss1 提交的该分类亲缘树
$post_kiss2 提交的目标亲缘树(不移动分类则默认FALSE,移动到根值为字符串“base”)
$post_name 提交的分类名(不更改则默认FALSE)
$post_js 更新JS菜单 值为路径/文件名
返回值: 无
*/
public $post_kiss1; // 当前目录的亲缘树
public $post_kiss3; // 移至新位置的亲缘树
public $post_base; // 移至新位置的根
public $post_tier; // 移至新位置层(差)
public $off = 0; // 顺序执行操作开关
public $len; // 当前亲缘树长度
function sortovr($post_kiss1 , $post_kiss2=FALSE , $post_name=FALSE , $post_js)
{
$this->len = strlen($post_kiss1);
$this->post_kiss1 = $post_kiss1;
if($post_name !== FALSE)
{
$sql = "UPDATE ".db::table_sort." SET `class_name`='$post_name' WHERE `class_kiss`='$post_kiss1' LIMIT 1";
if(@mysql_query($sql,db::$cn))
{
$this->off = 1;
echo "分类名编辑成功!";
}
else
echo "分类名编辑失败!";
}
if($post_kiss2 !== FALSE)
{
$fs = sort_info::sortinfo($post_kiss1); // 查询当前分类信息
$tmp = @mysql_fetch_array($fs);
$tier= $tmp['class_tier']; // 当前层号
// 移动到根时的处理
if($post_kiss2 == "base")
{
$sql = "select max(`class_base`) as `class_base` from `".db::table_sort."`";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$this->post_base = ++$tmp['class_base']; //最终根分类号
$this->post_kiss3 = $tmp['class_base']; //最终亲缘树
$class_tier = 1; //最终层号
$class_son = 0; //最终子类排序号
}
// 不为根的处理
else
{
$fs = sort_info::sortinfo($post_kiss2); // 查询目标分类信息
$tmp = @mysql_fetch_array($fs);
$this->post_base = $tmp['class_base']; //最终根分类号
$class_tier = ++$tmp['class_tier']; //最终层号
$sql = "select max(`class_son`) as `class_son`
from `".db::table_sort."`
where `class_kiss` LIKE '$post_kiss2%' AND `class_tier`='$class_tier'";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$class_son = ++$tmp['class_son']; //最终子类排序号
$this->post_kiss3 = $post_kiss2.":".$class_son; //最终亲缘树
}
$this->post_tier = $class_tier - $tier; //层差值
// 移动当前目录
$sql = "UPDATE ".db::table_sort." SET
`class_kiss`='$this->post_kiss3',
`class_base`='$this->post_base',
`class_son`='$class_son',
`class_tier`='$class_tier'
WHERE `class_kiss` = '$post_kiss1' LIMIT 1";
if(@mysql_query($sql,db::$cn))
{
$this->off = 1;
echo "目录移动成功!";
}
else
echo "目录移动失败!";
// 移动所有受影响子目录
if($this->off == 1)
{
$sql = "UPDATE ".db::table_sort." SET
`class_kiss`=INSERT(`class_kiss`,1,$this->len,'$this->post_kiss3'),
`class_base`='$this->post_base',
`class_tier`=`class_tier`+'$this->post_tier'
WHERE `class_kiss` LIKE '$post_kiss1%'";
if(@mysql_query($sql,db::$cn))
echo "子分类移动成功!";
else
{
$this->off = 0;
echo "子分类移动失败!";
}
}
}
// 更新JS文件
if($this->off == 1)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
}
/*
方法用途: 移动所有关联资源内容的目录指向(如内容表的记录对奴属目录的指向)
参数设置: $name_table 待修改的表名
$name_sort 待修改的存储分类亲缘树的字段名
返回值: 无
*/
function textovr($name_table,$name_sort)
{
if($this->off == 1)
{
$name_table = "`".$name_table."`";
$name_sort = "`".$name_sort."`";
$sql = "UPDATE $name_table SET
$name_sort=INSERT($name_sort,1,$this->len,'$this->post_kiss3')
WHERE $name_sort LIKE '$this->post_kiss1%'";
if(@mysql_query($sql,db::$cn))
echo "资源目录指向移动成功!";
else
echo "资源目录指向移动失败!";
}
}
}
// 分类显示类
class sort_show
{
/*
方法用途: 获取分类信息执行号
参数设置: $post_kiss 设置从某分类下开始显示(传入值应为上层分类的亲缘树序列),默认0为从根开始显示
$post_wise 设置显示方式:1为显示该类的所有子分类,0为只显示当前层次的分类
返回值: sql执行号
*/
public $sqldata;
public $class_tier=1; // 当前分类层号,用于格式输出时减去空格,1为减根
function __construct($post_kiss=0,$post_wise=1)
{
if($post_kiss>0)
{
$fs = sort_info::sortinfo($post_kiss); // 取得父分类信息
$tmp = @mysql_fetch_array($fs);
$this->class_tier = ++$tmp['class_tier']; // 取得该分类的层号
$post_kiss = "`class_kiss` LIKE '$class_kiss%'";
if($post_wise==0)
$post_wise="'$this->class_tier' = `class_tier`";
else
$post_wise=" `class_tier` >= '$this->class_tier'";
}
else
{
$post_kiss=1;
if($post_wise==0) $post_wise="`class_tier` = '1'";
}
$sql = "select * from `".db::table_sort."`
where $post_kiss and $post_wise
order by `class_base` asc, `class_kiss` asc, `class_son` asc";
$this->sqldata = @mysql_query($sql,db::$cn);
}
/*
方法用途: 列表显示分类
参数设置: $type 显示方式(默认0为不带格式输出,要带格式则参数为分级符号,如“└”)
返回值: 无
*/
function show($type)
{
if($type=="0")
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
echo $tmp['class_name']."
";
}
}
else
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
$nub=str_repeat(" ",($tmp['class_tier']-$this->class_tier))."$type"; //使用空格缩进和$type符号产生分级
echo $nub.$tmp['class_name']."
";
}
}
}
/*
方法用途: 生成待写入js文本内容
返回值: 字符串
*/
function sort_js_text()
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
$nub=str_repeat(" ",$tmp['class_tier']); //使用空格缩进
$jsdata .= $nub."[".--$tmp['class_tier'].","".$tmp['class_name']."","".$tmp['class_kiss'].""],".chr(13);
}
$jsdata = substr($jsdata, -strlen($jsdata), -2); //去除最后一个逗号和最后一个换行
return "var arrType=new Array(".chr(13).$jsdata.");";
}
}
// 导航信息类
class sort_boat
{
/*
方法用途: 输出某类别的所有上级目录(导航)
参数设置: $post_kiss 某类亲缘树
返回值: 无
*/
function boat_show($post_kiss)
{
$class_kiss =explode(":",$post_kiss); // 分拆亲缘树序列
$nub = sizeof($class_kiss); // 元素个数
// 取得各层亲缘树序列数组
for($i=0;$i<$nub;$i++)
{
if($i>=1) $kiss_val .= ":";
$kiss_val .= $class_kiss[$i];
$kiss_arr[] = "'".$kiss_val."'=`class_kiss`";
}
// 生成sql查询条件
$kiss_val = implode(" OR ",$kiss_arr);
$sql = "select * from `".db::table_sort."`
where $kiss_val order by `class_tier`";
$fs = @mysql_query($sql,db::$cn);
while($tmp = @mysql_fetch_array($fs))
{
echo " >> ".$tmp['class_name'];
}
}
}
// 写入JS文件类
class sort_js_write
{
/*
方法用途: 写入JS分类数据
参数设置: $fileurl 文件路径/文件名
$filetext 写入内容
返回值: 成功/失败
*/
function writejs($fileurl,$filetext)
{
$no = fopen($fileurl, 'w');
$no = fwrite($no,$filetext);
return ($no)?true:false;
}
}
?>
--------------------------------------------------------------------------------
添加分类演示:add_sort.php
无级分类(无递归) + 树状显示(多显示方式) +导航输出 +批量移动 + 无级联动 演示
include("sort_class.php");
new db;
// ---------- 添加分类调用 ------------
if(isset($_POST["post"]))
{
if($_POST["name"]!="")
{
$add = new sort_add;
if($_POST["js"]==1) $_POST["js"]="sort_type.js"; else $_POST["js"]=0;
if($_POST["in_dId"] == "")
{
//if($add->sort_add_base("根分类名","是否写入JS/0为不写"))
if($add->sort_add_base($_POST["name"],$_POST["js"]))
echo "根分类添加成功";
}
else
{
//if($add->sort_add_son("父目录亲缘树","子分类名","是否写入JS"))
if($add->sort_add_son($_POST["in_dId"],$_POST["name"],$_POST["js"]))
echo "子分类添加成功";
}
}
else
echo "请输入分类名称!";
}
echo "
---------- 导航显示调用 ------------
";
$boat = new sort_boat;
$boat->boat_show("2:1:1:1"); //("某目录亲缘树,如:1:3:22:44");
echo "
---------- 显示分类调用 ------------
";
$show = new sort_show(0,1); //(某分类的亲缘树/0为根,显示包含子类1/显示当前层分类0)
$show->show("└ "); //(分类前缀的符号,如不使用格式,则设置为0)
?>
--------------------------------------------------------------------------------
编辑分类演示:ovr_sort.php
无级分类(无递归) + 树状显示(多显示方式) +导航输出 +批量移动 + 无级联动 演示
include("sort_class.php");
new db;
// ---------- 编辑分类调用 ------------
if(isset($_POST["post"]))
{
if($_POST["in_dId"]!="")
{
if($_POST["name"]=="") $_POST["name"]=FALSE;
if($_POST["no"]==1)
{
if($_POST["in_dId1"]=="") $_POST["in_dId1"]="base";
}
else
$_POST["in_dId1"]=FALSE;
$ovr = new sort_ovr;
//参数("待修改分类/不更改值为FALSE","新位置/base表根/不更改值为FALSE","新类名/不更改值为FALSE","更新JS菜单")
$ovr->sortovr($_POST["in_dId"] , $_POST["in_dId1"] , $_POST["name"] , "sort_type.js");
/*
如果对目录进行了批量移动,不要忘了执行下边这句:转移受影响的内容奴属目录指向。
没有把它直接写到目录移动后就自动执行,是因为有些系统可能不止一个表使用目录库,因此在下边手动指定要改哪些表!
*/
// $ovr->textovr("表1","关联目录字段名");
// $ovr->textovr("表2","关联目录字段名");
// .... 有多少表使用了就执行多少次
}
else
echo "未指定待编辑分类!";
}
echo "
---------- 导航显示调用 ------------
";
$boat = new sort_boat;
$boat->boat_show("2:1:1:1"); //("某目录亲缘树,如:1:3:22:44");
echo "
---------- 显示分类调用 ------------
";
$show = new sort_show(0,1); //(某分类的亲缘树/0为根,显示包含子类1/显示当前层分类0)
$show->show("└ "); //(分类前缀的符号,如不使用格式,则设置为0)
?>
不使用递归,直接采用order by按级排序;
支持无限分类;
显示类别时可设置从某类别下开始显示,以及设置是否显示子分类;是否带格式输出;
支持从任何目录的导航输出;
批量移动分类,批量移动文章,改写关联属性;
添加文章内容时,要存放亲缘树序列,目的:当选择某一分类查看时,可设置其子分类的文章是否也显示出来。
程序:无限分类(无递归) + 无限联动 + 树状显示(多显示方式) +导航输出 +批量移动 正式版1.1
作者:欣然随风(QQ:276624915)
时间:2005-10-28
主要功能:
不使用递归,直接采用order by按级排序;
支持无限分类;
显示类别时可设置从某类别下开始显示,以及设置是否显示子分类;是否带格式输出;
支持从任何目录的导航输出;
批量移动分类,批量移动文章,改写关联属性;
添加文章内容时,要存放亲缘树序列,目的:当选择某一分类查看时,可设置其子分类的文章是否也显示出来。
数据表字段参考:
class_id 类别i++号
class_kiss 亲缘树序列(资源内容指向此作为奴属,格式1:1:1.. 包括自己当前序列)
class_base 根分类序列
class_son 子分类序列
class_tier 分类所在层
class_name 分类名称
其它:
填写好数据库信息类便可直接运行。
--------------------------------------------------------------------------------
类文件:sort_class.php
// 数据库信息类
class db
{
const mysql_hdb = "localhost"; // 数据库主机名
const mysql_udb = "root"; // 数据库用户名
const mysql_pdb = "jjfzzzm"; // 数据库密码
const mysql_ddb = "test"; // 数据库名
static $cn; // 数据库连接ID
const table_sort = "class"; // 数据表名
function __construct()
{
self::$cn = @mysql_connect(self::mysql_hdb,self::mysql_udb,self::mysql_pdb)
or die("数据库连接失败,请联系管理员!");
@mysql_select_db(self::mysql_ddb,self::$cn)
or die("数据库选择失败,请联系管理员!");
@mysql_query("Set Names 'gb2312'");
}
}
// 分类信息类
class sort_info
{
/*
方法用途: 取得某分类的信息
参数设置: $post_kiss 分类亲缘树
返回值: 父分类SQL执行号
*/
static function sortinfo($post_kiss)
{
$sql = "select * from `".db::table_sort."`
where `class_kiss`='$post_kiss'
LIMIT 1";
return $fs = @mysql_query($sql,db::$cn);
}
}
// 分类添加类
class sort_add
{
/*
方法用途: 添加根分类
参数设置: $post_name 分类名称
$post_js 是否写入JS,默认0不写入,否则值为路径/文件名
返回值: 添加成功/失败
*/
function sort_add_base($post_name,$post_js=0)
{
//取根分类class_base的最大值
$sql = "select max(`class_base`) as `class_base` from `".db::table_sort."`";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$nub = ++$tmp['class_base'];
//插入新记录
$sql = "insert into `".db::table_sort."` values('', '$nub', '$nub', '0', '1', '$post_name')";
if(@mysql_query($sql,db::$cn))
$result = TRUE;
else
$result = FALSE;
//插入JS文件
if($result and $post_js!==0)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
return $result;
}
/*
方法用途: 添加子分类
参数设置: $post_name 分类名称
$post_kiss 上一层分类亲缘树
$post_js 是否写入JS,默认0不写入,否则值为路径/文件名
返回值: 添加成功/失败
*/
function sort_add_son($post_kiss,$post_name,$post_js=0)
{
$fs = sort_info::sortinfo($post_kiss); // 查询父分类信息
$tmp = @mysql_fetch_array($fs);
$class_base = $tmp['class_base']; //取得根分类
$class_tier = ++$tmp['class_tier']; //取得当前分类所处层号
$sql = "select max(`class_son`) as `class_son`
from `".db::table_sort."`
where `class_kiss` LIKE '$post_kiss%' AND `class_tier`='$class_tier'";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$class_son = ++$tmp['class_son']; //取得当前分类在子层的排列序号
$post_kiss .=":".$class_son; //取得当前分类的亲缘树序列
//插入新记录
$sql = "insert into `".db::table_sort."`
values('', '$post_kiss', '$class_base', '$class_son', '$class_tier', '$post_name')";
if(@mysql_query($sql,db::$cn))
$result = TRUE;
else
$result = FALSE;
//插入JS文件
if($result and $post_js!==0)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
return $result;
}
}
// 分类编辑类
class sort_ovr
{
/*
方法用途: 更新分类名称/批量移动目录(连带移动子目录)
参数设置: $post_kiss1 提交的该分类亲缘树
$post_kiss2 提交的目标亲缘树(不移动分类则默认FALSE,移动到根值为字符串“base”)
$post_name 提交的分类名(不更改则默认FALSE)
$post_js 更新JS菜单 值为路径/文件名
返回值: 无
*/
public $post_kiss1; // 当前目录的亲缘树
public $post_kiss3; // 移至新位置的亲缘树
public $post_base; // 移至新位置的根
public $post_tier; // 移至新位置层(差)
public $off = 0; // 顺序执行操作开关
public $len; // 当前亲缘树长度
function sortovr($post_kiss1 , $post_kiss2=FALSE , $post_name=FALSE , $post_js)
{
$this->len = strlen($post_kiss1);
$this->post_kiss1 = $post_kiss1;
if($post_name !== FALSE)
{
$sql = "UPDATE ".db::table_sort." SET `class_name`='$post_name' WHERE `class_kiss`='$post_kiss1' LIMIT 1";
if(@mysql_query($sql,db::$cn))
{
$this->off = 1;
echo "分类名编辑成功!";
}
else
echo "分类名编辑失败!";
}
if($post_kiss2 !== FALSE)
{
$fs = sort_info::sortinfo($post_kiss1); // 查询当前分类信息
$tmp = @mysql_fetch_array($fs);
$tier= $tmp['class_tier']; // 当前层号
// 移动到根时的处理
if($post_kiss2 == "base")
{
$sql = "select max(`class_base`) as `class_base` from `".db::table_sort."`";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$this->post_base = ++$tmp['class_base']; //最终根分类号
$this->post_kiss3 = $tmp['class_base']; //最终亲缘树
$class_tier = 1; //最终层号
$class_son = 0; //最终子类排序号
}
// 不为根的处理
else
{
$fs = sort_info::sortinfo($post_kiss2); // 查询目标分类信息
$tmp = @mysql_fetch_array($fs);
$this->post_base = $tmp['class_base']; //最终根分类号
$class_tier = ++$tmp['class_tier']; //最终层号
$sql = "select max(`class_son`) as `class_son`
from `".db::table_sort."`
where `class_kiss` LIKE '$post_kiss2%' AND `class_tier`='$class_tier'";
$fs = @mysql_query($sql,db::$cn);
$tmp = @mysql_fetch_array($fs);
$class_son = ++$tmp['class_son']; //最终子类排序号
$this->post_kiss3 = $post_kiss2.":".$class_son; //最终亲缘树
}
$this->post_tier = $class_tier - $tier; //层差值
// 移动当前目录
$sql = "UPDATE ".db::table_sort." SET
`class_kiss`='$this->post_kiss3',
`class_base`='$this->post_base',
`class_son`='$class_son',
`class_tier`='$class_tier'
WHERE `class_kiss` = '$post_kiss1' LIMIT 1";
if(@mysql_query($sql,db::$cn))
{
$this->off = 1;
echo "目录移动成功!";
}
else
echo "目录移动失败!";
// 移动所有受影响子目录
if($this->off == 1)
{
$sql = "UPDATE ".db::table_sort." SET
`class_kiss`=INSERT(`class_kiss`,1,$this->len,'$this->post_kiss3'),
`class_base`='$this->post_base',
`class_tier`=`class_tier`+'$this->post_tier'
WHERE `class_kiss` LIKE '$post_kiss1%'";
if(@mysql_query($sql,db::$cn))
echo "子分类移动成功!";
else
{
$this->off = 0;
echo "子分类移动失败!";
}
}
}
// 更新JS文件
if($this->off == 1)
{
$js = new sort_show;
$jsdata = $js->sort_js_text();
if(sort_js_write::writejs($post_js,$jsdata))
echo "js写入成功!";
else
echo "js写入失败!";
}
}
/*
方法用途: 移动所有关联资源内容的目录指向(如内容表的记录对奴属目录的指向)
参数设置: $name_table 待修改的表名
$name_sort 待修改的存储分类亲缘树的字段名
返回值: 无
*/
function textovr($name_table,$name_sort)
{
if($this->off == 1)
{
$name_table = "`".$name_table."`";
$name_sort = "`".$name_sort."`";
$sql = "UPDATE $name_table SET
$name_sort=INSERT($name_sort,1,$this->len,'$this->post_kiss3')
WHERE $name_sort LIKE '$this->post_kiss1%'";
if(@mysql_query($sql,db::$cn))
echo "资源目录指向移动成功!";
else
echo "资源目录指向移动失败!";
}
}
}
// 分类显示类
class sort_show
{
/*
方法用途: 获取分类信息执行号
参数设置: $post_kiss 设置从某分类下开始显示(传入值应为上层分类的亲缘树序列),默认0为从根开始显示
$post_wise 设置显示方式:1为显示该类的所有子分类,0为只显示当前层次的分类
返回值: sql执行号
*/
public $sqldata;
public $class_tier=1; // 当前分类层号,用于格式输出时减去空格,1为减根
function __construct($post_kiss=0,$post_wise=1)
{
if($post_kiss>0)
{
$fs = sort_info::sortinfo($post_kiss); // 取得父分类信息
$tmp = @mysql_fetch_array($fs);
$this->class_tier = ++$tmp['class_tier']; // 取得该分类的层号
$post_kiss = "`class_kiss` LIKE '$class_kiss%'";
if($post_wise==0)
$post_wise="'$this->class_tier' = `class_tier`";
else
$post_wise=" `class_tier` >= '$this->class_tier'";
}
else
{
$post_kiss=1;
if($post_wise==0) $post_wise="`class_tier` = '1'";
}
$sql = "select * from `".db::table_sort."`
where $post_kiss and $post_wise
order by `class_base` asc, `class_kiss` asc, `class_son` asc";
$this->sqldata = @mysql_query($sql,db::$cn);
}
/*
方法用途: 列表显示分类
参数设置: $type 显示方式(默认0为不带格式输出,要带格式则参数为分级符号,如“└”)
返回值: 无
*/
function show($type)
{
if($type=="0")
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
echo $tmp['class_name']."
";
}
}
else
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
$nub=str_repeat(" ",($tmp['class_tier']-$this->class_tier))."$type"; //使用空格缩进和$type符号产生分级
echo $nub.$tmp['class_name']."
";
}
}
}
/*
方法用途: 生成待写入js文本内容
返回值: 字符串
*/
function sort_js_text()
{
while($tmp = @mysql_fetch_array($this->sqldata))
{
$nub=str_repeat(" ",$tmp['class_tier']); //使用空格缩进
$jsdata .= $nub."[".--$tmp['class_tier'].","".$tmp['class_name']."","".$tmp['class_kiss'].""],".chr(13);
}
$jsdata = substr($jsdata, -strlen($jsdata), -2); //去除最后一个逗号和最后一个换行
return "var arrType=new Array(".chr(13).$jsdata.");";
}
}
// 导航信息类
class sort_boat
{
/*
方法用途: 输出某类别的所有上级目录(导航)
参数设置: $post_kiss 某类亲缘树
返回值: 无
*/
function boat_show($post_kiss)
{
$class_kiss =explode(":",$post_kiss); // 分拆亲缘树序列
$nub = sizeof($class_kiss); // 元素个数
// 取得各层亲缘树序列数组
for($i=0;$i<$nub;$i++)
{
if($i>=1) $kiss_val .= ":";
$kiss_val .= $class_kiss[$i];
$kiss_arr[] = "'".$kiss_val."'=`class_kiss`";
}
// 生成sql查询条件
$kiss_val = implode(" OR ",$kiss_arr);
$sql = "select * from `".db::table_sort."`
where $kiss_val order by `class_tier`";
$fs = @mysql_query($sql,db::$cn);
while($tmp = @mysql_fetch_array($fs))
{
echo " >> ".$tmp['class_name'];
}
}
}
// 写入JS文件类
class sort_js_write
{
/*
方法用途: 写入JS分类数据
参数设置: $fileurl 文件路径/文件名
$filetext 写入内容
返回值: 成功/失败
*/
function writejs($fileurl,$filetext)
{
$no = fopen($fileurl, 'w');
$no = fwrite($no,$filetext);
return ($no)?true:false;
}
}
?>
--------------------------------------------------------------------------------
添加分类演示:add_sort.php
include("sort_class.php");
new db;
// ---------- 添加分类调用 ------------
if(isset($_POST["post"]))
{
if($_POST["name"]!="")
{
$add = new sort_add;
if($_POST["js"]==1) $_POST["js"]="sort_type.js"; else $_POST["js"]=0;
if($_POST["in_dId"] == "")
{
//if($add->sort_add_base("根分类名","是否写入JS/0为不写"))
if($add->sort_add_base($_POST["name"],$_POST["js"]))
echo "根分类添加成功";
}
else
{
//if($add->sort_add_son("父目录亲缘树","子分类名","是否写入JS"))
if($add->sort_add_son($_POST["in_dId"],$_POST["name"],$_POST["js"]))
echo "子分类添加成功";
}
}
else
echo "请输入分类名称!";
}
echo "
---------- 导航显示调用 ------------
";
$boat = new sort_boat;
$boat->boat_show("2:1:1:1"); //("某目录亲缘树,如:1:3:22:44");
echo "
---------- 显示分类调用 ------------
";
$show = new sort_show(0,1); //(某分类的亲缘树/0为根,显示包含子类1/显示当前层分类0)
$show->show("└ "); //(分类前缀的符号,如不使用格式,则设置为0)
?>
--------------------------------------------------------------------------------
编辑分类演示:ovr_sort.php
include("sort_class.php");
new db;
// ---------- 编辑分类调用 ------------
if(isset($_POST["post"]))
{
if($_POST["in_dId"]!="")
{
if($_POST["name"]=="") $_POST["name"]=FALSE;
if($_POST["no"]==1)
{
if($_POST["in_dId1"]=="") $_POST["in_dId1"]="base";
}
else
$_POST["in_dId1"]=FALSE;
$ovr = new sort_ovr;
//参数("待修改分类/不更改值为FALSE","新位置/base表根/不更改值为FALSE","新类名/不更改值为FALSE","更新JS菜单")
$ovr->sortovr($_POST["in_dId"] , $_POST["in_dId1"] , $_POST["name"] , "sort_type.js");
/*
如果对目录进行了批量移动,不要忘了执行下边这句:转移受影响的内容奴属目录指向。
没有把它直接写到目录移动后就自动执行,是因为有些系统可能不止一个表使用目录库,因此在下边手动指定要改哪些表!
*/
// $ovr->textovr("表1","关联目录字段名");
// $ovr->textovr("表2","关联目录字段名");
// .... 有多少表使用了就执行多少次
}
else
echo "未指定待编辑分类!";
}
echo "
---------- 导航显示调用 ------------
";
$boat = new sort_boat;
$boat->boat_show("2:1:1:1"); //("某目录亲缘树,如:1:3:22:44");
echo "
---------- 显示分类调用 ------------
";
$show = new sort_show(0,1); //(某分类的亲缘树/0为根,显示包含子类1/显示当前层分类0)
$show->show("└ "); //(分类前缀的符号,如不使用格式,则设置为0)
?>