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级联动的,日后如果有时间的话,我会继续更新多级联动选择下拉框(以更为常用的数据库代替数组进行实现),当然,原理都是一样的,如果大家有兴趣的话也可以自己试着做做。
以上如果有什么错误的话,还希望大家及时帮我纠正,如果有什么问题,可以随时联系我,^_^