PHP-二级联动下拉菜单之Form提交法实现

    技术2022-05-11  62

     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级联动的,日后如果有时间的话,我会继续更新多级联动选择下拉框(以更为常用的数据库代替数组进行实现),当然,原理都是一样的,如果大家有兴趣的话也可以自己试着做做。

    以上如果有什么错误的话,还希望大家及时帮我纠正,如果有什么问题,可以随时联系我,^_^

     

    最新回复(0)