和以前网上见过的那个程序比较起来最大的改进就是假如分类中的某个分支比其他分支的层数要少,比如只有S1,S2上有数据,S3上没有数据,则S3的下拉列表框里显示S2里当前选择的数据;如果只有S1有数据,S2、S3都没有数据,则S2、S3上都显示S1当前所选择的数据,这样在提交的时候都以S3的数据为准,这样提交以后就方便处理多了。而且下拉框的value里面存的是pcode,可以体现出完整的一个层次关系,提交以后怎么处理就随便了。4.PHP自动生成JS数组上面那个js数组比较复杂,如果有很多数据,手写是不现实的,可以写一个程序从数据库中读取,然后自动生成://生成js菜单数组(递归)
function make_js_menu_array($pid, $state=1)
{
  global $dbr;
  $swhere = $state ? " AND state=1" : "";
  $sql = "SELECT id,pcode,catename FROM category WHERE pid=" . $pid . $swhere;
  //echo $sql;
  $rs = mysql_query($sql, $dbr);
  $rs_num = mysql_num_rows($rs);
  if ($rs_num)
  {
    $menu = '';
    for($i=0; $i<$rs_num ;$i++)
    {
      $row = mysql_fetch_array($rs);
      $new_pid = $row['id'];
      $pcode = $row['pcode'];
      $catename = $row['catename'];
      //echo $pid.'<br>';      $sub_menu = make_js_menu_array($new_pid);
      $douhao = ($i==($rs_num-1)) ? "" : ",";      if ($sub_menu)
      {
        $menu = $menu . "'" . $catename . "','" . $pcode . "',\n[" . $sub_menu . "]" . $douhao . "\n";
      }
      else
      {
        $menu = $menu . "'" . $catename . "','" . $pcode . "',null" . $douhao . "\n";
      }
      //echo $menu;
    }
  }
  else
  {
    return false;
  }
  return $menu;
}
 如果是访问量比较大的网站,每次都从数据库中读取分类然后生成数组是不现实的,有两种解决办法:1.被动缓存:比如PEAR里面的Cache_Lite类,可以每隔一定时间读取数据库生成缓存,有一定延时,对时间精度要求不高的话比较适用。2.主动缓存:由管理员手动触发,生成js文件。如果前端有多台服务器,需要用rsync往各个前端同步。
5.如何让级联下拉菜单默认显示某一分类?这个主要是在修改记录(比如培训课程)的时候使用,因为修改的界面打开以后,级联菜单要默认显示到这条记录所属的分类上。可以用一个js函数来实现://显示当前的分类
selected_menu(document.getElementById('S1'),0,'<?php echo $rs["cate1"];?>');
selected_menu(document.getElementById('S2'),1,"<?php echo $rs['cate2'];?>");
selected_menu(document.getElementById('S3'),2,"<?php echo $rs['cate3'];?>"); function selected_menu(obj,level,sel_value)
{
  len=obj.length;
  for(i=0;i<len;i++)
  {
    if(obj.options[i].value==sel_value)
    {
      obj.options[i].selected=true;
      multiLevelMenu(level+1);
      break;
    }
  }
}
 这里要注意selected_menu()函数的第三个参数是当前记录的分类,这个要从数据库中获得,所以要用php来echo出来。假如记录中存的也是分类的pcode,可以先把pcode以下划线分割成数组,然后一一提取。6.如何按分类查询记录?我在记录表(比如培训课程表)里面存的是分类的pcode字段,这样可以比较容易的知道课程所属的层次关系,比如查询所有“认证考试”的课程,就是 category like '1_%',查询“财务会计类”的课程,就是category like '1_5_%',查询“调查分析师”的课程,就是 category like '1_4_15_%' ......category字段要建索引,因为开头没有“% ”,索引还是能起作用的。当然查询应该都建缓存,使用 Cache_Lite是很好的选择。 全文完。

解决方案 »

  1.   

    这里显示不了表格,原文可以看这里http://wanghui.name/detail.asp?ID=653
      

  2.   

    这样的情况最好也考虑一下
    1.
    有的时候,
    同一页面既需要国家-省份-城市选择,
    也需要公司-部门-员工答:这种情况可以解决,只要变量名不冲突就可以了var arrSel1 = ['state','province','city'];
    var arrSel1 = ['company','department','staff'];var menu1 = [国家-省份-城市的数组];
    var menu2 = [公司-部门-员工的数组];函数也要有两个
    multiLevelMenu1() 和 multiLevelMenu2()2.
    如果上次选了中国-陕西-西安,并存盘
    第二次打开时也得有这些值答:这个问题已经解决了,请看:5.如何让级联下拉菜单默认显示某一分类?
    页面打开的时候调用这三个函数就可以了:
    selected_menu(document.getElementById('S1'),0,'<?php echo $rs["cate1"];?>');
    selected_menu(document.getElementById('S2'),1,"<?php echo $rs['cate2'];?>");
    selected_menu(document.getElementById('S3'),2,"<?php echo $rs['cate3'];?>"); 其中第三个参数是从数据库中得到的当前记录所属的类别,要从服务器端获得
      

  3.   

    联动,应该是select是动态生成的