本款php无限分类代码比较完整理包括了数据库是mysql的,有增加、删除、编辑、移动的功能,同时还提供数据库sql表结构.代码如下:
//连接数据库
$link = mysql_connect( 'localhost' , 'root' , '' ) or die (mysql_error());
mysql_select_db( 'class' , $link ) or die (mysql_error());
mysql_query( "set names gbk" );
//无限分类类库
class sortclass{
var $data = array ();
var $child = array (-1=> array ());
var $layer = array (-1=>-1);
var $parent = array ();
var $link ;
var $table ;
function sortclass( $link , $table ){
$this ->setnode(0, -1, '顶极节点' );
$this ->link = $link ;
$this ->table = $table ;
$node = array ();
$results = mysql_query( "select * from $this->table" , $this ->link);
while ( $node = mysql_fetch_array( $results )){
$this ->setnode( $node [ 'id' ], $node [ 'f_id' ], $node [ 'name' ]);
}
}
function setnode ( $id , $parent , $value ){
$parent = $parent ? $parent :0;
$this ->data[ $id ] = $value ;
$this ->child[ $id ] = array ();
$this ->child[ $parent ][] = $id ;
$this ->parent[ $id ] = $parent ;
$this ->layer[ $id ] = !isset( $this ->layer[ $parent ])? 0 : $this ->layer[ $parent ] + 1;
}
function getlist (& $tree , $root = 0){
foreach ( $this ->child[ $root ] as $key => $id ){
$tree [] = $id ;
if ( $this ->child[ $id ]) $this ->getlist( $tree , $id );
}
}
function getvalue ( $id ){ return $this ->data[ $id ];}
function getlayer ( $id , $space = false){
return $space ? str_repeat ( $space , $this ->layer[ $id ]): $this ->layer[ $id ];
}
function getparent ( $id ){ return $this ->parent[ $id ];}
function getparents ( $id ){
while ( $this ->parent[ $id ] != -1){
$id = $parent [ $this ->layer[ $id ]] = $this ->parent[ $id ];
}
ksort( $parent );
reset( $parent );
return $parent ;
}
function getchild ( $id ){ return $this ->child[ $id ];}
function getchilds ( $id = 0){
$child = array ( $id );
$this ->getlist( $child , $id );
return $child ;
}
function addnode( $name , $pid ){
//echo "insert into $this->table (`f_id`,`name`) values ('$pid','$name')";exit;
mysql_query( "insert into $this->table (`f_id`,`name`) values ('$pid','$name')" , $this ->link);
}
function modnode( $cid , $newname ){
mysql_query( "update $this->table set `name`='$newname' where `id` = $cid" , $this ->link);
}
function delnode( $cid ){
$allchilds = $this ->getchilds( $cid );
$sql = '' ;
if ( empty empty ( $allchilds )){
$sql = "delete from $this->table where `id` = $cid" ;
} else {
$sql = 'delete from ' . $this ->table. ' where `id` in (' .implode( ',' , $allchilds ). ',' . $cid . ')' ;
}
mysql_query( $sql , $this ->link);
}
function movenode( $cid , $topid ){
mysql_query( "update $this->table set `f_id`=$topid where `id` = $cid" , $this ->link);
}
}
//函数
function back(){
echo '<script language="网页特效">window.location.href="news.class.php?"+new date().gettime();</script>' ;
exit ;
}
//生成select
function makeselect( $array , $formname ){
global $tree ;
$select = '<select name="' . $formname . '">' ;
foreach ( $array as $id ){
$select .= '<option value="' . $id . '">' . $tree ->getlayer( $id , '|-' ). $tree ->getvalue( $id ). "</option>" ;
}
return $select . '</select>' ;
}
$tree = new sortclass( $link , '`p_newsclass`' );
$op = ! empty empty ( $_post [ 'op' ]) ? $_post [ 'op' ] : $_get [ 'op' ];
if (! empty empty ( $op )){
if ( $op == 'add' ){
$tree ->addnode( $_post [ 'cname' ], $_post [ 'pid' ]);
back();
}
if ( $op == 'mod' ){
$tree ->modnode( $_post [ 'cid' ], $_post [ 'cname' ]);
back();
}
if ( $op == 'del' ){
$tree ->delnode( $_get [ 'cid' ]);
back();
}
if ( $op == 'move' ){
$tree ->movenode( $_post [ 'who' ], $_post [ 'to' ]);
back(); //开源代码phpfensi.com
}
}
$category = $tree ->getchilds();
?>
前台调用实例代码如下:
<style type= "text/css" >
body{font-size:12px;}
ul{list-style:none;}
a{cursor:pointer;}
</style>
<script language= "javascript" >
function $(e){ return document.getelementbyid(e);}
function mod(cid){
$( 'cid' ).value=cid;
$( 'op' ).value= 'mod' ;
$( 'name' ).style.border= '1px solid red' ;
}
</script>
<form action= "" method= "post" >
名称:<input type= "text" id= "name" name= "cname" /> 添加到:<?=makeselect( $category , 'pid' )?><br />
<input type= "hidden" id= "op" name= "op" value= "add" />
<input type= "hidden" id= "cid" name= "cid" />
<input type= "submit" value= "submit" />
</form>
<h3>移动分类</h3>
<form action= "" method= "post" >
<?=makeselect( $category , 'who' )?> gt;移动到:<?=makeselect( $category , 'to' )?>
<input type= "hidden" id= "op" name= "op" value= "move" />
<input type= "submit" value= "submit" />
</form>
<ul>
<?php
foreach ( $category as $id ){
echo '<li>' . $tree ->getlayer( $id , '|- ' ). $tree ->getvalue( $id ). ' <a href="time.php?op=del&cid=' . $id . '">del</a> <a onclick="mod(' . $id . ')">edit</a> </li>' ;
}
?>
</ul>
用phpmyadmin导入此数据库就ok了,实例代码如下:
— phpmyadmin sql dump
— version 3.2.4
— http://www.phpfensi.com
—
— 主机: localhost
— 生成日期: 2010 年 07 月 02 日 03:02
— 服务器版本: 5.1.41
— php 版本: 5.3.1
set sql_mode= "no_auto_value_on_zero" ;
/*!40101 set @old_character_set_client=@@character_set_client */;
/*!40101 set @old_character_set_results=@@character_set_results */;
/*!40101 set @old_collation_connection=@@collation_connection */;
/*!40101 set names utf8 */;
—
— 数据库: `class`
—
— ——————————————————–
—
— 表的结构 `p_newsclass`
—
create table if not exists `p_newsclass` (
`id` int (7) not null auto_increment,
`f_id` int (7) not null ,
` name ` varchar (255) not null ,
primary key (`id`)
) engine=innodb default charset=utf8 auto_increment=10 ;
—
— 转存表中的数据 `p_newsclass`
—
insert into `p_newsclass` (`id`, `f_id`, ` name `) values
(3, 0, '中国' ),
(4, 3, '福建' ),
(5, 4, '龙岩市' ),
(7, 4, '厦门市' ),
(9, 5, '漳平市' );
/*!40101 set character_set_client=@old_character_set_client */;
/*!40101 set character_set_results=@old_character_set_results */;
/*!40101 set collation_connection=@old_collation_connection */;