热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AJAXinCakePHP(1)-GettingStarted

CakePHP(以下简称“Cake”,本文使用的版本是0.10.7.1856RC3)对AJAX的支持是建立在prototype与script.aculo.us之上的,其自身并没有包含客户端的AJAX实现,所以想要在Cake中熟练地使用AJAX,必须首先熟悉prototype和script

一、Cake 中的 AJAX 实质

CakePHP(以下简称“Cake”,本文使用的版本是 0.10.7.1856 RC3)对 AJAX 的支持是建立在 prototypescript.aculo.us 之上的,其自身并没有包含客户端的 AJAX 实现,所以想要在 Cake 中熟练地使用 AJAX,必须首先熟悉 prototype 和 script.aculo.us,而本文的重点并不是这两个出众的 Javascript 库。说白了,Cake 实际上只是简化了繁琐的 AJAX Javascript 代码。

二、Cake 中的 AJAX 相关文件

在 Cake 中,与 AJAX 相关的文件只有两个:

  • cake/cake/libs/view/templates/layouts/ajax.thtml
  • cake/cake/libs/view/helpers/ajax.php

ajax.thtml 文件是执行 AJAX 动作之后用于输出的布局,和一般的布局文件不同的是它是一个空的布局视图文件,没有 header/footer 等等内容。ajax.php 文件则是用于 Cake 视图文件的 AJAX 辅助类 AjaxHelper,此类中包含了很多 AJAX 动作的相关方法,详细 API 请参考 http://api.cakephp.org/class_ajax_helper.html

除了上述的两个文件外,我们还需要 Prototype 的 prototype.js 和 script.aculo.us 中的 *.js 文件,这些文件可在官方网站上下载到,将这些 *.js 文件放置 cake/app/webroot/js/ 目录下即可。对于这两个库,本文用的版本分别是 1.4.0 和 1.5.1。

三、Hello, AJAX world!

现在我们使用一个简单的示例简单演示一下如何在 Cake 中使用 AJAX。这个示例将实现点击链接之后,在页面上加载服务器端输出的“Hello, AJAX world!”信息。为了简单起见,示例中不使用任何数据库,也就是不用 Cake 的模型(Model),而只用控制器(Controller)和视图(View)。首先创建一个布局视图文件 cake/app/views/layouts/demo.thtml,用于自定义布局以及加载需要用到的 Javascript 文件,此文件内容如下:

 


 echo $html->charsetTag('UTF-8')?>
echo $Javascript->link('prototype')?>
echo $Javascript->link('scriptaculous')?> 



    

CakePHP AJAX Demo

    echo $content_for_layout?>

重点在于 $Javascript->link() 的那两行,包含了需要用到的 Javascript 文件 prototype.js 和 scriptaculous.js,而 script.aculo.us 库中的其他 Javascript 文件都由 scriptaculous.js 统一进行包含,不用我们书写额外的代码,如果并不想使用 script.aculo.us 的所有 js 文件,可以使用 load 参数进行指定包含,比如我们只用到 effects.js,可以这样(多个则用英文逗号“,”分割开):

 echo $Javascript->link('scriptaculous.js?load=effects')?>  

接下来是创建一个控制器文件 cake/app/controllers/demos_controller.php:

 class DemosController extends AppController {
    var $name    'Demos';    //兼容 PHP4
    var $layout  'demo';   //指定视图使用的布局为 demo.thtml
    var $helpers = array('Html''Javascript''Ajax'); //需要用到的视图辅助类

    function index()
    {
    }

    function hello()
    {
        sleep(1);   //本地测试时,为了更好地看到效果,模拟延迟状态
        $this->layout 'ajax'//此方法为 AJAX 动作,所以布局需要使用 ajax.thtml
    }
}   ///:~ ?>  

此控制器的重点有三个:

对应于控制器中的两个方法(Action),我们需要在 cake/app/views/demos/ 目录下创建两个视图文件:index.thtml 和 hello.thtml。

index.thtml:

 Loading...

    //设置 AJAX 选项     $options = array(         //设置加载成功之后需要进行更新的元素为 view         'update'   => 'view',         //加载过程中隐藏 view 元素,显示“Loading...”字样         'loading'  => "Element.hide('view');Element.show('loading')",         //加载成功之后隐藏 loading,同时显示 view 元素         'complete' => "Element.hide('loading');Effect.Appear('view')"     );     //使用 AjaxHelper 创建 AJAX 动作链接     echo $ajax->link('Click here!''/demos/hello'$options);     ?>

