文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>无限分类 + 树状显示 + 无限联动

无限分类 + 树状显示 + 无限联动

时间:2006-01-23  来源:wleige

无级分类+树状显示+无级联动 正式版1.0
请版主将精华区中我之前发布的这个分类删除,那个代码中有个小BUG!
/*--------------------------------------------------------------------------------
程序:无限分类 + 树状显示 + 无限联动
作者:欣然随风(QQ:276624915)
时间:2005-10-28
主要功能:
不使用递归,直接采用order by按级排序;
支持无限分类;
显示类别时可设置从某类别下开始显示,以及设置是否显示子分类;
添加文章内容时,要存放亲缘树序列,目的:当选择某一分类查看时,可设置其子分类的文章是否也显示出来。
数据表字段参考:
class_id 类别i++号
class_kiss 亲缘树序列(资源内容指向此作为奴属,格式1:1:1.. 包括自己当前序列)
class_base 根分类序列
class_son 子分类序列
class_tier 分类所在层
class_name 分类名称
其它:
填写好数据库信息类便可直接运行。


--
-- 表的结构 `class`
--
CREATE TABLE `class` (
`class_id` int(10) unsigned NOT NULL auto_increment,
`class_kiss` char(50) NOT NULL default '',
`class_base` tinyint(3) unsigned NOT NULL default '0',
`class_son` tinyint(3) unsigned NOT NULL default '0',
`class_tier` char(2) NOT NULL default '',
`class_name` char(20) NOT NULL default '',
PRIMARY KEY (`class_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=13 ;
--
-- 导出表中的数据 `class`
--
INSERT INTO `class` VALUES (1, '1', 1, 0, '1', '根分类1');
INSERT INTO `class` VALUES (7, '4', 4, 0, '1', '根分类4');
INSERT INTO `class` VALUES (6, '3', 3, 0, '1', '根分类3');
INSERT INTO `class` VALUES (5, '2', 2, 0, '1', '根分类2');
INSERT INTO `class` VALUES (8, '1:1', 1, 1, '2', '根1的子1');
INSERT INTO `class` VALUES (9, '1:1:1', 1, 1, '3', '根1的子1子1');
INSERT INTO `class` VALUES (10, '1:1:1:1', 1, 1, '4', '子子子');
INSERT INTO `class` VALUES (11, '1:1:1:1:1', 1, 1, '5', '子子子子');
INSERT INTO `class` VALUES (12, '1:1:1:1:1:1', 1, 1, '6', '子子子子子');
--------------------------------------------------------------------------------

类文件:class.php
PHP代码:--------------------------------------------------------------------------------
// 数据库信息类
class db
{
    const mysql_hdb    =    "localhost";    // 数据库主机名
    const mysql_udb    =    "root";            // 数据库用户名
    const mysql_pdb    =    "jjfzzzm";        // 数据库密码
    const mysql_ddb    =    "test";            // 数据库名
    static $cn;                            // 数据库连接ID
    const table_class    =    "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 up_info
{
    /*
    方法用途:    取得某分类的信息
    参数设置:    $post_kiss 分类亲缘树
    返回值:    父分类SQL执行号
    */
    static function upinfo($post_kiss)
    {
        $sql =  "select * from `".db::table_class."`
                 where `class_kiss`='$post_kiss'
                 LIMIT 1";
        return $fs  =  @mysql_query($sql,db::$cn);
    }
}

// 分类添加类
class add_class
{
    /*
    方法用途:    添加根分类
    参数设置:    $post_name    分类名称
                $post_js    是否写入JS,默认0不写入,否则值为路径/文件名
    返回值:    添加成功/失败
    */
    function add_class_base($post_name,$post_js=0)
    {
        //取根分类class_base的最大值
        $sql =  "select max(`class_base`) as `class_base` from `".db::table_class."`";
        $fs  =  @mysql_query($sql,db::$cn);
        $tmp =  @mysql_fetch_array($fs);
        $nub =  ++$tmp['class_base'];
        //插入新记录
        $sql =  "insert into `".db::table_class."` 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 show_class;
            $jsdata = $js->js_data();
            if(write_js::writejs($post_js,$jsdata))
                echo "js写入成功!";
            else
                echo "js写入失败!";
        }
        return $result;
    }
    /*
    方法用途:    添加子分类
    参数设置:    $post_name    分类名称
                $post_kiss    上一层分类亲缘树
                $post_js    是否写入JS,默认0不写入,否则值为路径/文件名
    返回值:    添加成功/失败
    */
    function add_class_son($post_kiss,$post_name,$post_js=0)
    {
        $fs  =  up_info::upinfo($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_class."`
                 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_class."`
                 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 show_class;
            $jsdata = $js->js_data();
            if(write_js::writejs($post_js,$jsdata))
                echo "js写入成功!";
            else
                echo "js写入失败!";
        }
        return $result;
    }
}
// 分类显示类
class show_class
{
    /*
    方法用途:    获取分类信息执行号
    参数设置:    $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  =  up_info::upinfo($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_class."`
                 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 js_data()
    {
        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 boat_info
{
    /*
    方法用途:    输出某类别的所有上级目录(导航)
    参数设置:    $post_kiss 某类亲缘树
    返回值:    无
    */
    function boat_show($post_kiss)
    {
        $class_kiss =explode(":",$post_kiss);        // 分拆亲缘树序列
        $nub = sizeof($class_kiss);                    // 元素个数
        // 取得各层亲缘树序列数组
        for($i=0;$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_class."`
                 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 write_js
{
    /*
    方法用途:    写入JS分类数据
    参数设置:    $fileurl    文件路径/文件名
                $filetext    写入内容
    返回值:    成功/失败
    */
    function writejs($fileurl,$filetext)
    {
        $no = fopen($fileurl, 'w');
        $no = fwrite($no,$filetext);
        return ($no)?true:false;
    }
}
--------------------------------------------------------------------------------

测试页面:index.php
PHP代码:--------------------------------------------------------------------------------

无级分类+树状显示+无级联动 演示
   
      
        添加分类:(如果选择了写入JS,则会更新级联菜单,但由于浏览器缓存的原因,你要重新开窗口才能看到!)   
      
      
        位置:
  drawSelect(null,"arrType",0,"in_dId","","当前层");        
      
      
        名称:
        
      
      
        
写入到JS
      
      
        
      
   
  
      
//    ---------- 添加分类调用 ------------
if(isset($_POST["post"]))
{
    if($_POST["name"]!="")
    {
            $add = new add_class;
            if($_POST["no"]==1) $_POST["no"]="/type.js"; else $_POST["no"]=0;
            if($_POST["in_dId"] == "")
            {
                //if($add->add_class_base("根分类名","是否写入JS/0为不写"))
                if($add->add_class_base($_POST["name"],$_POST["no"]))
                echo "根分类添加成功";
            }
            else
            {
                //if($add->add_class_son("父目录亲缘树","子分类名","是否写入JS"))
                if($add->add_class_son($_POST["in_dId"],$_POST["name"],$_POST["no"]))
                echo "子分类添加成功";
            }
    }
    else
        echo "请输入分类名称!";
}

echo "
---------- 导航显示调用 ------------
";
    $boat = new boat_info;
    $boat->boat_show("1:1:1");            //("某目录亲缘树,如:1:3:22:44");

echo "
---------- 显示分类调用 ------------
";
    $show = new show_class(0,1);    //(某分类的亲缘树/0为根,显示包含子类1/显示当前层分类0)
    $show->show("└ ");                //(分类前缀的符号,如不使用格式,则设置为0)
   

?>
--------------------------------------------------------------------------------


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载