author : lzb
2007-02-14
呵呵,马上就要过年了,在这里先给大家拜年了,过年好!
遥想当年,这个小问题也困扰了我很久,现在写出来,跟大家分享一下。 本文主要是讲利用form提交方法实现 PHP-二级联动下拉菜单,当然现在有更好的选择,ajax实现无刷新的联动,不过在这里不做介绍。
原理: 呵呵,其实也谈不上什么原理,就是在用户选择一次的时候是让表单实现一次提交,不过不是提交给别人,而是提交给自己,然后利用PHP处理提交的值(即用户选择的值),根据用户选择的值进行筛选,得到下一个选择下拉框的值,并将其重新显示到页面上。
注意: 可千万不要忘了,提交后显示时要保存住用户选择时的值啊。
实现:
1.如何实现在用户选择的时候实现一次提交呢,而且还是提交给自己呢?
呵呵,这个问题很简单。在用户的选择变化时就会触发select的onchange事件,只要在这个事件里利用2句javascript代码就可以实现提交给自己了。鉴于方便,我将这2句js写在一个函数里面,如下:

//*** 提交给自身


function refresh()...{

//设置表单的action属性,让它指向自己

test.action = location.href;

//提交表单

test.submit();

}
上面代码中的test是包含选择下拉框的表单名,这个你可以根据你的需要,随边设定,当然也可以把它作为函数的参数传进来,我为了省事儿,就直接写死在里面了,呵呵。
2.接下来就是PHP的实现了,我将代码封装在一个类里面,在这里我就不想详细的讲了,只说明一下几个重要函数,然后把代码贴出来,大家自己看看吧。看函数说明时,最好参照代码。
function createList :此函数是用于生成选择下拉框的,此函数功能远不止这个,要仔细的看哦。$selected_value这个参数要重点提一下,他就是用来保存用户选择的值的。
function selectFirst :此函数是通过用户提交的值进行筛选。
function showList :此函数是将下拉框显示到页面,注意:他的参数$arg只能传$_POST哦。
php代码如下:

<?php

//定义默认值

define ("NO_SELECTED","--------");


/***

class : createSelectList

function : 实现二级联动下拉选择框

create : lzb 2007-02-14

**/

class createSelectList{

//第一级下拉框

var $select1;

//第二级下拉框(辽宁)对应的选项

var $select2_LN;

//第二级下拉框(其他)对应的选项

var $select2_OT;


var $list;

/**

function : 构造函数

argument : 无

create : lzb 2007-02-14

*/

function createSelectList(){

//初始化第一级下拉框的值

$this->select1 = array();

$this->select1["title"] = array(

NO_SELECTED,

"辽宁",

"其他");

$this->select1["value"] = array(

"none",

"LN",

"OT");

$this->select1["count"] = 3;


//初始化第二级下拉框的值

//第一级下拉框中“辽宁”选项对应的值

$this->select2_LN = array();

$this->select2_LN["title"] = array(

NO_SELECTED,

"大连",

"沈阳",

"瓦房店");

$this->select2_LN["value"] = array(

"none",

"DL",

"SH",

"WFD");

$this->select2_LN["count"] = 4;


//第一级下拉框中“其他”选项对应的值

$this->select2_OT = array();

$this->select2_OT["title"] = array(

NO_SELECTED,

"美国",

"英国");

$this->select2_OT["value"] = array(

"none",

"USA",

"UK");

$this->select2_OT["count"] = 3;


//

$this->list = array();

}


/**

function : 创建选择下拉框

argument : 1.$name 选择下拉框名称

2.$value

3.$title

4.$count 下拉项的个数

5.$selected_value 当前选中的值

6.$onchange 是否要联动

create : lzb 2007-02-14

*/

function createList($name, $value, $title, $count, $selected_value, $onchange = FALSE) {

if ($onchange == TRUE) {

echo "<select name="{$name}" onChange="refresh()"> ";

} else {

echo "<select name="{$name}"> ";

}

for ($i = 0; $i < $count; $i++) {

if ($value[$i] == $selected_value) {

echo "<option value="{$value[$i]}" selected>{$title[$i]}</option> ";

} else {

echo "<option value="{$value[$i]}">{$title[$i]}</option> ";

}

}

echo "</select> ";

}


/**

function : 根据第一级下拉框进行塞选

argument : $select_value1 第一级选择框选中的值

create : lzb 2007-02-14

*/

function selectFirst($select_value1) {


switch ($select_value1){

case "LN":

$this->list = $this->select2_LN;

break;


case "OT":

$this->list = $this->select2_OT;


break;


case "none":


default:

$this->list["title"] = array(NO_SELECTED);

$this->list["value"] = array("none");

$this->list["count"] = 1;


break;

}


return $this->list;

}


/**

function : 显示二级联动下拉框

argument : $arg 调用时传$_POST

create : lzb 2007-02-14

*/

function showList($arg) {


//设置选择下拉框的默认值

if (!isset ($arg["select1"])) {

$arg["select1"] = "none";

}

if (!isset ($arg["select2"])) {

$arg["select2"] = "none";

}


//创建第一级下拉框

$this->createList("select1", $this->select1["value"], $this->select1["title"], $this->select1["count"],$arg["select1"], true);


//根据第一级下拉框塞选第二级下拉框的值

$list = $this->selectFirst($arg["select1"]);

//创建第二级下拉框

$this->createList("select2", $list["value"], $list["title"], $list["count"],$arg["select2"]);


}

}

?>
测试代码:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> Test </TITLE>

<META NAME="Generator" CONTENT="EditPlus">

<META NAME="Author" CONTENT="lzb">

<META http-equiv="Content-Type" content="text/html; charset=GB2312">


<script language="javascript">

//*** 提交给自身

function refresh(){

test.action = location.href;

test.submit();

}

</script>


</HEAD>


<BODY>

<FORM name="test" method="POST">

<?php

//测试

require_once("createSelectList.php");


$show = new createSelectList();


$show->showList($_POST);

?>

</FORM>

</BODY>

</HTML>
呵呵,本实例是以数组实现的,由于在实现多级联动且下拉框的项过多时,进行筛选,数组有些麻烦,故仅仅作了个2级联动的,日后如果有时间的话,我会继续更新多级联动选择下拉框(以更为常用的数据库代替数组进行实现),当然,原理都是一样的,如果大家有兴趣的话也可以自己试着做做。
以上如果有什么错误的话,还希望大家及时帮我纠正,如果有什么问题,可以随时联系我,^_^