这个视图中有三个元素:loading、view 与 AJAX 链接。初始状态下 loading 与 view 是隐藏的(display:none),只有点击了 AJAX 链接之后,在加载状态中显示 loading,加载完成之后将其隐藏,然后显示 view,“Hello, AJAX world!”即显示在 view 中。此视图的重点在于 $ajax->link(),$ajax 是 AjaxHelper 的对象实例,link() 方法的第一个参数是链接显示的文本,第二个参数是 Cake 的 URL,这里的 URL 为 /demos/hello,指向了 AJAX 动作方法 hello(),此动作最终输出视图 hello.thtml,第三个参数为 AJAX 选项,Cake 会自动根据选项生成链接中使用到的 Javascript 代码。对于一个简单的 AJAX 动作,主要就是设置三个选项:update、loading 与 complete,这几个选项的意义在视图代码的注释中都有了详细说明。

最后就是 hello.thtml 视图文件了,只是一行简单的文本:

 
Hello, AJAX world!

OK,通过尽量少的编码,我们完成了这个示例,可以通过 http://www.somesite.com/cake/demos/ 浏览最终效果。

四、Live Search

Live Search 指的是即时查询,通常是用户在文本框中输入想要查询的关键字,由客户端 Javascript 对文本框进行观察,监测到用户输入之后即时提交到服务器,并显示服务器返回的结果。接下来我们将使用 Cake 的 AJAX 实现 Live Search,从一个数组中获取符合查询关键字的数据,然后即时更新到页面中。

首先修改我们的控制器 demos_controller.php,增加一个方法 search():

 function search()
    {
        $langs = array(
            'C''C++''C#',
            'Java''Javascript',
            'PHP''Perl''Python', 
            'Ruby''Delphi');
        $this->layout 'ajax';
        if (empty($this->params['form']['livesearch'])) { //未提交任何数据
            $result $langs;
        } else {    //根据提交的关键字进行查询
            $word   $this->params['form']['livesearch'];
            $result = array();
            foreach ($langs as $lang)
                if (stristr($lang$word) !== false)
                    $result[] = $lang;
        }
        $this->set('result'$result);
    } ?>  

在 index.thtml 视图文件中,加入 Live Search 的表单代码:

 
    

        Live Search:              

//设置 AJAX 选项     $options = array(         'update' => 'view',         //处理查询的 URL,对应于控制器中的 search() 方法         'url'    => '/demos/search',         //观察频率,单位为“秒”         'frequency' => 1,         'loading' => "Element.hide('view');Element.show('loading')",         'complete' => "Element.hide('loading');Effect.Appear('view')"     );     echo $ajax->observeField('livesearch'$options); ?>

这里用到了 AjaxHelper 中的另一个方法 observeField(),此方法用于观察某个元素的数据是否发生变化,发生变化时则调用相应的 AJAX 操作。方法的第一个参数为需要观察的元素 id,这里是“livesearch”文本框,第二个参数为 AJAX 选项,和 link() 方法中的相似,只不过这里的选项设置多了 url 与 frequency,url 即 Cake 的 URL,对应于控制器中的方法,frequency 则是观察的间隔时间,单位为“秒”,即每隔多少秒查看一下对应的元素是否发生了改变。

对应于 search() 方法,创建视图文件 cake/app/views/demos/search.thtml:

 if (count($result) > 0): ?>     
            foreach ($result as $lang): ?>         
  • echo $lang ?>
  •         endforeach ?>     
else: ?>     Found nothing! endif ?>

好了,这个 Live Search 已经完成了,是不是很简单 ;) 现在只要在文本框中输入字符,就会在 $langs 数组中查找,只要包含了查询关键字的结果都会被返回并更新到 view 元素中。

五、其他应用

Cake 的 AjaxHelper 中还提供了很多方法,如用于拖曳的 drag()、drop() 及 dropRemote();用于排序的 sortable();用于自动完成的 autoComplete() 等等,由于涉及到的讲解篇幅比较大,暂时就不深入了,有时间的话我再一一道来。drag/drop 可以在我写的 Cake Framework AJAX Demo 中看到在线演示,并可下载到源代码。

六、一些问题

Cake 当前版本(0.10.7.1856 RC3)的一些方法还不是非常完善,对于最新版本的 script.aculo.us 库中的一些参数还不支持,相信很快会得到更新。实际应用中可能会碰到中文乱码的问题,那是因为 XMLHttpRequest 获取到的数据都是以 UTF-8 编码的,所以解决的办法有两个,一个是所有页面、数据库数据均使用 UTF-8 编码,这样可以省去很多麻烦,另外一个就是通过 PHP 的 iconv() 函数进行转码,但这需要用到 iconv 扩展,所以比较麻烦一些,而且无形中为服务器增加了额外的负担。

七、相关资源

Update@2006.11.26: 有兴趣的同学可以继续阅读本序列文章的第二篇《AJAX in CakePHP (2) - Sortable》。


推荐阅读
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
author-avatar
mobiledu2502881853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有