首页 理论教育PHPMVC开发实战:ajaxReturn方法返回XML

PHPMVC开发实战:ajaxReturn方法返回XML

【摘要】:ajaxReturn方法返回结果受DEFAULT_AJAX_RETURN配置项影响,默认值为json,可选的值有json、eval及xml。表9-1 ajaxReturn方法参数Model类中的select或find方法返回的数组原本就是关联数组数据,所以ajaxReturn能够很好地将结果转换为XML文档,如以下代码所示。

DOM可以创建并生成静态的XML文件,但在实际应用开发中通常使用动态生成。动态生成可以实时地从数据库中获取数据,并以标准的XML格式输出,第三方应用(如PHP应用、手机终端应用)调用动态生成的XML文件能够实现远程与本地的高效互动。ThinkPHP内置了许多生成XML数据的类库,常用的有Action控制器类中的ajaxReturn方法、display方法以及xml_encode扩展函数。下面分别介绍。

1.ajaxReturn方法

ajaxReturn方法是Action控制器基类中用于返回数据的方法,该方法可以返回Json、EVAL序列化数据以及通用的XML标记数据。ajaxReturn通常结合Ajax异步请求来使用,但也可以用于设计开放API(网站接口)。

ajaxReturn生成XML是非常简单的,开发人员不需要定义文档节点,甚至不需要了解XML文档结构,因为ajaxReturn使用关联数组生成XML文档模型。也就是说普通数组中的键名(key)对应XML文档中的节点名称;键值(value)对应节点文本。假设PHP数组代码如下所示。

978-7-111-42852-7-Part02-391.jpg

使用ajaxReturn转换后,将得到标准的XML格式数据,如以下代码所示。

978-7-111-42852-7-Part02-392.jpg

ajaxReturn方法返回结果受DEFAULT_AJAX_RETURN配置项影响,默认值为json,可选的值有json、eval及xml。当然也可以指定ajaxReturn方法第4个参数值为xml,强制输出xml数据。ajaxRetun方法共支持4个参数,表现形式为ajaxReturn($data,$info,$status,$type)。改变参数值将直接影响输出结果,如表9-1所示。

表9-1 ajaxReturn方法参数

978-7-111-42852-7-Part02-393.jpg

Model类中的select或find方法返回的数组原本就是关联数组数据,所以ajaxReturn能够很好地将结果转换为XML文档,如以下代码所示。

978-7-111-42852-7-Part02-394.jpg

ajaxReturn最终会将数据表字段转换为XML子节点名称,字段值将转换为节点文本,如图9-1所示。

978-7-111-42852-7-Part02-395.jpg

图9-1 ajaxReturn生成XML结果

需要注意的是ajaxReturn生成的XML标签名称是受自定义模型字段映射($_map)影响的(可参考本书第7章7.1节)。

2.display方法

display方法是控制器与视图引擎进行交互的入口,系统内置的视图引擎默认将模板渲染为HTML,通过display方法第3个参数可以改变渲染方式。display方法共支持3个参数,表现形式为display($templateFile,$charset,$contentType),参数值的设定如表9-2所示。

表9-2 dsplay方法参数

978-7-111-42852-7-Part02-396.jpg

对于XML数据而言,只需要更改contentType参数值即可,但该参数值只能对当前的输出产生作用,如果需要应用到整个项目,开发人员还可以通过修改TMPL_CONTENT_TYPE配置项值为xml,使得项目下的所有display输出变为XML。(www.chuimin.cn)

需要说明的是,虽然通过修改配置项contentType可实现XML输出,但模板文件还必须使用HTML来描述,如以下代码所示。

978-7-111-42852-7-Part02-397.jpg

如上述代码所示,index_xml的真实文件名为index_xml.html,所以开发人员需要在tpl/Index/目录下创建该文件,代码如下所示。

978-7-111-42852-7-Part02-398.jpg

可以看到,使用display输出XML与默认的HTML并没有区别,模板引擎中的所有标签、语法、变量等都可以使用。这就给XML开发带来非常灵活的特性,例如可以方便遍历数据、设置自定义标签、自定义属性等。最终的运行效果如图9-2所示。

978-7-111-42852-7-Part02-399.jpg

图9-2 display输出xml

需要注意的是,由于XML对标记的处理比HTML要严格,所以在使用display输出XML时,不能有其他的非XML数据被输出(例如在动作或模板中输出调试信息、性能信息或者开启LAYOUT_ON布局选项等),否则由于标记溢出,导致浏览器解释异常。

3.xml_encode函数

xml_encode函数用于快速生成XML数据,功能上类似于ajaxReturn,这两者所生成的XML标签名称和标签文本都是根据关联数据键名与键值而来的。不同之处在于xml_encode可以在MVC所有功能类库中进行使用,包括自定义扩展、自定义函数、自定义模型等。而ajaxReturn只能在控制器动作中进行使用。

另外,xml_encode虽然不能自定XML文档标签,但允许自定义根节点。xml_encode函数支持3个参数,表现形式为xml_encode($data,$encoding,$root),参数值如表9-3所示。

表9-3 xml_encode函数参数

978-7-111-42852-7-Part02-400.jpg

xml_encode函数的使用非常简单,和普通的自定义函数没什么区别,如以下代码所示。

978-7-111-42852-7-Part02-401.jpg

事实上,ajaxReturn方法本质上也是调用xml_encode函数的,所以在实际应用开发中如果只需单一地生成xml数据,完全可以使用xml_encode代替ajaxReturn方法。

通过前面内容的介绍,可以看到使用display方法处理xml是最灵活和强大的,如果配合后面章节将介绍的静态缓存功能,可以将结果进行缓存,以提高数据响应速度。

display是控制器基类show的数据交互方法,show方法直接调用模板引擎中的view(封装在action类中)接口,根据面向对象原则,开发人员可以直接调用show方法进行处理数据(需要使用连贯操作,即$this->view->show())。

通过这前面内容的学习,相应读者能够使用PHP轻松地生成XML文件,以及使用内置的XML引擎解释XML数据了。XML只是一种数据规范,接下来将学习另外一种非常流行的数据规范。