AJAX in Zend Framework

Posted on 17th April 2008 by Nio in AJAX, JavaScript, Zend Framework, 程序人生

Zend Framework 1.5 已经对 AJAX 有了不错的支持,使用上也很简单。主要涉及到的类是 Zend_Controller_Action_Helper_AjaxContext,这个类中的方法 initContext() 中通过判断 XHR 头来确定是否是 AJAX 调用:


<?php
/**
 * Initialize AJAX context switching
 *
 * Checks for XHR requests; if detected, attempts to perform context switch.
 * 
 * @param  string $format 
 * @return void
 */
public function initContext($format null)
{
    $this->_currentContext null;

    if (!$this->getRequest()->isXmlHttpRequest()) {
        return;
    }

    return parent::initContext($format);
}
?>

可以使用 ZF 默认的目录部署来写一个简单示例,目录结构如下:


application/
    controllers/
        IndexController.php
    models/
    views/
        scripts/
            index/
                index.phtml
                demo.ajax.phtml
        helpers/
        filters/
html/
    .htaccess
    index.php
    js/
        jquery.js

JavaScript 库使用 jQuery。需要写代码的文件是 IndexController.php、index.phtml 和 demo.ajax.phtml。IndexController.php 包含了 2 个 actions,一个是 index,一个是 demo。index 中有个按钮用于测试 AJAX 请求,而请求的目标则是 demo action。demo 对应的视图名字后缀使用了 .ajax.phtml,这是默认的设置。Front controller 的调用很简单:


<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::getInstance()
    ->setParam('useDefaultControllerAlways'true)
    ->setControllerDirectory('../application/controllers')
    ->dispatch();
?>

IndexController.php 在初始化的时候,需要初始化 AjaxContext Helper:


<?php
class IndexController extends Zend_Controller_Action
{
    public function init()
    {
        $ajaxContext $this->_helper->getHelper('AjaxContext');
        $ajaxContext->addActionContext('demo''html')
                    ->initContext();
    }
    
    public function indexAction()
    {
    }
    
    public function demoAction()
    {
        $this->view->hello 'Hello, world! ('.date('H:i:s').')';
    }
}

addActionContext('demo', 'html') 表明 demoAction 为 AJAX 调用的 action,格式为 html。除了 html 之外,还支持 xml、json 等。AJAX 请求时需要给请求的 url 加上 format=html 的 GET 参数。indexAction 对应的视图 index.phtml 代码如下:


<html>
<head>
<title>AJAX DEMO</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="<?=$this->url()?>js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $('#ajax_button').click(function(){ //#ajax_button 的 onclick 事件触发
        var url = '<?=$this->url(array('controller'=>'index','action'=>'demo'))?>'; //AJAX 请求的目标 URL
        $.get(url, {'format':'html'}, function(data){ //这里传递了 format=html 的 GET 参数
            $('#hello_message').html(data); //将 AJAX 返回的内容显示在 #hello_message 里边
        });
    });
});
</script>
</head>

<body>
<p><input type="button" id="ajax_button" value="AJAX Call" />
<p id="hello_message"><p>
</body>

</html>

demoAction 对应的视图 demo.ajax.phtml 内容很简单,只是输出 $hello:


<?=$this->hello?>

这就是一个完整的 AJAX 过程。使用 Zend Framework 写出来的代码其实很简单。如果想更加简单一些,可以写个 jQuery AJAX 的 view helper,封装 jQuery 的 JavaScript 代码。

Zend Framework 还提供了 autocomplete(自动完成)AJAX 的 action helper:Zend_Controller_Action_Helper_AutoCompleteScriptaculousZend_Controller_Action_Helper_AutoCompleteDojo,一个是 for Scriptaculous 的,另一个是 for Dojo 的。

Zend Framework 1.5RC1 Released

Posted on 28th February 2008 by Nio in AJAX, Zend Framework, 程序人生

貌似不错,开始做 AJAX 部分的开发了,正好拿来用用,省了自己写,呵呵。不过我已经封装了一些常用的 AJAX actions 了,基于 jQuery 的,可以让编程者从 JavaScript 解脱出来,专注于 PHP 部分的编码。

An overview of new features included in the 1.5 Preview Release:

  • New Zend_Form component with support for AJAX-enabled form elements
  • New action and view helpers for automating and facilitating AJAX requests and alternate response formats
  • Infocard and OpenID authentication adapters
  • Support for complex Lucene searches, including fuzzy, date-range, and wildcard queries
  • Support for Lucene 2.1 index file format
  • Partial, Placeholder, Action, and Header view helpers for advanced view composition and rendering
  • New Zend_Layout component for automating and facilitating site layouts
  • UTF-8 support for PDF documents
  • New Technorati and SlideShare web services

AJAX 加载图片生成器

Posted on 24th March 2007 by Nio in AJAX, 程序人生

ajaxload.info 提供了一个在线生成 AJAX 的 load 图片的工具,非常不错,可以设置图形、前景色和背景色,然后生成出来一个动态的加载图片,以后就不用自己去做这种图了,哈哈。

JavaScript 中的有限状态机

Posted on 31st January 2007 by Nio in AJAX, JavaScript, 程序人生

看到这篇来自 IBM 的文章标题中出现“有限状态机”,顿时觉得非常亲切,大学的时候有门课叫《编译原理》,其中就讲到有限状态机,基本都忘的差不多了,呵呵。
JavaScript 中的有限状态机,第 1 部分: 设计一个小部件

有限状态机很早就已用作设计和实现事件驱动的程序(比如网络适配器和编译器)内复杂行为的组织原则。现在,可编程的 Web 浏览器为新一代的应用程序开辟了一种全新的事件驱动环境。基于浏览器的应用程序因 Ajax 而广为流行,而同时也变得更为复杂。程序设计人员和实现人员能够大大受益于有限状态机的原理和结构。本篇文章将向您介绍如何使用有限状态机来为一个简单的 Web 小部件 —— 一个能够淡入和淡出的工具提示 —— 设计复杂的行为。

本系列的第 2 部分将描述如何在 JavaScript 内实现此设计,以及如何充分利用 JavaScript 独特的语言特性,比如关联数组和函数闭包。第 3 部分则会涵盖如何使此实现能够在所有流行的 Web 浏览器中正常工作的内容。最终的代码紧凑简练,逻辑清晰透明,动画效果即使在负载极重的处理器上也能平稳流畅。

我渴望与你一起工作

Posted on 25th January 2007 by Nio in AJAX, CakePHP, 工作忙碌, 程序人生

我们现在急切需要 PHP 开发人员,如果你正在寻找工作,谋求发展机会,那请不要犹疑,加入我们吧。

中级程序员
CakePHP、MySQL、Apache、AJAX、SVN/CVS、JavaScript、CSS、HTML

初级程序员
Joomla、MySQL、JavaScript、CSS、HTML

此外,需要有一点英文基础,公司会提供英语培训。

公司介绍请看:http://www.dianjingkeji.com

有意向的同学可以将 中英文 简历发到 hr#dianjingkeji.com(请将 # 号换成 @)。