4.15 PEAR::HTML_AJAX利用Google Maps API实现地图检索系统
Google地图(http://maps.google.com/)经常作为AJAX技术的应用实例被人们列举出来。使用Google地图时,只用移动鼠标,就能自由地改变地图的比例以及位置。而原来旧版的地图软件,在页面不刷新的情况下是不能改变地图上的位置或显示比例的。而且还有显示速度慢,表示的位置不准确等缺点。从这里,我们可以窥探出AJAX技术的威力之处了,Google地图为这种技术的推广做了一个很好的广告。
Google Maps API是从外部应用程序利用Google地图功能的程序库群。本节,将介绍利用Google Maps API显示指定位置的地图,同时也显示该位置详细信息(详细信息与Google地图的功能无关)的应用实例。
关于Google Maps API,超出了本书的范围,此处只会进行一些简要的介绍。具体的使用方法,可以参照Google Maps API的官方网站(http://www.google.com/apis/maps)。
本书要点
一句话概括AJAX(Asynchronous JavaScript And Xml),就是,利用JavaScript进行服务器间的非同期通信,取得的返回结果用动态HTML(Dynamic HTML)显示出来的构架。这里,提到了非同期通信,对应的当然有同期通信。
所谓同期通信,就是一问一答的通信方式,发出请求后,等着服务器返回,到返回结果为止,一直维持着同服务器间的联系。而非同期通信,就是问了以后,不等回答返回,可以接着干其他的事,当然会监视回答返回的状况,在AJAX中,监视到结果返回后,会用动态HTML将结果显示在画面上。仍然有疑问的,可以参考图4-8。
图4-8 普通的Web应用程序与AJAX应用程序的区别
由于采用AJAX技术的应用能提供给使用者,类似于独立应用程序的使用感觉,自从2005年出现以来,在业界迅速地推广开来。但是在导入的过程中,也面临着不少现实的问题。AJAX作为JavaScript的核心技术,实现时必须编写大量的JavaScript代码,随着JavaScript代码量的增加,开发效率与可维护性都会显著地下降,同时也出现了各种浏览器的兼容性问题。现实中,导入AJAX时,不能少了尽量隐藏JavaScript原始代码的程序库或架构(FrameWork)。
在这种背景下出现了PEAR::HTML_AJAX程序库。PEAR::HTML_AJAX是提供客户端与服务器间连接桥梁的程序库。使用PEAR::HTML_AJAX后,不用意识客户端与服务器的差别,可以由客户端的JavaScript脚本调用服务端的PHP类(远程对象)。
PEAR::HTML_AJAX的代理机制如图4-9所示。
图4-9 PEAR::HTML_AJAX的代理机制
在本节的实例中,改变下拉框的选项时,为了从指定的地图数据库中检索数据,需要访问服务器,这里没采用普通的HTTP请求模式,而是采用了AJAX的非同期通信方式。这样选项改变时,不重新刷新页面,平滑地显示出新的地图。
目录结构
数据库的表结构
本例数据库的表结构如表4-12所示。
表4-12 地址信息(gmap)
本例代码
检索表gmap取得所有地名,后面的68行到73行生成下列框时将要用到。
包含使用Google Maps API所需要的脚本。src属性中指定的URL根据用户的使用环境会有所不同,参见后面的补充资料。
包含使用PEAR::HTML_AJAX所必需的JavaScript库。
MyProxy.php是输出JavaScript库的程序。这里加上client=all参数后,可以取得PEAR::HTML_AJAX基本库。
在stub参数中指定想在JavaScritp中调用的服务器端的类名。这里指定为google,将动态生成在Google.class.php中定义的Google类的代理类。
画面初始化处理。
检测浏览器是否能处理Google地图。GBrowserIsCompatible函数返回true时,说明浏览器能处理Google地图。
在<div id=maps>块中显示坐标(139.7,35.6)为中心的,比例为12的地图。这里在地图上追加缩放/方向导航(GLargeMapControl)以及地图句柄(pointer)(GMapTypeControl)。由Gmap2对象来控制地图,addControl方法来追加地图的控制组件。
定义非同期通信发生错误时的处理函数。这里使用HTML_AJAX_Util.varDump方法来将错误信息转换为可显示的字符串。
定义Callback类。Callback类是处理非同期通信返回值的类。Callback类中必须定义与服务器类中同名的方法。
例如对应于在Google类已经定义的search方法,Callback类必须定义同名的search方法。
Callback类中方法的参数是,服务器端返回的结果。此处结果对象中含有name,axisx,axisy纬度坐标,url,description等。
结果非空时,进行地图更新处理。
清空地图上所有的地图句柄(clearOverlays),取得地图的新句柄,由GLatLng对象显示坐标,GMarker对象显示句柄。用map.addOverlay方法在地图上追加句柄,setCenter方法指定地图的中心位置及比例。
根据取得的地名信息生成地图上的弹出框,使用GEvent.addListener来追加按纽事件。语法为:
下拉框改变时的响应函数。
Google是由MyProxy.php生成的代理类(为了连接服务器类的代理类)。代理类进行初始化时的参数为上面定义的Callback类的实例。以后就像在服务器上调用服务器类中的方法一样调用对应的方法——“对象->方法名(参数)”。
根据搜索出的内容构筑地名选择下拉框。
为显示地图而准备的显示域。
search方法是客户端JavaScript通过非同期通信进行调用的方法。非同期通信相关的处理已经在PEAR::HTML_AJAX中包括了,这里只是定义一个普通的方法。
search方法中利用传入的地图ID为条件来检索表gmap,返回name,url.axisx,axisy,description等属性。
StdClass是一个什么内容都没有的空壳类(标准类),在进行参数传递时经常使用StdClass类,检索出的数据将做StdClass类的属性被设置。
返回结果。
使用PEAR::HTML_AJAX时,需要定义继承PEAR::HTML_AJAX提供的HTML_AJAX_Server类的派生类。HTML_AJAX_Server类的派生类中进行面向客户端JavaScript公开的远程对象的相关设定。
initMethods属性为是否由initXXXXX方法进行远程对象初始化的开关。设为False时,将不进行远程对象初始化动作。
定义initXXXX方法进行面向客户端JavaScript公开的远程对象的注册。
这里的initGoogle方法,首先包含进Google.class.php,使用registerClass方法将Google类的实例注册到HTML_AJAX_Server类中。
将HTML_AJAX_Server类的派生类实例化,调用handleRequest方法,这样,HTML_AJAX_Server类的派生类能根据传过来的Query信息(client/sub),对应生成基本JavaScript库或者代理类。
另外,php4CompatCase属性是用来维护PHP4/5的互换性的。输出代理类时,PHP4中会将所有的成员名变换成小写字符,PHP5中不用进行这种变换(否则会出现由于版本的不同,不能正常动作的情况)。而,将php4CompatCase属性设置为TRUE后,无论PHP4/5都将强制地进行小写字母的变换,这样就实现了不依赖与服务器环境的代码。
补充
注意事项
本节中使用的PEAR::HTML_AJAX库,是PEAR提供的库之一,使用前必须进行库的安装。具体的步骤如下。
另外,使用Google Maps API前,必须事先取得识别应用程序的认证关键字。认证关键字可以从Google Maps API的官方网站(http://www.google.com/apis/maps)取得。具体界面如图4-10和图4-11所示。
图4-10 Google代码
图4-11 注册成功
认证关键字取得时,需要指定如(http://localhost)样的具体利用Google Maps API的网站URL。认证关键字就是根据这个URL生成的,这个URL以外的URL将不能使用Google Maps API。请务必注册自己的环境的认证关键字,并将google.php中相关部分替换掉。
知识专栏:编码规则
从系统维护的角度来考虑,编写整洁的代码是非常重要的。怎样才称得上整洁呢?可能初听起来有些茫然吧,其实很简单,就是谁都能读懂的,拥有统一标准的代码。
多个程序员在一起编写代码时,本来就很难保持统一性。就算是同一个人进行代码编写,有时候也会经常出现书写方法的偏差的。
这时候就要涉及“编码规则”这个东西。“编码规则”就是定义在编写代码过程中,必须遵循的最低程度的命名规则,缩进、改行、空格等的追加方式,以及其他做法的规则集合。当然,按照“编码规则”编写出来的代码不一定意味着就是所谓整洁的代码,但最少可以保证不被称为“肮脏”。
在PHP中,公开了关于使用PEAR/Zend Framework的编码规则。平时在编程时不注意编码规则的朋友,可以趁这个机会了解一下PHP编码规则方面的内容。
http://framework.zend.com/manual/zh/coding-standard.html
http://pear.php.net/manual/zh/standards.php
共有条评论 网友评论