用 PHPRPC 实现 Ajax 级联下拉菜单
2010-5-13文字大小:大中小
级联下拉菜单就是从一个下拉菜单中选中一项后,相应的另一个下拉菜单的内容会随之改动。
通常来说,最基本的,就是每次选中都提交一次表单,刷新整个页面。这也是用户体验度最差的。
另一种是把所有选项在第一次加载时就所有载入整个页面中的 JavaScript 数组中,然后级联议决 JavaScript 来控制,在整个数据量不大时,这是一个不错的实现无刷新并且高速的要领,但是当整个数据量特别大时,这种要领就会使第一次加载变得特别慢了。
还有就是采用 Ajax 方式,即开始只载入第一层菜单的内容,当用户选中第一层菜单的某项时,再议决 XmlHttpRequest 来获取相应选项所对应的第二层菜单的内容。这种方式成效最好,但是采用传统方式来编写这样的 Ajax 程序代码量会比较多。并且假如设计不好,服务器端返回菜单内容的程序的可复用性也会很差。
但是在本文中你会看到用 PHPRPC 来实现这种 Ajax 成效是多么的基本,并且还会具有特别高的可复用性。
本文以省市两级级联下拉菜单为例,为了举例方便,本文中采用的是 SQLite 数据库,因为这个文件型数据库比较基本 部署,并且查询效率很高(当然建立该数据库的效率不高,但建立仅一次而已,该数据库在该程序中内容是不变的),不过服务器须要安装 SQLite 扩展。
这个数据库中的表只有 2 个,一个 province 表,一个 city 表。province 表中,只有 id 和 name 两个字段,分别是省份编号(主键)和省名。city 表中,有 id、name 和 pid 三个字段,id 是城市编号,name 是城市名,pid 是城市所在省的编号,与 province 表中的省份编号相对应。
建立该数据库的程序这里就不给出来了,它包含在后面提供的实例下载中。
下面来看看建立这个程序的服务器端有多么基本,为了提高可复用性,咱们把服务器端分为了 2 个文件,一个是 function.php,另一个是 rpc.php。function.php 中定义了实际的远程调用函数,但是他们也能够作为服务器端的本地函数调用,你会发觉他们跟服务器端的普通函数没有任何区别:
下载: function.php<?php $sqlite = new SQLiteDatabase('area.db'); function get_province() { global $sqlite; $sql = "select * from province order by id"; return $sqlite->arrayQuery($sql, SQLITE_ASSOC);} function get_city($pid) { global $sqlite; $pid = sqlite_escape_string($pid); $sql = "select * from city where pid = $pid order by id"; return $sqlite->arrayQuery($sql, SQLITE_ASSOC);}?>而 rpc.php 更加基本,它是提供给客户端调用的接口,它只有 3 行语句: