Zend Framework 入门教程(简体中文版)

Zend Framework 入门教程(简体中文版)

Getting Started With the Zend Framework

Author:Rob Allen, www.akrabat.com

DocumentRevision:1.5.2

Copyright© 2006,2008

翻 译:Altair (eniac2008@163.com)

中文版本号:v0.12

【翻译说明】这是 Zend Framework 的非常经典的入门教程,它的原作者 Rob Allen 是《Zend FrameworkIn Action》一书的作者。在翻译这个版本之前,只知道 Jason Qi 翻译的 0.9 版(实际内容是关于 Zend Frame 0.6

版本的)。因为自 0.9 版以来 Zend Framework 已经有了很大的变化,教程也有了比较大的改变。因此才决定重新翻译一次。翻译完成后才发现 Jason Qi 翻译的最新版本已经是1.4.3 了。但毕竟已经翻译完成,而且 Jason翻译的还不是最新版本,因此还是决定将这个版本的翻译发布出来。因此,实际上这个翻译版本是根据英文版 v1.5.2 完全重新翻译的。

这个翻译版本是比较初步的一个版本,里面可能还有不少翻译错误,主要是中文表述的问题,我会一直对其进行修订。如果你发现文中有一些错误,那很有可能是我在翻译的时候造成的,欢迎大家将发现的错误及时通知我,以便我能及时更新,以保证此中文版本跟原文一样的高品质。Thanks!

本教程的英文版原文链接:http://akrabat.com/zend-framework-tutorial/

Jason Qi翻译的本教程的早期版本可以在这里找到: http://zft.backupdiy.com/download/

本教程首发: http://bbs.phpchina.com, http://www.phpatoz.com (Underconstruction)

History:

2008/05/30 v0.01First Release.

2008/05/30 v0.02Bug Fix

2008/06/01 v0.03Bug Fix

2008/06/02 v0.04Bug Fix

2008/06/05v0.10/0.11 对文字做了比较大的修订。

2008/06/06 v0.12Bug Fix

What's New?

v0.12 P12“样式”小节中有关辅助函数类保存的地址 helper 应为 helpers 感谢 phpeye.com/lxq73061 指出此错误。

v0.10 对文字做了比较大的修订。

v0.04 (1) 因原文中有关目录配置的地方有一处写得有点矛盾,因此我在 v0.03 版的译注是针对使用虚拟主机的配置的。对于不使用虚拟主机的情况,我的译注与文中后来访问的 URL 有冲突。新版中对此作了一些修改。原则上,v0.03 版的译注是没有问题的。

本教程对使用 Zend Framework 来开发数据库驱动的应用程序作了非常基本的介绍。

注意:本教程在 Zend Framework 1.5 版下测试通过。在以后的 1.5.x 版本上,它也有很大可能正常运行,但在 1.5 以前的版本上本教程不能运行。

Model-View-Controller架构

下面是传统的 PHP 应用程序编写方式:

<?php

include "common-libs.php";

include "config.php";

mysql_connect($hostname, $username, $password);

mysql_select_db($database);

?>

<?php include "header.php"; ?>

<h1>Home Page</h1>

<?php

$sql = "SELECT * FROM news";

$result = mysql_query($sql);

?>

<table>

<?php

while ($row = mysql_fetch_assoc($result)) {

?>

<tr>

<td><?php echo $row['date_created']; ?></td>

<td><?php echo $row['title']; ?></td>

</tr>

<?php

}

?>

</table>

<?php include "footer.php"; ?>

对于采用这种方式编写的应用程序来说,为了适应其生命周期中客户不断变化的需求,将不得不在代码的多个地方打上补丁,最后导致它变得无法维护。提高程序的可维护性的一种方法是将这个程序的代码分成如下三个不同的部分(通常也是独立的文件):

模型

应用程序的模型部分关心的是欲显示的数据的细节。在上面的示例代码中模型是“news”数据库表。因此,模型通常关注的是应用程序的业务逻辑部分,关注的是如何使用数据库来读取和保存数据。

视图

视图关心的是用户显示的部分,它通常是 HTML。

控制器

控制器将特定的模型和视图结合起来,保证将正确的数据显示到页面上。

Zend Framework 使用 Model-View-Controller(MVC)架构。它将程序中不同部分独立开来,使得应用程序的开发和维护更加容易。

需求

使用 Zend Framework 需要下列环境:

PHP 5.1.4 或以上版本

支持 mod_rewrite 功能的 Web 服务器

一些假设

本教程假定你运行 PHP 5.1.4 或以上版本,外加Apache Web 服务器。 Apache 必须已安装并正确配置了mod_rewrite 扩展。

必须保证 Apache 已配置成支持.htaccess 文件的模式。通常这可以通过在 httpd.conf 中将

AllowOverride None

改成

AllowOverride All

来实现。更详细的设置方法可以在 Apache 发行文档中找到。如果没有正确配置 mod_rewrite 及.htaccess,那么除了本教程的首页外你将不能看到任何其它的页面。

获取框架

Zend Framework可以从http://framework.zend.com/download下载(有.zip或.tar.gz两种格式)。

目录结构

虽然 Zend Framework 对目录结构没有特别要求,但其手册上还是推荐了一种常用的目录结构,本教程也使用这种目录结构。这种结构要求你能完全控制 Apache 的配置文件,以便可以将大多数的文件存放在 web的根目录之外。

首先在web服务器的根目录下创建一个zf-tutorial目录 1 ,然后分别创建下面的子目录来存放网站 2的文件:

\

我们使用单独的目录来保存应用程序的模型、视图和控制器文件。 public目录是网站的根目录 3 ,这样就可以通过URL http://localhost/zf-tutorial/public/ 来访问我们的程序。并且应用程序的绝大多数文件都不能直接通过Apache来访问,从而提高了系统的安全性。

1 译注:按道理此处的 Web 服务器的根目录不应指网站的根目录,即不是 Apache 配置文件中的DocumentRoot 目录。但实际上本教程中这个目录就是指的是 DocumentRoot 目录。原文这个地方写得与上文中“将大多数文件存放在 web 的根目录之外”的原则有点矛盾。

2 译注:此处的网站是将教程中开发的应用程序看作一个独立的网站的应用来看待的。因此,在下文中有时会将网站或(应用用)程序的概念混用,只要记住它都是指我们在这个教程中正在开发的应用程序就可以了。

3 译注:此处意味着我们必须将.htaccess 及 index.php 两个文件保存在 public 目录下。

注意:

在一个包括其它网站的服务器中,最好还是为我们的网站创建一个虚拟主机,将其根目录设置为public子目录。例如你可以创建一个zf-tutorial.localhost的虚拟主机 4

<VirtualHost*:80>

    ServerName zf-tutorial.localhost

    DocumentRoot/var/www/html/zf-tutorial/public

    <Directory "/www/cs">

        AllowOverride All

    </Directory>

</VirtualHost>

这样就可以通过 http://zf-tutorial.localhost/ 来访问该网站。(使用这种方式必须修改 /etc/hosts c:\windows\system32\drivers\etc\hosts文件,将 zf-tutorial.localhost映射到 127.0.0.1)

辅助的图像文件, JavaScript 文件和 CSS 文件分别保存在 public 目录下的不同文件夹中。下载后的 ZendFramework 文件将保存在 library文件夹中。如果需要使用其它的库文件,也可以放在该文件夹下。

将下载的 Zend Framework 软件包,我使用的是ZendFramework-1.5.0.zip,解压到一个临时目录中,解压后的所有文件都放在 ZendFramework-1.5.0 子文件夹下,将它的子目录library/Zend 拷贝到 zf-tutorial/library/文件夹,现在 zf-tutorial/library/目录中包含了 Zend 子目录。

引导文件

Zend Framework控制器类 Zend_Controller支持网站使用“干净的URL”5 。为此所有的请求都需要通过index.php进入。这就是通常所说的前端控制器(Front Controller)设计模式。它为我们的应用程序的所有页面提供了一个中心控制点并确保程序的运行环境已经正确设置。要完成这一切,都必须在zf-tutorial/public目录下创建一个.htaccess文件:

zf-tutorial/public/.htaccess

# Zend Frameworkrewrite 规则

RewriteEngine on

RewriteCond%{REQUEST_FILENAME} !-f

RewriteRule .*index.php

# 安全性考虑:不允许列表目录内容

Options -Indexes

# PHP 设置

php_flagmagic_quotes_gpc off

php_flagregister_globals off

php_flagshort_open_tag on

4 译注:如果配置虚拟主机,必须将此处的 DocumentRoot 以及 Directory 中的路径换成自己的实际目录。

5 译注:所谓“干净的URL”是指URL中不含那些杂乱的参数,如:http://localhost/index/add/,而不是http://localhost/index.php?action=add

RewriteRule 非常简单,可理解为“对所有不能映射到磁盘上已存在的文件的 url,都用 index.php 来代替”。

为了安全起见,我们设定了一些 PHP 的 ini 设置;我们还将 short_open_tag 选项设置为 on,因为将来视图文件可能会用到它。当然这些设置可能已经正确设置过了,但我们必须确保这一点。注意只有在使用 PHP模块(mod_php)的方式下才可以在.htaccess 文件中使用 php_flag标记。如果使用 CGI/FastCGI 模式,必须保证在 php.ini 中正确设置了这些参数。注意,为了让.htaccess 起作用,必须在httpd.conf 中将配置指令AllowOverride 设置为 All.

引导文件: index.php

zf-tutorial/public/index.php是应用程序的引导文件,我们用下面的代码开始我们的教程:

zf-tutorial/public/index.php

<?php

error_reporting( E_ALL | E_STRICT );

ini_set( 'display_errors',1 );

date_default_timezone_set( 'Europe/London' );

// 目录设置和类装载

set_include_path( '.' .PATH_SEPARATOR . '../library/' . PATH_SEPARATOR . '../application/models'. PATH_SEPARATOR . get_include_path () );

include "Zend/Loader.php";

Zend_Loader::registerAutoload ();

// 设置控制器

$frontController= Zend_Controller_Front::getInstance ();

$frontController->throwExceptions( true );

$frontController->setControllerDirectory( '../application/controllers' );

// run!

$frontController->dispatch();

注意在文件的结尾我们没有加上 ?>,因为在文件的结尾它不是必需的。这样可以避免产生一些难于调试的错误问题。例如,在使用 header()函数来重定向(redirect)时,如果在其前面某个包含文件中 ?> 后面不小心加上了空格就会出现错误。

下面开始详细解释这个文件:

error_reporting(E_ALL|E_STRICT);

ini_set('display_errors', 1);

date_default_timezone_set('Europe/London');

前 2 行保证在程序出错时能看到相应的错误信息。第 3 行设置了时区( PHP 5.1+以后要求如此)。当然,你应该选择自己所在地的时区。

// 目录设置和类装载

set_include_path('.' . PATH_SEPARATOR. '../library/'

. PATH_SEPARATOR .'../application/models'

. PATH_SEPARATOR .get_include_path());

include "Zend/Loader.php";

Zend_Loader::registerAutoload();

Zend Framework 在设计时就要求它必须在包含路径(include path)中。为了将来很容易的装入模型类,我们也将模型类目录加到了包含路径中。在正式开始之前,我们首先包含进 Zend/Loader.php 文件,这样就可以使用 Zend_Loader 类了。接着调用 Zend_Loader 类的 registerAutoload()成员函数,这样以后在实例化 ZendFramework 对象时就可自动装入它们。

问题:由于我测试的版本是1.11.12,和1.5有些不同,出现如下问题

Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated asof 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead

解决办法,将:

//require_once ‘Zend/Loader.php’;

//Zend_Loader::registerAutoload();//设置Zend Framework 自动载入类文件

换成:

require_once ‘Zend/Loader/Autoloader.php’;

Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

 

// 设置控制器

$frontController =Zend_Controller_Front::getInstance();

$frontController->throwExceptions(true);

$frontController->setControllerDirectory('../application/controllers');

必须设置前端控制器使得它知道从哪里去找我们的控制器类。

$frontController =Zend_Controller_Front::getInstance();

$frontController->setControllerDirectory('./application/controllers');

$frontController->throwExceptions(true);

因为这只是一个教程并且通常只是在测试系统上运行,因此我决定让前端控制器(front controller)抛出它遇到的所有异常。默认情况下,前端控制器将捕获这些异常并将其传递到 ErrorController 控制器,但这容易造成 Zend Framework 新手的困惑。直接抛出异常相对简单,这样错误也很容易看到。当然,在实际运行中的服务器,不管怎样都不能将错误直接显示给用户

前端控制器使用了一个路由类将请求的 URL 映射到相应的显示页面内容的 PHP 函数。路由类要正常工作,必须知道该 URL 中哪些部分用于映射到 index.php 的路径,这样它才可以从其后余下的部分中读取 URI 元素。这个工作由 Request 对象来完成。 Request 对象可以有很强的自动检测正确的基地址(base URL)的能力,但如果它在你的设置环境中不能正常工作,可以使用$frontController->setBaseUrl()来覆盖它。

现在到了程序的核心部分了,程序正式开始运行:

// run!

$frontController->dispatch();

此时如果你用浏览器来测试http://localhost/zf-tutorial/public/,你会看到一条致命错误信息:

Fatal error: Uncaught exception'Zend_Controller_Dispatcher_Exception' with message 'Invalid controllerspecified (index)' in…

这个错误信息告诉我们还没有创建 application 的内容。在此之前,我们最好先讨论一下要做什么,而这就是我们下一节的内容。

网站内容

我们打算建立一个非常简单的库存管理系统,用于显示我们收藏的 CD。主页上显示我们收藏的 CD 列表,

并允许我们增加、修改、删除 CD。 CD 信息保存在如下结构的数据库中:

字段名

类型

是否允许为空?

备注

id

Integer

No

主键,自动增加

artist

Varchar(100)

No

 

title

Varchar(100)

No

 

需要的页面

在我们的程序中需要下列四个页面:

主页

显示所有唱片列表,提供修改、删除的链接。另外还提供一个新增唱片的链接。

添加新唱片页面

提供了一个表单,用于添加新唱片

修改唱片页面

提供了一个表单来修改唱片

删除唱片页面

本页确认并删除唱片

页面的组织

在我们继续下一步工作之前,理解Zend Framework要求页面如何组织至关重要。程序的每个页面就是一个“动作” (action),而动作又组合到控制器中。例如,对于 http://localhost/public/zf-tutorial/news/view形式的URL来说,控制器是 news, 动作是view。这样可以将相关的动作组合到一起。例如,一个news控制器可以有list, archive和view动作。 Zend Framework的MVC系统还支持将不同的控制器组合在一起,但这个程序没有那么复杂,所以我们不用考虑这些。

默认情况下, Zend Framework保留了一个特殊的动作,称之为index,并将它作为默认动作。因此http://localhost/public/zf-tutorial/news将执行控制器news的动作index。同样,如果不提供控制器名称,那么就使用 index作为默认的控制器。因此http://localhost/public/zf-tutorial/ 将执行控制器index的动作index。

作为一个简单的教程,我们不考虑那些复杂的情况如“登录”等,它们也许需要另外一篇教程才能讲清楚......

现在我们有四个页面,并且都跟唱片有关,因此我们可以将它们组合到包含四个动作的控制器中。在这里我们使用默认的控制器,它的四个动作如下:

页面

控制器

动作

主页

Index

index

添加新唱片页面

Index

add

修改唱片页面

Index

edit

删除唱片页面

Index

delete

编写控制器

现在可以编写控制器类了。在 Zend Framework 中,控制器类名必须为{Controllername}Controller。注意控制器类名称(Controller name)的首字母必须大写。控制器类必须保存在 application/controllers 目录中,文件名为 {Controller name}Controller.php。同样,这里{Controller name}必须以大写字母开头,所有其它字母均为小写。每个动作(action)必须是一个名为{action}Action的 public 函数,这里 {action}必须以小写字母开头并且全是小写字母。混合大小写的控制器名称或动作名称是允许的,但在使用它们之前你必须理解这种用法有其特殊的规则。建议你在使用它们之前先阅读一下相关的文档。

因此我们的控制器名为 IndexController,它在zf-tutorial/application/controllers/IndexController.php文件中定义。我们先创建该文件并编写它的框架代码:

zf-tutorial/application/controllers/IndexController.php

<?php

class IndexController extends Zend_Controller_Action

{

    function indexAction()

    {

    }

    function addAction()

    {

    }

    function editAction()

    {

    }

    function deleteAction()

    {

    }

}

现在已经设置了将要用到的四个动作。在视图代码完成后,它们就可以工作了。每个动作对应的URL如下 6

URL

Action

http://localhost/zf-tutorial/public

IndexController::indexAction()

http://localhost/zf-tutorial/public/index/add

IndexController::addAction()

http://localhost/zf-tutorial/public/index/edit

IndexController::editAction()

http://localhost/zf-tutorial/public/index/delete

IndexController::deleteAction();

6 译注:对于使用虚拟主机的配置,其对应的URL类似于 http://zf-tutorial.localhost/index ...

现在已经有了一个可以工作的“路由器”,每个页面都定义了一个动作函数。接下来我们将开始创建视图。

编写视图

不奇怪, Zend Framework 的视图组件就叫做Zend_View. 视图组件允许我们将显示页面的代码与动作函数的代码分离。

Zend_View 的基本用法如下:

$view = newZend_View();

$view->setScriptPath('/path/to/view_files');

echo$view->render('viewScipt.php');

而易见,如果直接将这些骨架代码写到每一个动作函数中,我们就不得不到处无聊的重复这些跟动作关系不大的代码。我们希望能将视图的初始化代码放在其它的地方,然后在每个动作函数中直接访问已初始化过的视图对象。

Zend Framework 的设计人员已经预见到了这种情况,建立了一个“动作辅助类(action helper)”来解决这个问题。这个辅助类是 Zend_Controller_Action_Helper_ViewRenderer,它初始化视图属性( $this->view),我们可以使用这个属性,并用来显示视图文件。显示过程首先通知 Zend_View 对象在views/scripts/{controllername}目录中查找显示脚本,然后显示与动作名称相同,扩展名为.phtml 的显示脚本。即显示的视图文件名为 views/scripts/{controller name}/{action name}.phtml,显示的内容将附加到应答对象( Response Object)的应答内容(body)中。应答对象将 MVC 系统生成的 HTTP 头,应答内容以及所有异常信息整合在一起。前端控制器在调度过程的结尾处自动将 HTTP 头以及应答内容返回给用户。

们需要创建一些视图文件来将视图集成到我们的程序中。为了验证这些视图文件是否能正常工作,我们先需要修改 IndexController,修改的内容见下面的黑体部分:

zf-tutorial/application/controllers/IndexController.php

<?php

class IndexController extends Zend_Controller_Action

{

    function indexAction()

    {

        $this->view->title = "My Albums";

    }

    function addAction()

    {

        $this->view->title = "Add New Album";

    }

    function editAction()

    {

        $this->view->title = "Edit Album";

    }

    function deleteAction()

    {

        $this->view->title = "Delete Album";

    }

}

每个动作函数中,我们做的所有工作就是为视图属性(view)属性增加了一个 title 变量。注意在这个时候实际的显示操作还没有开始——它是在前端控制器在调度过程的最后进行的。

现在需要在我们的程序中增加四个视图文件。前面已经提到过,这些文件称为显示脚本(scripts)或显示模板 (templates),每一个显示模板根据相应的动作命名,并且扩展名为.phtml。模板文件必须放在与控制类同名的子目录中,因此这四个模板文件分别是:

zf-tutorial/application/views/scripts/index/index.phtml

<html>

<head>

    <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

    <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

zf-tutorial/application/views/scripts/index/add.phtml

<html>

<head>

    <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

    <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

zf-tutorial/application/views/scripts/index/edit.phtml

<html>

<head>

    <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

    <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

zf-tutorial/application/views/scripts/index/delete.phtml

<html>

<head>

    <title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

    <h1><?php echo $this->escape($this->title); ?></h1>

</body>

</html>

现在浏览上面的四个 url 地址测试每个控制器/动作,在浏览器中应该可以看到四个页面的标题了。

相同的HTML代码

很快你就会发现在我们的视图中有大量相同的 HTML 代码,由于这个问题非常普遍,因此 Zend Framework中专门设计了 Zend_Layout 组件来解决这个问题。Zend_Layout 组件允许我们将相同的头部和尾部代码移到独立的布局显示脚本(layoutview script)中,并在布局显示脚本中包含与正在执行的动作相关的显示代码。

为此我们需要对程序做一些修改。首先要确定的是将布局显示脚本保存到哪里。建议的路径是在 application目录下,因此我们在zf-tutorial/application 目录中创建一个layouts 子目录。

其次我们需要通知启动文件启用 Zend_Layout,这只需要在public/index.php 中增加一行代码即可(黑体部分):

zf-tutorial/public/index.php:

...

$frontController->throwExceptions(true);

$frontController->setControllerDirectory('../application/controllers');

Zend_Layout::startMvc(array('layoutPath'=>'../application/layouts'));

// run!

$frontController->dispatch();

startMvc()函数内部为前端控制器安装了一个插件(plugin),该插件保证Zend_Layout 组件在调度过程的最后显示布局脚本,而该布局脚本中包含了动作的显示脚本。

现在我们就需要这个布局显示脚本了。布局显示脚本默认的文件名是 layout.phtml,它保存在在 layouts目录中,内容如下:

zf-tutorial/application/layouts/layout.phtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

<title><?php echo $this->escape($this->title); ?></title>

</head>

<body>

    <div id="content">

    <h1><?php echo $this->escape($this->title); ?></h1>

    <?php echo $this->layout()->content; ?>

    </div>

</body>

</html>

注意我们创建了一个符合 XHTML 规范的标准 HTML 文件来显示页面。因为页面中<h1>标记中的标题在所有页面上都显示,我们将它移到了布局文件中,并且使用 escape()函数来保证它被恰当的编码。

为了显示当前动作的显示脚本(view scripts),我们使用了layout()辅助函数: echo$this->layout()->content; 它将内容显示到content 占位符中。这也意味着动作的显示脚本在布局显示脚本之前执行。

现在我们可以来清理一下 4 个动作的显示脚本了,因为还没有什么特殊的东西需要放到它里面,所以我们可以将 index.pthml, add.phtml, edit.phtml, delete.phtml 文件内容清空。

现在再测试一下上述四个 URL,你会发现看到的内容与上次一模一样!然而它们有一个关键的不同,就是这次所有的工作都是利用布局显示脚本(layout)来完成的。

样式

虽然只是一个教程,我们还是需要一个 CSS 文件来使得我们的程序看起来漂亮一些。因为 URL 并不是指向正确的根目录,这使得我们在如何引用 CSS 文件时碰到一点小麻烦。这时我们可以通过创建自己的视图辅助类baseUrl()来解决这个问题。该辅助类通过收集请求对象(request object)的相关信息使得我们所不知道的实际 URL。

视图辅助类保存在 application/views/helpers 文件夹中名为{Helper name}.php(文件名第一个字母大写)文件中,视图辅助类的名字必须是 Zend_Controller_Helper_{Helper name}形式(同样, Helper name 的第一个字母必须大写)。在这个类中,必须有一个名为{helper name}()的函数(函数名的第一个字母必须小写—可别忘了 !)。在我们的例子中,这个文件名为 BaseUrl.php,内容如下:

zf-tutorial/application/views/helpers/BaseUrl.php

<?php

 

class Zend_View_Helper_BaseUrl

{

    function baseUrl()

    {

        $fc= Zend_Controller_Front::getInstance();

        return $fc->getBaseUrl();

    }

}

zf-tutorial/application/layouts/layout.phtml

<head>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

<title><?php echo $this->escape($this->title); ?></title>

<link rel="stylesheet" type="text/css"media="screen" href="<?php echo $this->baseUrl();?>/css/site.css"/>

</head>

最后,我们需要一些 CSS 样式:

zf-tutorial/public/css/site.css

body,html{

    margin:0 5px;

    font-family: Verdana,sans-serif;

}

h1 {

    font-size: 1.4em;

    color: #008000;

}

a {

    color: #008000;

}

/* Table */

th {

    text-align: left;

}

td,th {

    padding-right: 5px;

}

/* style form */

form dt {

    width: 100px;

    display: block;

    float: left;

    clear: left;

}

form dd {

    margin-left: 0;

    float: left;

}

form #submitbutton {

    margin-left: 100px;

}

数据库

既然我们已将程序的控制与视图分离开来了,现在该是考虑模型的时候了。记住,模型是用来处理程序的核心议题(即所谓的“商业规则” business rules)的,在我们的例子中就是存取数据库。我们将利用 Zend Framework 提供的Zend_Db_Table 类来进行查找、插入、修改和删除数据库表中的记录。

配置

为了使用 Zend_Db_Table类,我们必须先告诉它使用的数据库名称以及该数据库的用户名和密码。因为不希望将这些信息直接硬编码(hard-code)到程序中,所以我们使用配置文件来保存这些信息。

Zend Framework 提供了一个 Zend_Config 类,它可以用灵活的面向对象的方式来访问配置文件。配置文件可以是一个 INI 文件也可以是一个 XML 文件。此处我们使用 INI 方式将配置信息保存在 application 目录下的 config.ini 文件中。

zf-tutorial/application/config.ini

[general]

db.adapter =PDO_MYSQL

db.params.host =localhost

db.params.username= rob

db.params.password= 123456

db.params.dbname= zftest

当然你必须使用自己的数据库名称,用户名和密码而不是我的!对于那些比较大而且包含多个配置文件的应用程序,你可以将配置文件存放在一个单独的目录如 application/config 中。

使用 Zend_Config 非常简单:

$config = new Zend_Config_ini ('config.ini', 'setion');

注意在这种情况下, Zend_Config_Ini 从 INI 中装入一节(section)的数据而不是所有节的数据(当然只要你愿意,可以装入每一节的数据)。它支持一个节名的参数,这样就可以装入附加节的数据。 Zend_Config_Ini将参数名称中的点当做层次分隔符,这样可以将一组相关的配置参数组合在一起。在我们的 config.ini 中,主机、用户名、密码和数据库名称参数均组合在 $config->params->config 中。现在可以在启动文件public/index.php 中装入配置文件信息了:

Relevant part of zf-tutorial/public/index.php

require_once 'Zend/Loader/Autoloader.php';

Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

 

//loadconfiguration

$config = new Zend_Config_Ini('../application/config.ini', 'general');

$registry =Zend_Registry::getInstance();

$registry->set('config',$config);

 

// 设置控制器

$frontController = Zend_Controller_Front::getInstance();

修改的地方见上面粗体字显示的部分。首先装载两个将要使用的类 Zend_Config_Ini 以及Zend_Registry,然后将 application/config.ini 文件中的 general 节中的数据读取到$config对象中。最后我们将$config 保存到$registry 对象中,这样在程序的其它地方也可以使用它。

注意:在本教程中,我们实际上并不需要将$config 保存到$registry 中,但这样做是一个好习惯,因为在大的应用程序中 config.ini 中保存的可能并不仅仅是数据库的连接信息。另外你必须知道的是,注册表有点类似于全局变量,如果不小心的话,会产生不该发生的对象的互相依赖的问题。

设置 Zend_Db_Table

为了使用 Zend_Db_Table 类,必须告诉它我们刚装入的数据库配置信息。为此我们必须先创建 Zend_Db 类的一个实例,然后使用静态函数 Zend_Db_Table::setDefaultAdapter()将它注册到 Zend_Db_Table 中。同样,我们需要修改启动文件(黑体部分):

Relevant part of zf-tutorial/public/index.php

$registry = Zend_Registry::getInstance();

$registry->set('config',$config);

 

//setup database

$db = Zend_Db::factory($config->db);

Zend_Db_Table::setDefaultAdapter($db);

 

// 设置控制器

$frontController = Zend_Controller_Front::getInstance();

Zend_Db_Table 7有一个静态成员函数factory(),它利用$config->db对象中的信息为我们实例化了一个合适的数据库适配器。

创建表

在本教程我们使用 MySQL 作为后台数据库,下面是用来创建数据库表的语句:

CREATE TABLEalbums (

id int(11) NOT NULL auto_increment,

artist varchar(100) NOT NULL,

title varchar(100) NOT NULL,

PRIMARY KEY (id)

);

在 MySQL 客户端如phpMyAdmin 或标准的 MySQL 命令行中运行该语句即可生成数据库。

插入测试唱片数据

我们先插入一些记录到 albums 表中,这样可用来测试主页从数据库中读取数据的功能。我们将 Amazon.co.uk上最畅销的两张 CD 插入到表中:

INSERT INTOalbums (artist, title) VALUES ('Duffy', 'Rockferry'), ('Van Morrison', 'Keep ItSimple');

(很高兴看到 Van Morrison 专辑仍在热卖…)

模型(Model)

Zend_Db_Table 是抽象类,因此必须用它派生一个类才能管理我们的唱片。虽然派生类叫什么名字无关紧要,但使用与数据库表相同的名字会更容易让人理解。因为我们的表名为 albums,因此我们称该派生类为Albums。为了让 Zend_Db_Table 知道它要操作的表的名称,我们需要将其保护成员属性$_name 设置为数据表名称。另外,Zend_Db_Table 假定表有一个字段名为 id 自动增加(Auto Increment)的主键,当然根据需要,这个字段名称可以改变。

将 Albums 类保存至 applications/models目录下的 Albums.php 文件中:

zf-tutorial/application/models/Albums.php

<?php

class Albums extends Zend_Db_Table

{

protected $_name = 'albums';

}

7 译注:原文如此,应该是 Zend_Db。

并不是很复杂,不是吗?那是因为我们比较幸运,需求非常简单而 Zend_Db_Table 正好提供了我们所需要的所有功能。如果需要添加为模型的增加一些特殊功能,可以将它放在这个类中。通常你需要提供的附加功能是这样一组“查询(find)”方法,它可以返回你欲查找的确切的数据集。你也可以为Zend_Db_Table 设置关联表,让它从关联表中获取数据。

唱片列表功能

我们已经设置好了配置信息和数据库信息,现在我们开始讨论程序的核心部分,首先是显示一个唱片的列表。这在 IndexController 类中的indexAction()函数中实现,开始时我们将唱片的列表在一个表格中显示出来:

zf-tutorial/application/controllers/IndexController.php

...

function indexAction()

{

$this->view->title = "MyAlbums";

$albums = new Albums();

$this->view->albums = $albums->fetchAll();

}

...

fetchAll()函数返回一个 Zend_Db_Table_Rowset 对象,在动作的显示脚本中可以使用它对返回的记录进行遍历。现在我们可以重写 index.phtml 文件:

zf-tutorial/application/views/scripts/index/index.phtml

<p><a href="<?php echo $this->url(array('controller'=>'index','action'=>'add'));?>">Add new album</a></p>

<table border="1">

<tr>

<th>Title</th>

<th>Artist</th>

<th> </th>

</tr>

<?php foreach($this->albums as $album) : ?>

<tr>

<td><?php echo $this->escape($album->title);?></td>

<td><?php echo $this->escape($album->artist);?></td>

<td>

<a href="<?php echo $this->url(array('controller'=>'index','action'=>'edit', 'id'=>$album->id));?>">Edit</a>

<a href="<?php echo $this->url(array('controller'=>'index','action'=>'delete', 'id'=>$album->id));?>">Delete</a>

</td>

</tr>

<?php endforeach; ?>

</table>

我们做的第一件事是创建增加新唱片的链接。 Zend Framework 提供的辅助函数 url()来可为我们生成包含正确的基地址的链接。我们只须将需要的参数通过数组的形式传递给它,余下生成链接的工作 url()会自动完成。

然后我们创建一个 HTML 表格来显示唱片名称,艺术家以及修改或删除记录的链接。我们使用标准的foreach在唱片列表上循环,这里使用了 foreach 的另一种写法即冒号(:)加 endforeach;的方式,这样做比找配对的括号更容易。同样的使用 url()辅助函数来生成修改和删除的链接。

现在浏览 http://localhost/zf-tutorial/ 可以看到如下图所示的效果:

添加新唱片

现在我们可以编写添加新唱片功能的代码了。它包括了两个方面的工作:

z 显示一个表单供用户输入详细的唱片信息

z 处理提交的表单,将唱片信息保存到数据库中

我们使用 Zend_Form 来完成这个工作。Zend_Form 组件可以用来创建输入表单并对用户的输入信息进行验证。我们引入一个新的派生自 Zend_Form 的模型类 AlbumForm来定义该表单:

zf-tutorial/application/models/AlbumForm.php

<?php

class AlbumForm extends Zend_Form

{

    public function __construct($options = null)

    {

        parent::__construct($options);

        $this->setName('album');

        $id= new Zend_Form_Element_Hidden('id');

        $artist= new Zend_Form_Element_Text('artist');

        $artist->setLabel('Artist')

            ->setRequired(true)

            ->addFilter('StripTags')

            ->addFilter('StringTrim')

            ->addValidator('NotEmpty');

        $title= new Zend_Form_Element_Text('title');

        $title->setLabel('Title')

            ->setRequired(true)

            ->addFilter('StripTags')

            ->addFilter('StringTrim')

            ->addValidator('NotEmpty');

        $submit= new Zend_Form_Element_Submit('submit');

        $submit->setAttrib('id', 'submitbutton');

        $this->addElements(array($id, $artist, $title, $submit));

    }

}

在 AlbumForm 的构造函数中,我们创建了包括四个元素的表单:id, artist, title 和 submit 按钮。每个元素都设置了不同的属性,包括要显示的文本标签。对于文本元素,我们增加了两个过滤器, StripTags 和 StringTrim,它们分别用来删除不必要的 HTML 标记和不必要的空格。我们还将它们设置为必需的字段,通过添加一个NotEmpty验证器来保证用户确实输入了我们需要的信息。

现在我们需要显示这个表单,并能在表单提交后进行处理。这可以通过 addAction()来实现:

zf-tutorial/application/controllers/IndexController.php

...

function addAction()

{

    $this->view->title = "Add New Album";

    $form= new AlbumForm();

    $form->submit->setLabel('Add');

    $this->view->form = $form;

    if ($this->_request->isPost()) {

        $formData= $this->_request->getPost();

        if ($form->isValid($formData)) {

            $albums= new Albums();

            $row= $albums->createRow();

            $row->artist = $form->getValue('artist');

            $row->title = $form->getValue('title');

            $row->save();

            $this->_redirect('/');

        }else {

            $form->populate($formData);

        }

    }

}

..

我们再详细分析一下这段代码。

$form = new AlbumForm();

$form->submit->setLabel('Add');

$this->view->form = $form;

创建了一个 AlbumForm 的新实例$form,将表单提交按钮的标签改为“ Add”,然后将$form 保存到视图的form 属性,这样将来可以显示它。

if ($this->_request->isPost()){

$formData = $this->_request->getPost();

if ($form->isValid($formData)) {

如果请求对象(request object)的 isPost()方法返回 true,说明这个表单处于提交状态,我们就用 getPost()方法从请求对象中获取表单提交的数据,然后用 isValid()成员函数来验证表单是否有效:

$albums = new Albums();

$row = $albums->createRow();

$row->artist = $form->getValue('artist');

$row->title = $form->getValue('title');

$row->save();

$this->_redirect('/');

如果表单有效,我们创建一个新的 Albums 模型类的实例,使用createRow()方法来生成一条新记录,再将artist 和 title 信息填充到这条新记录中,最后再将其保存到数据库中。在保存工作完成后,用控制器的_redirect()方法重定向到主页上。

} else {

$form->populate($formData);

}

如果表单无效,则将用户输入的数据重新填回表单显示给用户。

现在需要在显示脚本 add.phtml 中显示表单:

zf-tutorial/application/views/scripts/index/add.phtml

<?php echo $this->form ;?>

显示表单非常简单,因为表单知道如何显示自己。

修改唱片信息

修改唱片信息与增加新唱片的过程非常相似,因此它们的代码也很像:

zf-tutorial/application/controllers/IndexController.php

...

    function editAction() {

        $this->view->title = "Edit Album";

        $form= new AlbumForm ();

        $form->submit->setLabel ( 'Save' );

        $this->view->form = $form;

        if ($this->_request->isPost ()) {

            $formData= $this->_request->getPost ();

            if ($form->isValid ( $formData )) {

                $albums= new Albums ();

                $id= ( int ) $form->getValue ( 'id' );

                $row= $albums->fetchRow ( 'id=' . $id );

                $row->artist = $form->getValue ( 'artist' );

                $row->title = $form->getValue ( 'title' );

                $row->save();

                $this->_redirect( '/' );

            }else {

                $form->populate( $formData );

            }

        }else {

            // album id is expected in $params['id']

            $id= ( int ) $this->_request->getParam ( 'id', 0 );

            if ($id > 0) {

                $albums= new Albums ();

                $album= $albums->fetchRow ( 'id=' . $id );

                $form->populate( $album->toArray () );

            }

        }

    }

...

先看一下修改唱片信息与增加新唱片操作的不同。修改唱片时我们首先需要从数据库中将原唱片信息获取出来,然后填充到表单元素中再显示:

// album id is expected in $params['id']

$id = (int)$this->_request->getParam('id', 0);

if ($id > 0) {

$albums = new Albums();

$album = $albums->fetchRow('id='.$id);

$form->populate($album->toArray());

}

如果请求不是 POST,那么将执行这个填充过程,它通过模型从数据库中获取记录的值。我们可以使用Zend_Db_Table_Row类的成员函数 toArray()来直接填充表单。

最后我们需要将数据重新写回数据库的相应记录。这可以通过先获取相应记录,再保存该记录的方式来实现。

$albums = new Albums();

$id = (int)$form->getValue('id');

$row = $albums->fetchRow('id='.$id);

视图模板与add.phtml相同:

zf-tutorial/application/views/scripts/index/edit.phtml

<?php echo $this->form ;?>

现在我们的程序可以增加、修改唱片记录了。

删除唱片

为了使程序完整,还需要一个删除操作。在主页的唱片列表中每张唱片都有一个删除该唱片的链接,当点击该链接时相应的唱片记录就会被删除,但这样做是错误的。记住我们的 HTTP 规范,对于不可逆的操作,不应该使用 GET,而应使用 POST

当用户点击删除链接时我们应该显示一个确认表单,只有在用户选择了“是”的时候我们才做这个删除操作。因为这个表单非常简单,我们直接将表单的 HTML 代码写到显示脚本中。先看代码:

zf-tutorial/application/controllers/IndexController.php

...

    function deleteAction() {

        $this->view->title = "Delete Album";

        if ($this->_request->isPost ()) {

            $id= ( int ) $this->_request->getPost ( 'id' );

            $del= $this->_request->getPost ( 'del' );

            if ($del == 'Yes' && $id > 0) {

                $albums= new Albums ();

                $where= 'id = ' . $id;

                $albums->delete( $where );

            }

            $this->_redirect( '/' );

        }else {

            $id= ( int ) $this->_request->getParam ( 'id' );

            if ($id > 0) {

                $albums= new Albums ();

                $this->view->album = $albums->fetchRow ( 'id=' . $id );

            }

        }

    }

...

这段程序通过使用请求对象的 isPost()方法来确定是显示确认表单还是用 Album()类来做删除操作。实际的删除操作是通过调用 Zend_Db_Table 的 delete()方法来完成的。如果不是 POST 请求,就通过 id 参数将相应的记录从数据库中读取出来并保存至视图中。

显示脚本包含一个简单的表单:

zf-tutorial/application/views/scripts/index/delete.phtml

<?php if ($this->album) :?>

<p>Are you sure that you wantto delete

'<?php echo $this->escape($this->album->title); ?>' by

'<?php echo $this->escape($this->album->artist); ?>'?

</p>

<form action="<?php echo $this->url(array('action'=>'delete')); ?>"

method="post">

<div>

<input type="hidden" name="id" value="<?php echo $this->album->id; ?>" />

<input type="submit" name="del" value="Yes" />

<input type="submit" name="del" value="No" />

</div>

</form>

<?php else: ?>

<p>Cannot find album.</p>

<?php endif;?>

在这段代码中,我们先显示一段确认信息给用户,其后跟随一个包括 Yes 和 No 的按钮的表单。在动作代码中做删除操作时先检查是否含有“ Yes”值。

现在你已经有了一个完整的程序了,就这么简单 :-)

故障检查

如果index/index之外的动作出现问题,通常是因为路由类不能确定网站在哪个子目录下。根据我目前的观察,这通常是由于网站的url路径与web根目录的路径不同。

如果缺省的代码不能工作,就应该将$baseURL设置成服务器的正确路径:

zf-tutorial/public/index.php

...

// setup controller

$frontController =Zend_Controller_Front::getInstance();

$frontController->throwExceptions(true);

$frontController->setControllerDirectory('../application/controllers');

$frontController->setBaseUrl('/mysubdir/zf-tutorial/public');

Zend_Layout::startMvc(array('layoutPath'=>'../application/layouts'));

...

此处应该将'/mysubdir/zf-tutorial/public'替换成访问 index.php的正确的路径。例如,访问index.php的路径是http://localhost/~ralle/zf-tutorial/public/index.php,那么$baseUrl就是 '/~ralle/zf-tutorial/public'。

结束语

使用Zend Framework来创建的简单但功能全面的MVC应用程序到此就结束了。希望你觉得它有意思并能给你带来一些有用的信息。如果你发现有什么地方错了,请发邮件至rob@akrabat.com!

本教程只讨论了Zend Framework最基本的用法,还有很多的类等待你去探索!如果想对它有更深刻的理解,一定要记得阅读它的手册(http://framework.zend.com/manual)或wiki (http://framework.zend.com/wiki) !

如果对开发Zend Framework本身有兴趣,那么http://framework.zend.com/developer一定值得你一看。

另外,如果你喜欢捧着书看,作者正在写《Zend Framework In Action》,现在已经可以预订。更详细的信息请访问网站 http://www.zendframeworkinaction.com. Check it out ☺

译注:《Zend Framework In Action》一书已出版,目前中文版国内还没有引进。

 

最后看看我的目录结构:

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问控制 2.1.6. 查询 ACL 2.2. 精细的访问控制 2.2.1. 精细的访问控制 2.2.2. 除去访问控制 2.3. 高级用法 2.3.1. 保存 ACL 数据确保持久性 2.3.2. 使用声明(Assert)来编写条件性的 ACL 规则 3. Zend_Auth 3.1. 简介 3.1.1. 适配器 3.1.2. 结果 3.1.3. 身份的持久(Persistence) 3.1.3.1. 在PHP Session 中的缺省持久(Persistence) 3.1.3.2. 实现订制存储 3.1.4. 使用Zend_Auth 3.2. 数据库表认证 3.2.1. 简介 3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 3.4.3. 配置选项 3.4.4. Resolvers 3.4.4.1. 文件 Resolver 3.4.5. 基本用法 4. Zend_Cache 4.1. 简介 4.2. 缓存原理 4.2.1. Zend_Cache 工厂方法 4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. Zend_Cache前端 4.3.1. Zend_Cache_Core 4.3.1.1. 简介 4.3.1.2. 可用选项 4.3.1.3. 例子 4.3.2. Zend_Cache_Frontend_Output 4.3.2.1. 简介 4.3.2.2. 可用的选项 4.3.2.3. 例子 4.3.3. Zend_Cache_Frontend_Function 4.3.3.1. Introduction 4.3.3.2. A可用的选项 4.3.3.3. 例子 4.3.4. Zend_Cache_Frontend_Class 4.3.4.1. Introduction 4.3.4.2. Available options 4.3.4.3. Examples 4.3.5. Zend_Cache_Frontend_File 4.3.5.1. Introduction 4.3.5.2. Available options 4.3.5.3. Examples 4.3.6. Zend_Cache_Frontend_Page 4.3.6.1. Introduction 4.3.6.2. Available options (for this frontend in Zend_Cache factory) 4.3.6.3. Examples 4.4. Zend_Cache后端 4.4.1. Zend_Cache_Backend_File 4.4.2. Zend_Cache_Backend_Sqlite 4.4.3. Zend_Cache_Backend_Memcached 4.4.4. Zend_Cache_Backend_Apc 4.4.5. Zend_Cache_Backend_ZendPlatform 5. Zend_Config 5.1. 简介 5.2. 操作理论 5.3. Zend_Config_Ini 5.4. Zend_Config_Xml 6. Zend_Console_Getopt 6.1. Getopt 简介 6.2. 声明 Getopt 规则 6.2.1. 用短语法声明选项 6.2.2. 用长语法声明选项 6.3. 读取(Fetching)选项和参数 6.3.1. 操作 Getopt 异常 6.3.2. 通过名字读取 (Fetching)选项 6.3.3. 报告选项 6.3.4. 读取非选项参数 6.4. 配置 Zend_Console_Getopt 6.4.1. 添加选项规则 6.4.2. 添加帮助信息 6.4.3. 添加选项别名 6.4.4. 添加参数列表 6.4.5. 添加配置 7. Zend_Controller 7.1. Zend_Controller 快速入门 7.1.1. 简介 7.1.2. 入门 7.1.2.1. 文件系统的组织结构 7.1.2.2. 设置文件根目录 7.1.2.3. 创建URL重写规则 7.1.2.4. 创建你的bootstrap文件 7.1.2.5. 创建默认的控制器(Action Controller) 7.1.2.6. 创建你的视图脚本 7.1.2.7. 创建你自己的错误控制器 7.1.2.8. 访问站点! 7.2. Zend_Controller 基础 7.3. 前端控制器 7.3.1. 概述 7.3.2. 主要方法 7.3.2.1. getInstance() 7.3.2.2. setControllerDirectory() 和 addControllerDirectory() 7.3.2.3. dispatch() 7.3.2.4. run() 7.3.3. 环境访问器方法 7.3.4. 前端控制器参数 7.3.5. 继承前端控制器 7.4. 请求对象 7.4.1. 介绍 7.4.2. HTTP 请求 7.4.2.1. 访问请求数据 7.4.2.2. 基地址和子目录 7.4.2.3. 决定请求方式 7.4.2.4. 删除 AJAX 请求 7.4.3. 子类化请求对象 7.5. 标准路由器:Zend_Controller_Router_Rewrite 7.5.1. 简介 7.5.2. 使用路由器 7.5.3. 基本的Rewrite路由器操作 7.5.4. 缺省路由 7.5.5. 基本 URL 和子目录 7.5.6. Route Types 7.5.6.1. Zend_Controller_Router_Route 7.5.6.1.1. 变量缺省 7.5.6.1.2. 变量请求 7.5.6.2. Zend_Controller_Router_Route_Static 7.5.6.3. Zend_Controller_Router_Route_Regex 7.5.7. 使用 Zend_Config with the RewriteRouter 7.5.8. Subclassing the Router 7.6. 分发器 7.6.1. 概述 7.6.2. 子类化分发器 7.7. 动作控制器 7.7.1. 简介 7.7.2. 对象初始化 7.7.3. 派遣前后的钩子 7.7.4. 访问器 7.7.5. 视图集成 7.7.5.1. 视图初始化 7.7.5.2. 解析(Rendering)视图 7.7.6. 实用方法 7.7.7. 继承(Subclassing)动作控制器 7.8. 动作助手 7.8.1. 介绍 7.8.2. 初始化助手 7.8.3. 助手经纪人 7.8.4. 内建的动作助手 7.8.4.1. 动作堆栈(助手) 7.8.4.2. AutoComplete 7.8.4.2.1. AutoCompletion with Dojo 7.8.4.2.2. AutoCompletion with Scriptaculous 7.8.4.3. ContextSwitch and AjaxContext 7.8.4.3.1. 缺省可用的上下文 7.8.4.3.2. 创建定制的上下文 7.8.4.3.3. 为每个动作设置上下文 7.8.4.3.4. 初始化上下文开关 7.8.4.3.5. 另外的功能 7.8.4.3.6. AjaxContext 函数 7.8.4.4. FlashMessenger 7.8.4.4.1. 简介 7.8.4.4.2. Basic Usage Example 7.8.4.5. JSON 7.8.4.6. 转向器(Redirector) 7.8.4.6.1. 介绍 7.8.4.6.2. 基础用例 7.8.4.7. ViewRenderer 7.8.4.7.1. 介绍 7.8.4.7.2. API 7.8.4.7.3. 基础用法示例 7.8.4.7.4. 高级用法示例 7.8.5. 编写自己的助手 7.9. 响应对象 7.9.1. 用法 7.9.2. 处理消息头 7.9.3. 命名片段 7.9.4. 在响应对象中测试异常 7.9.5. 子类化响应对象 7.10. 插件 7.10.1. 简介 7.10.2. 编写插件 7.10.3. 使用插件 7.10.4. 获取和控制插件 7.10.5. 包含在标准发行包中的插件 7.10.5.1. 动作堆栈 7.10.5.2. Zend_Controller_Plugin_ErrorHandler 7.10.5.2.1. 使用 ErrorHandler 作为一个 404 处理器(handler) 7.10.5.2.2. 处理以前呈现的(rendered)输出 7.10.5.2.3. 插件用法示例 7.10.5.2.4. 错误控制器示例 7.11. 使用传统的模块目录结构 7.11.1. 简介 7.11.2. 指定模块控制器目录 7.11.3. Routing to modules 7.11.4. 模块或全局缺省控制器 7.12. MVC 异常 7.12.1. 介绍 7.12.2. 如何处理异常? 7.12.3. 可能遭遇的MVC异常 7.13. 从以前的版本移植 7.13.1. 从 1.0.x 到 1.5.0 或更新的版本的移植 7.13.2. 从 0.9.3 到 1.0.0RC1 或更新的版本的移植 7.13.3. 从 0.9.2 移植到 0.9.3 或更新的版本 7.13.4. 从 0.6.0 移植到 0.8.0 或更新的版本 7.13.5. 从 0.2.0 或以前的版本移植到 0.6.0 8. Zend_Currency 8.1. Zend_Currency 简介 8.1.1. 为什么使用 Zend_Currency ? 8.2. 如何使用货币 8.2.1. 从货币创建输出 8.2.2. 修改货币格式 8.2.3. Zend_Currency 的信息方法 8.2.4. 设置新缺省值 8.2.5. 加速 Zend_Currency 8.3. 从前面的版本迁移 8.3.1. 从 1.0.2 到 1.0.3 或更新的迁移 9. Zend_Date 9.1. Introduction 9.1.1. Always Set a Default Timezone 9.1.2. Why Use Zend_Date? 9.2. 操作理论 9.2.1. 内部(Internals) 9.3. Basic Methods 9.3.1. The current date 9.3.2. Zend_Date by Example 9.3.2.1. Ouput a Date 9.3.2.2. Setting a Date 9.3.2.3. Adding and Subtracting Dates 9.3.2.4. Comparation of dates 9.4. Zend_Date API Overview 9.4.1. Zend_Date Options 9.4.1.1. Selecting the date format type 9.4.1.2. DST and Date Math 9.4.1.3. Month Calculations 9.4.1.4. Speed up date localization and normalization with Zend_Cache 9.4.1.5. Receiving syncronised timestamps with Zend_TimeSync 9.4.2. Working with Date Values 9.4.3. Basic Zend_Date Operations Common to Many Date Parts 9.4.3.1. List of Date Parts 9.4.3.2. List of Date Operations 9.4.4. Comparing Dates 9.4.5. Getting Dates and Date Parts 9.4.6. Working with Fractions of Seconds 9.4.7. Sunrise / Sunset 9.5. Creation of dates 9.5.1. Create the actual date 9.5.2. Create a date from database 9.5.3. Create dates from an array 9.6. Constants for General Date Functions 9.6.1. Using Constants 9.6.2. List of All Constants 9.6.3. Self-Defined OUTPUT Formats with ISO 9.6.4. Self-defined OUTPUT formats using PHP's date() format specifiers 9.7. Working examples 9.7.1. Checking dates 9.7.2. Sunrise and Sunset 9.7.3. Timezones 10. Zend_Db 10.1. Zend_Db_Adapter 10.1.1. 简介 10.1.2. 添加引号防止数据库攻击 10.1.3. 直接查询 10.1.4. 事务处理 10.1.5. 插入数据行 10.1.6. 更新数据行 10.1.7. 删除数据行 10.1.8. 取回查询结果 10.2. Zend_Db_Statement 10.2.1. Creating a Statement 10.2.2. Executing a Statement 10.2.3. Fetching Results from a SELECT Statement 10.2.3.1. Fetching a Single Row from a Result Set 10.2.3.2. Fetching a Complete Result Set 10.2.3.3. Changing the Fetch Mode 10.2.3.4. Fetching a Single Column from a Result Set 10.2.3.5. Fetching a Row as an Object 10.3. Zend_Db_Profiler 10.3.1. Introduction 10.3.2. Using the Profiler 10.3.3. Advanced Profiler Usage 10.3.3.1. Filter by query elapsed time 10.3.3.2. Filter by query type 10.3.3.3. Retrieve profiles by query type 10.4. Zend_Db_Select 10.4.1. 简介 10.4.2. 同一表中查询多列数据 10.4.3. 多表联合查询 10.4.4. WHERE条件 10.4.5. GROUP BY分句 10.4.6. HAVING 条件 10.4.7. ORDER BY 分句 10.4.8. 通过总数和偏移量进行LIMIT限制 10.4.9. 通过页数和总数进行LIMIT限制 10.5. Zend_Db_Table 10.5.1. 简介 10.5.2. 开始 10.5.3. 表名和主键 10.5.4. 插入数据 10.5.5. 更新数据 10.5.6. Deleting Rows 10.5.7. 根据主键查找数据 10.5.8. 取回一条记录 10.5.9. 取回多条记录 10.5.10. Adding Domain Logic 10.6. Zend_Db_Table_Row 10.6.1. 简介 10.6.2. 取回一条记录 10.6.3. 修改数据 10.7. Zend_Db_Table_Rowset 10.7.1. 简介 10.7.2. 取回结果集 10.7.3. 遍历结果集 10.8. Zend_Db_Table Relationships 10.8.1. Introduction 10.8.2. Defining Relationships 10.8.3. Fetching a Dependent Rowset 10.8.4. Fetching a Parent Row 10.8.5. Fetching a Rowset via a Many-to-many Relationship 10.8.6. Cascading Write Operations 10.8.6.1. Notes Regarding Cascading Operations 11. Zend_Debug 11.1. 输出变量的值 (Dumping Variables) 12. Zend_Exception 12.1. 使用“异常” 13. Zend_Feed 13.1. 介绍 13.2. 导入Feeds 13.2.1. 定制 feeds 13.2.1.1. 导入定制的数组 13.2.1.2. 导入定制的数据源 13.2.1.3. Dumping feed 内容 13.3. 从网页上获得Feed 13.4. RSS Feed的使用 13.5. Atom Feed的使用 13.6. 单个Atom条目的处理 13.7. 修改Feed和条目结构 13.8. 自定义Feed和条目类 14. Zend_Filter 14.1. 简介 14.1.1. 什么是过滤器(filter)? 14.1.2. 过滤器的基本用法 14.1.3. 使用静态 get() 方法 14.2. 标准过滤器类 14.2.1. Alnum 14.2.2. Alpha 14.2.3. BaseName 14.2.4. Digits 14.2.5. Dir 14.2.6. HtmlEntities 14.2.7. Int 14.2.8. RealPath 14.2.9. StringToLower 14.2.10. StringToUpper 14.2.11. StringTrim 14.2.12. StripTags 14.3. 过滤器链 14.4. 编写过滤器 14.5. Zend_Filter_Input 14.5.1. Declaring Filter and Validator Rules 14.5.2. Creating the Filter and Validator Processor 14.5.3. Retrieving Validated Fields and other Reports 14.5.3.1. Querying if the input is valid 14.5.3.2. Getting Invalid, Missing, or Unknown Fields 14.5.3.3. Getting Valid Fields 14.5.4. Using Metacommands to Control Filter or Validator Rules 14.5.4.1. The FIELDS metacommand 14.5.4.2. The PRESENCE metacommand 14.5.4.3. The DEFAULT_VALUE metacommand 14.5.4.4. The ALLOW_EMPTY metacommand 14.5.4.5. The BREAK_CHAIN metacommand 14.5.4.6. The MESSAGES metacommand 14.5.4.7. Using options to set metacommands for all rules 14.5.5. Adding Filter Class Namespaces 14.6. Zend_Filter_Inflector 14.6.1. Operation 14.6.2. Setting Paths To Alternate Filters 14.6.3. Setting the Inflector Target 14.6.4. Inflection Rules 14.6.4.1. Static Rules 14.6.4.2. Filter Inflector Rules 14.6.4.3. Setting Many Rules At Once 14.6.5. Utility Methods 14.6.6. Using Zend_Config with Zend_Filter_Inflector 15. Zend_Form 15.1. Zend_Form 15.2. Zend_Form 快速起步 15.2.1. 创建表单对象 15.2.2. 添加表单元素 15.2.3. 解析(Render)表单 15.2.4. 检查表单是否有效 15.2.5. 获得错误状态 15.2.6. 放到一起 15.2.7. 使用 Zend_Config 对象 15.2.8. 结论 15.3. 使用 Zend_Form_Element 生成表单元素 15.3.1. 插件加载器 15.3.2. 过滤器 15.3.3. 校验器 15.3.4. 装饰器 15.3.5. 元数据和属性 15.3.6. 标准元素 15.3.7. Zend_Form_Element 方法 15.3.8. 配置 15.3.9. 定制元素 15.4. 使用 Zend_Form 生成表单 15.4.1. 插件加载器 15.4.2. 元素(Elements) 15.4.2.1. 组装和读取数值 15.4.2.2. 全局操作 15.4.2.3. 和元素交互使用的方法 15.4.3. 显示组(Display Groups) 15.4.3.1. 全局操作 15.4.3.2. 使用定制的显示组类 15.4.3.3. 和显示组交互使用的方法 15.4.3.4. Zend_Form_DisplayGroup 方法 15.4.4. 子表单 15.4.4.1. 全局操作 15.4.4.2. 和子表单交互使用的方法 15.4.5. 元数据(Metadata)和属性(Attributes) 15.4.6. 装饰器 15.4.7. 校验 15.4.8. 方法 15.4.9. 配置 15.4.10. 定制表单 15.5. 使用 Zend_Form_Decorator 生成定制的表单标识(Markup) 15.5.1. 操作 15.5.2. 标准装饰器 15.5.3. 定制装饰器 15.6. Zend Framework 带有的标准表单元素 15.6.1. Zend_Form_Element_Button 15.6.2. Zend_Form_Element_Checkbox 15.6.3. Zend_Form_Element_Hidden 15.6.4. Zend_Form_Element_Hash 15.6.5. Zend_Form_Element_Image 15.6.6. Zend_Form_Element_MultiCheckbox 15.6.7. Zend_Form_Element_Multiselect 15.6.8. Zend_Form_Element_Password 15.6.9. Zend_Form_Element_Radio 15.6.10. Zend_Form_Element_Reset 15.6.11. Zend_Form_Element_Select 15.6.12. Zend_Form_Element_Submit 15.6.13. Zend_Form_Element_Text 15.6.14. Zend_Form_Element_Textarea 15.7. Zend Framework 带有的标准表单装饰器(Decorators) 15.7.1. Zend_Form_Decorator_Callback 15.7.2. Zend_Form_Decorator_Description 15.7.3. Zend_Form_Decorator_DtDdWrapper 15.7.4. Zend_Form_Decorator_Errors 15.7.5. Zend_Form_Decorator_Fieldset 15.7.6. Zend_Form_Decorator_Form 15.7.7. Zend_Form_Decorator_FormElements 15.7.8. Zend_Form_Decorator_HtmlTag 15.7.9. Zend_Form_Decorator_Image 15.7.10. Zend_Form_Decorator_Label 15.7.11. Zend_Form_Decorator_ViewHelper 15.7.12. Zend_Form_Decorator_ViewScript 15.8. Zend_Form 的国际化 15.8.1. 在表单中初始化 I18n 15.8.2. 标准 I18N 目标 15.9. Zend_Form 的高级用法 15.9.1. 数组符号(Notation) 15.9.2. 多页表单 16. Zend_Gdata 16.1. Introduction to Gdata 16.1.1. Structure of Zend_Gdata 16.1.2. Interacting with Google Services 16.1.3. Obtaining instances of Zend_Gdata classes 16.1.4. Google Data Client Authentication 16.1.5. Dependencies 16.1.6. Creating a new Gdata client 16.1.7. Common query parameters 16.1.8. Fetching a feed 16.1.9. Working with multi-page feeds 16.1.10. Working with data in feeds and entries 16.1.11. Updating entries 16.1.12. Posting entries to Google servers 16.1.13. Deleting entries on Google servers 16.2. Authenticating with AuthSub 16.2.1. Creating an AuthSub authenticated Http Client 16.2.2. Revoking AuthSub authentication 16.3. Authenticating with ClientLogin 16.3.1. Creating a ClientLogin authenticated Http Client 16.3.2. Terminating a ClientLogin authenticated Http Client 16.4. Using Google Calendar 16.4.1. Connecting To The Calendar Service 16.4.1.1. Authentication 16.4.1.2. Creating A Service Instance 16.4.2. Retrieving A Calendar List 16.4.3. Retrieving Events 16.4.3.1. Queries 16.4.3.2. Retrieving Events In Order Of Start Time 16.4.3.3. Retrieving Events In A Specified Date Range 16.4.3.4. Retrieving Events By Fulltext Query 16.4.3.5. Retrieving Individual Events 16.4.4. Creating Events 16.4.4.1. Creating Single-Occurrence Events 16.4.4.2. Event Schedules and Reminders 16.4.4.3. Creating Recurring Events 16.4.4.4. Using QuickAdd 16.4.5. Modifying Events 16.4.6. Deleting Events 16.4.7. Accessing Event Comments 16.5. Using Google Documents List Data API 16.5.1. Get a List of Documents 16.5.2. Upload a Document 16.5.3. Searching the documents feed 16.5.3.1. Get a List of Word Processing Documents 16.5.3.2. Get a List of Spreadsheets 16.5.3.3. Performing a text query 16.6. Using Google Spreadsheets 16.6.1. Create a Spreadsheet 16.6.2. Get a List of Spreadsheets 16.6.3. Get a List of Worksheets 16.6.4. Interacting With List-based Feeds 16.6.4.1. Get a List-based Feed 16.6.4.2. Reverse-sort Rows 16.6.4.3. Send a Structured Query 16.6.4.4. Add a Row 16.6.4.5. Edit a Row 16.6.4.6. Delete a Row 16.6.5. Interacting With Cell-based Feeds 16.6.5.1. Get a Cell-based Feed 16.6.5.2. Send a Cell Range Query 16.6.5.3. Change Contents of a Cell 16.7. Using Google Apps Provisioning 16.7.1. Setting the current domain 16.7.1.1. Setting the domain for the service class 16.7.1.2. Setting the domain for query classes 16.7.2. Interacting with users 16.7.2.1. Creating a user account 16.7.2.2. Retrieving a user account 16.7.2.3. Retrieving all users in a domain 16.7.2.4. Updating a user account 16.7.2.4.1. Resetting a user's password 16.7.2.4.2. Forcing a user to change their password 16.7.2.4.3. Suspending a user account 16.7.2.4.4. Granting administrative rights 16.7.2.5. Deleting user accounts 16.7.3. Interacting with nicknames 16.7.3.1. Creating a nickname 16.7.3.2. Retrieving a nickname 16.7.3.3. Retrieving all nicknames for a user 16.7.3.4. Retrieving all nicknames in a domain 16.7.3.5. Deleting a nickname 16.7.4. Interacting with email lists 16.7.4.1. Creating an email list 16.7.4.2. Retrieving all email lists to which a recipient is subscribed 16.7.4.3. Retrieving all email lists in a domain 16.7.4.4. Deleting an email list 16.7.5. Interacting with email list recipients 16.7.5.1. Adding a recipient to an email list 16.7.5.2. Retrieving the list of subscribers to an email list 16.7.5.3. Removing a recipient from an email list 16.7.6. Handling errors 16.8. Using Google Base 16.8.1. Connect To The Base Service 16.8.1.1. Authentication 16.8.1.2. Create A Service Instance 16.8.2. Retrieve Items 16.8.2.1. Send a Structured Query 16.8.2.1.1. Query Customer Items Feed 16.8.2.1.2. Query Snippets Feed 16.8.2.2. Iterate through the Items 16.8.3. Insert, Update, and Delete Customer Items 16.8.3.1. Insert an Item 16.8.3.2. Modify an Item 16.8.3.3. Delete an Item 16.9. Using the YouTube data API 16.9.1. Retrieving video feeds 16.9.1.1. Searching for videos by metadata 16.9.1.2. Searching for videos by categories and tags/keywords 16.9.1.3. Retrieving standard feeds 16.9.1.4. Retrieving videos uploaded by a user 16.9.1.5. Retrieving videos favorited by a user 16.9.1.6. Retrieving video responses for a video 16.9.2. Retrieving video comments 16.9.3. Retrieving playlist feeds 16.9.3.1. Retrieving the playlists of a user 16.9.3.2. Retrieving a specific playlist 16.9.4. Retrieving a list of a user's subscriptions 16.9.5. Retrieving a user's profile 16.10. Using Picasa Web Albums 16.10.1. Connecting To The Service 16.10.1.1. Authentication 16.10.1.2. Creating A Service Instance 16.10.2. Understanding and Constructing Queries 16.10.3. Retrieving Feeds And Entries 16.10.3.1. Retrieving A User 16.10.3.2. Retrieving An Album 16.10.3.3. Retrieving A Photo 16.10.3.4. Retrieving A Comment 16.10.3.5. Retrieving A Tag 16.10.4. Creating Entries 16.10.4.1. Creating An Album 16.10.4.2. Creating A Photo 16.10.4.3. Creating A Comment 16.10.4.4. Creating A Tag 16.10.5. Deleting Entries 16.10.5.1. Deleting An Album 16.10.5.2. Deleting A Photo 16.10.5.3. Deleting A Comment 16.10.5.4. Deleting A Tag 16.10.5.5. Optimistic Concurrency (Notes On Deletion) 16.11. Catching Gdata Exceptions 17. Zend_Http 17.1. Zend_Http_Client 17.1.1. 简介 17.1.2. 带有指定的HTTP头的基本 GET 请求 17.1.3. 发送请求到多个域名 17.1.4. 改变HTTP timeout时间 17.1.5. 动态指定HTTP Header 17.1.6. 构造 HTTP POST, PUT, 和 DELETE 请求 17.2. Zend_Http_Client - Advanced Usage 17.2.1. HTTP Redirections 17.2.2. Adding Cookies and Using Cookie Persistence 17.2.3. Setting Custom Request Headers 17.2.4. File Uploads 17.2.5. Sending Raw POST Data 17.2.6. HTTP Authentication 17.2.7. Sending Multiple Requests With the Same Client 17.3. Zend_Http_Client - Connection Adapters 17.3.1. Overview 17.3.2. The Socket Adapter 17.3.3. The Proxy Adapter 17.3.4. The Test Adapter 17.3.5. Creating your own connection adapters 17.4. Zend_Http_Cookie and Zend_Http_CookieJar 17.4.1. Introduction 17.4.2. Instantiating Zend_Http_Cookie Objects 17.4.3. Zend_Http_Cookie getter methods 17.4.4. Zend_Http_Cookie: Matching against a scenario 17.4.5. The Zend_Http_CookieJar Class: Instantiation 17.4.6. Adding Cookies to a Zend_Http_CookieJar object 17.4.7. Retrieving Cookies From a Zend_Http_CookieJar object 17.5. Zend_Http_Response 17.5.1. 简介 18. Zend_Json 18.1. 简介 18.2. 基本用法 18.3. JSON 对象 18.4. XML 到 JSON 转换 19. Zend_Layout 19.1. 简介 19.2. Zend_Layout 快速入门 19.2.1. 布局脚本 19.2.2. 和Zend Framework MVC一起使用 Zend_Layout 19.2.3. 使用Zend_Layout做为独立的组件 19.2.4. 尝试一下布局 19.3. Zend_Layout 配置选项 19.3.1. 范例 19.4. Zend_Layout 高级用法 19.4.1. 定制视图对象 19.4.2. 定制前端控制器插件 19.4.3. 定制动作助手 19.4.4. 定制布局脚本路径解析(Resolution):使用变形器(Inflector) 20. Zend_Loader 20.1. 动态加载文件和类 20.1.1. 加载文件 20.1.2. 加载类 20.1.3. 判定某个文件是否可读 20.1.4. 使用 Autoloader 20.2. 加载插件 20.2.1. 基本用例 20.2.2. 处理插件路径 20.2.3. 测试插件和获取类的名字 21. Zend_Locale 21.1. Introduction 21.1.1. What is Localization 21.1.2. What is a Locale? 21.1.3. How are Locales Represented? 21.1.4. Selecting the Right Locale 21.1.5. Usage of automatic Locales 21.1.6. Using a default Locale 21.1.7. ZF Locale-Aware Classes 21.1.8. Zend_Locale_Format::setOptions(array $options) 21.1.9. Speed up Zend_Locale and it's subclasses 21.2. Using Zend_Locale 21.2.1. Copying, Cloning, and Serializing Locale Objects 21.2.2. Equality 21.2.3. Default locales 21.2.4. Set a new locale 21.2.5. Getting the language and region 21.2.6. Obtaining localized strings 21.2.7. Obtaining translations for "yes" and "no" 21.2.8. Get a list of all known locales 21.3. Normalization and Localization 21.3.1. Number normalization: getNumber($input, Array $options) 21.3.1.1. Precision and Calculations 21.3.2. Number localization 21.3.3. Number testing 21.3.4. Float value normalization 21.3.5. Floating point value localization 21.3.6. Floating point value testing 21.3.7. Integer value normalization 21.3.8. Integer point value localization 21.3.9. Integer value testing 21.3.10. Numeral System Conversion 21.3.10.1. List of supported numeral systems 21.4. Working with Dates and Times 21.4.1. Normalizing Dates and Times 21.4.2. Testing Dates 21.4.3. Normalizing a Time 21.4.4. Testing Times 21.5. Supported Languages for Locales 21.6. Supported Regions for Locales 22. Zend_Log 22.1. 概述 22.1.1. 创建Log 22.1.2. 日志消息 22.1.3. 销毁Log 22.1.4. 使用内建的消息等级 22.1.5. 添加用户定义的日志等级 22.1.6. 理解日志事件 22.2. Writers 22.2.1. 写入到流(Streams) 22.2.2. 写入到数据库 22.2.3. 踩熄Writer 22.2.4. 测试 Mock 22.2.5. 组合Writers 22.3. Formatters 22.3.1. 简单格式化 22.3.2. 格式化到XML 22.4. 过滤器 22.4.1. 对所有Writer过滤 22.4.2. 过滤一个Writer实例 23. Zend_Mail 23.1. 简介 23.1.1. 起步 23.1.2. 配置缺省的 sendmail 传送器(transport) 23.2. 通过SMTP发送邮件 23.3. 通过一个SMTP连接发送多个邮 23.4. 使用不同的Transport对象 23.5. HTML邮件 23.6. 附件 23.7. 增加收件人 23.8. 控制MIME分界线 23.9. 外加邮件头信息 23.10. 字符集 23.11. 编码 23.12. SMTP 身份验证 23.13. Securing SMTP Transport 23.14. Reading Mail Messages 23.14.1. Simple example using Pop3 23.14.2. Opening a local storage 23.14.3. Opening a remote storage 23.14.4. Fetching messages and simple methods 23.14.5. Working with messages 23.14.6. Checking for flags 23.14.7. Using folders 23.14.8. Advanced Use 23.14.8.1. Using NOOP 23.14.8.2. Caching instances 23.14.8.3. Extending Protocol Classes 23.14.8.4. Using Quota (since 1.5) 24. Zend_Measure 24.1. Introduction 24.2. Creation of Measurements 24.2.1. Creating measurements from integers and floats 24.2.2. Creating measurements from strings 24.2.3. Measurements from localized strings 24.3. Outputting measurements 24.3.1. Automatic output 24.3.2. Outputting values 24.3.3. Output with unit of measurement 24.3.4. Output as localized string 24.4. Manipulating Measurements 24.4.1. Convert 24.4.2. Add and subtract 24.4.3. Compare 24.4.4. Compare 24.4.5. Manually change values 24.4.6. Manually change types 24.5. Types of measurements 24.5.1. Hints for Zend_Measure_Binary 24.5.2. Hints for Zend_Measure_Number 24.5.3. Roman numbers 25. Zend_Memory 25.1. 概述 25.1.1. 简介 25.1.2. 操作原理 25.1.2.1. 内存管理器 25.1.2.2. 内存容器 25.1.2.3. 锁定的内存 25.1.2.4. 可移动内存 25.2. 内存管理器 25.2.1. 创建一个内存管理器 25.2.2. 管理内存对象 25.2.2.1. 创建可移动的对象 25.2.2.2. 创建锁定的对象 25.2.2.3. 销毁对象 25.2.3. 内存管理器设置 25.2.3.1. 内存限制 25.2.3.2. MinSize 25.3. 内存对象 25.3.1. 可移动的 25.3.2. 锁定的 25.3.3. 内存容器 '值' 属性. 25.3.4. 内存容器接口 25.3.4.1. getRef() 方法 25.3.4.2. touch() 方法 25.3.4.3. lock() 方法 25.3.4.4. unlock() 方法 25.3.4.5. isLocked() 方法 26. Zend_Mime 26.1. Zend_Mime 26.1.1. 简介 26.1.2. 静态方法和常量 26.1.3. 实例化Zend_Mime 26.2. Zend_Mime_Message 26.2.1. 简介 26.2.2. 实例化 26.2.3. 增加MIME消息段 26.2.4. 分界线处理 26.2.5. 解析字符串,创建Zend_Mime_Message对象(实验性的) 26.3. Zend_Mime_Part 26.3.1. 简介 26.3.2. 实例化 26.3.3. 解析(rendering)消息段为字符串的方法 27. Zend_Pdf 27.1. 简介 27.2. 生成和加载 PDF 文档 27.3. 保存修改到 PDF 文档 27.4. 文档页面 27.4.1. 页面生成 27.4.2. 页面克隆 27.5. Drawing. 27.5.1. Geometry. 27.5.2. Colors. 27.5.3. Shape Drawing. 27.5.4. Text Drawing. 27.5.5. Using fonts. 27.5.6. Starting in 1.5, Extracting fonts. 27.5.7. Image Drawing. 27.5.8. Line drawing style. 27.5.9. Fill style. 27.5.10. Rotations. 27.5.11. Save/restore graphics state. 27.5.12. Clipping draw area. 27.5.13. Styles. 27.6. Zend_Pdf module usage example. 28. Zend_Registry 28.1. 使用对象注册表(Registry) 28.1.1. 设置Registry中的值 28.1.2. 获取Registry中的值 28.1.3. 创建一个Registry对象 28.1.4. 像访问数组一样访问Registry对象 28.1.5. 对象方式访问Registry 28.1.6. 查询一个索引是否存在 28.1.7. 扩展Registry对象 28.1.8. 删除静态注册表 29. Zend_Rest 29.1. Introduction 29.2. Zend_Rest_Client 29.2.1. Introduction 29.2.2. Responses 29.2.3. Request Arguments 29.3. Zend_Rest_Server 29.3.1. Introduction 29.3.2. REST Server Usage 29.3.3. Calling a Zend_Rest_Server Service 29.3.4. Sending A Custom Status 29.3.5. Returning Custom XML Responses 30. Zend_Search_Lucene 30.1. 概述 30.1.1. 简介 30.1.2. 文档和字段对象 30.1.3. 理解字段类型 30.2. 建立索引 30.2.1. 创建新索引 30.2.2. 更新索引 30.3. 搜索索引 30.3.1. 建立查询 30.3.2. 搜索结果 30.3.3. 结果评分 30.4. Query Language 30.4.1. Terms 30.4.2. Fields 30.4.3. Starting in 1.5, Wildcards 30.4.4. Term Modifiers 30.4.5. Starting in 1.5, Range Searches 30.4.6. Starting in 1.5, Fuzzy Searches 30.4.7. Proximity Searches 30.4.8. Boosting a Term 30.4.9. Boolean Operators 30.4.9.1. AND 30.4.9.2. OR 30.4.9.3. NOT 30.4.9.4. &&, ||, and ! operators 30.4.9.5. + 30.4.9.6. - 30.4.9.7. No Operator 30.4.10. Grouping 30.4.11. Field Grouping 30.4.12. Escaping Special Characters 30.5. 查询类型 30.5.1. 单项查询 30.5.2. 多项查询 30.5.3. 短语查询 30.6. 字符集 30.6.1. UTF-8 和单字节字符集支持 30.7. 扩展性 30.7.1. 文本分析 30.7.2. 评分算法 30.7.3. 存储容器 30.8. 与 Java Lucene 的互操作性 30.8.1. 文件格式 30.8.2. 索引目录 30.8.3. Java 源代码 30.9. Advanced 30.9.1. Using the index as static property 30.10. Best Practices 30.10.1. Field names 30.10.2. Indexing performance 30.10.3. Index during Shut Down 30.10.4. Retrieving documents by unique id 30.10.5. Memory Usage 30.10.6. Encoding 30.10.7. Index maintenance 31. Zend_Server 31.1. 简介 31.2. Zend_Server_Reflection 31.2.1. 简介 31.2.2. 用法 32. Zend_Service 32.1. 简介 32.2. Zend_Service_Akismet 32.2.1. Introduction 32.2.2. Verify an API key 32.2.3. Check for spam 32.2.4. Submitting known spam 32.2.5. Submitting false positives (ham) 32.2.6. Zend-specific Accessor Methods 32.3. Zend_Service_Amazon 32.3.1. Introduction 32.3.2. Country Codes 32.3.3. Looking up a Specific Amazon Item by ASIN 32.3.4. Performing Amazon Item Searches 32.3.5. Using the Alternative Query API 32.3.5.1. Introduction 32.3.6. Zend_Service_Amazon Classes 32.3.6.1. Zend_Service_Amazon_Item 32.3.6.1.1. Zend_Service_Amazon_Item::asXML() 32.3.6.1.2. Properties 32.3.6.2. Zend_Service_Amazon_Image 32.3.6.2.1. Properties 32.3.6.3. Zend_Service_Amazon_ResultSet 32.3.6.3.1. Zend_Service_Amazon_ResultSet::totalResults() 32.3.6.4. Zend_Service_Amazon_OfferSet 32.3.6.4.1. Properties 32.3.6.5. Zend_Service_Amazon_Offer 32.3.6.5.1. Zend_Service_Amazon_Offer Properties 32.3.6.6. Zend_Service_Amazon_SimilarProduct 32.3.6.6.1. Properties 32.3.6.7. Zend_Service_Amazon_Accessories 32.3.6.7.1. Properties 32.3.6.8. Zend_Service_Amazon_CustomerReview 32.3.6.8.1. Properties 32.3.6.9. Zend_Service_Amazon_EditorialReview 32.3.6.9.1. Properties 32.3.6.10. Zend_Service_Amazon_Listmania 32.3.6.10.1. Properties 32.4. Zend_Service_Audioscrobbler 32.4.1. Introduction to Searching Audioscrobbler 32.4.2. Users 32.4.3. Artists 32.4.4. Tracks 32.4.5. Tags 32.4.6. Groups 32.4.7. Forums 32.5. Zend_Service_Delicious 32.5.1. Introduction 32.5.2. Retrieving posts 32.5.3. Zend_Service_Delicious_PostList 32.5.4. Editing posts 32.5.5. Deleting posts 32.5.6. Adding new posts 32.5.7. Tags 32.5.8. Bundles 32.5.9. Public data 32.5.9.1. Public posts 32.5.10. HTTP client 32.6. Zend_Service_Flickr 32.6.1. 对Flickr搜索的介绍 32.6.2. 查找 Flickr 用户 32.6.3. 获得 Flickr 图像详细资料 32.6.4. Zend_Service_Flickr 类 32.6.4.1. Zend_Service_Flickr_ResultSet 32.6.4.1.1. 属性 32.6.4.1.2. Zend_Service_Flickr_ResultSet::totalResults() 32.6.4.2. Zend_Service_Flickr_Result 32.6.4.2.1. 属性 32.6.4.3. Zend_Service_Flickr_Image 32.6.4.3.1. 属性 32.7. Zend_Service_Simpy 32.7.1. Introduction 32.7.2. Links 32.7.3. Tags 32.7.4. Notes 32.7.5. Watchlists 32.8. Zend_Service_StrikeIron 32.8.1. Overview 32.8.2. Registering with StrikeIron 32.8.3. Getting Started 32.8.4. Making Your First Query 32.8.5. Examining Results 32.8.6. Handling Errors 32.8.7. Checking Your Subscription 32.9. Zend_Service_StrikeIron: Bundled Services 32.9.1. ZIP Code Information 32.9.2. U.S. Address Verification 32.9.3. Sales & Use Tax Basic 32.10. Zend_Service_StrikeIron: Advanced Uses 32.10.1. Using Services by WSDL 32.10.2. Viewing SOAP Transactions 32.11. Zend_Service_Yahoo 32.11.1. 简介 32.11.2. 用Yahoo!来搜索网页 32.11.3. 用Yahoo!来查找图片 32.11.4. Finding Local Businesses and Services with Yahoo! 32.11.5. 搜索Yahoo! 新闻 32.11.6. Zend_Service_Yahoo 类 32.11.6.1. Zend_Service_Yahoo_ResultSet 32.11.6.1.1. Zend_Service_Yahoo_ResultSet::totalResults() 32.11.6.1.2. Properties 32.11.6.2. Zend_Service_Yahoo_WebResultSet 32.11.6.3. Zend_Service_Yahoo_ImageResultSet 32.11.6.4. Zend_Service_Yahoo_LocalResultSet 32.11.6.5. Zend_Service_Yahoo_NewsResultSet 32.11.6.6. Zend_Service_Yahoo_Result 32.11.6.6.1. Properties 32.11.6.7. Zend_Service_Yahoo_WebResult 32.11.6.7.1. 属性 32.11.6.8. Zend_Service_Yahoo_ImageResult 32.11.6.8.1. 属性 32.11.6.9. Zend_Service_Yahoo_LocalResult 32.11.6.9.1. 属性 32.11.6.10. Zend_Service_Yahoo_NewsResult 32.11.6.10.1. 属性 32.11.6.11. Zend_Service_Yahoo_Image 32.11.6.11.1. Properties 33. Zend_Session 33.1. 简介 33.2. 基本用法 33.2.1. 实例教程 33.2.2. 迭代会话命名空间 33.2.3. 会话命名空间的访问器 33.3. 高级用法 33.3.1. 开启会话 33.3.2. 锁住会话命名空间 33.3.3. 命名空间过期 33.3.4. 会话封装和控制器 33.3.5. 防止每个命名空间有多重实例 33.3.6. 使用数组 33.3.7. 在对象中使用会话 33.3.8. 在单元测试中使用会话 33.4. 全局会话管理 33.4.1. 配置选项 33.4.2. 错误:Headers Already Sent 33.4.3. 会话标识符 33.4.3.1. 会话劫持和会话固定 33.4.4. rememberMe(integer $seconds) 33.4.5. forgetMe() 33.4.6. sessionExists() 33.4.7. destroy(bool $remove_cookie = true, bool $readonly = true) 33.4.8. stop() 33.4.9. writeClose($readonly = true) 33.4.10. expireSessionCookie() 33.4.11. setSaveHandler(Zend_Session_SaveHandler_Interface $interface) 33.4.12. namespaceIsset($namespace) 33.4.13. namespaceUnset($namespace) 33.4.14. namespaceGet($namespace) 33.4.15. getIterator() 34. Zend_Translate 34.1. 简介 34.1.1. 开始多语言化 34.2. Zend_Translate适配器 34.2.1. 如何判断使用哪种翻译适配器 34.2.1.1. Zend_Translate_Adapter_Array 34.2.1.2. Zend_Translate_Adapter_Csv 34.2.1.3. Zend_Translate_Adapter_Gettext 34.2.1.4. Zend_Translate_Adapter_Tbx 34.2.1.5. Zend_Translate_Adapter_Tmx 34.2.1.6. Zend_Translate_Adapter_Qt 34.2.1.7. Zend_Translate_Adapter_Xliff 34.2.1.8. Zend_Translate_Adapter_XmlTm 34.2.2. 集成编写自己的适配器 34.2.3. 加速所有的适配器 34.3. Using Translation Adapters 34.3.1. Translation Source Structures 34.3.2. Creating array source files 34.3.3. Creating Gettext Source Files 34.3.4. Creating TMX Source Files 34.3.5. Creating CSV Source Files 34.3.6. Options for adapters 34.3.7. Handling languages 34.3.7.1. Automatically handling of languages 34.3.8. Automatic source detection 34.3.8.1. Language through naming directories 34.3.8.2. Language through filenames 34.3.8.2.1. Complete Filename 34.3.8.2.2. Extension of the file 34.3.8.2.3. Filename tokens 34.3.9. Checking for translations 34.3.10. Access to the source data 35. Zend_Uri 35.1. Zend_Uri 35.1.1. 概述 35.1.2. 新建一个URI 35.1.3. 操作现有的URI 35.1.4. URI 验证 35.1.5. 公共实例方法 35.1.5.1. 取得URI的Schema 35.1.5.2. 取得整个URI 35.1.5.3. 验证URI 36. Zend_Validate 36.1. 简介 36.1.1. 什么是校验器(validator)? 36.1.2. 校验器的基本用法 36.1.3. 定制消息 36.1.4. 使用静态 is() 方法 36.2. 标准校验类 36.2.1. Alnum 36.2.2. Alpha 36.2.3. Barcode 36.2.4. Between 36.2.5. Ccnum 36.2.6. 日期 36.2.7. 数字 36.2.8. Email 地址 36.2.9. 浮点数 36.2.10. GreaterThan 36.2.11. 十六进制数 36.2.12. 主机名 36.2.13. InArray 36.2.14. 整数 36.2.15. Ip 36.2.16. LessThan 36.2.17. NotEmpty 36.2.18. Regex 36.2.19. StringLength 36.3. 校验器链 36.4. 编写校验器 37. Zend_Version 37.1. 读取Zend Framework的当前版本 38. Zend_View 38.1. 简介 38.1.1. 控制器脚本 38.1.2. 视图脚本 38.1.3. 选项 38.1.4. 实用访问器 38.2. 控制器脚本 38.2.1. 变量赋值 38.2.2. 调用视图脚本并打印输出 38.2.3. 视图脚本的路径 38.3. 视图脚本 38.3.1. 转义输出(Escaping Output) 38.3.2. 使用模板系统 38.3.2.1. 使用View脚本的模板系统 38.3.2.2. 通过Zend_View_Interface接口使用模板系统 38.4. 视图助手(View Helper) 38.4.1. 基本的助手 38.4.1.1. 动作视图助手 38.4.1.2. 区域助手(Partial Helper) 38.4.1.3. 占位符助手(Placeholder Helper) 38.4.1.3.1. 具体占位符实现 38.4.1.4. 文档类型助手(Doctype Helper) 38.4.1.5. HeadLink 助手 38.4.1.6. HeadMeta 助手 38.4.1.7. HeadScript 助手 38.4.1.8. HeadStyle 助手 38.4.1.9. HeadTitle 助手 38.4.1.10. InlineScript 助手 38.4.1.11. JSON 助手 38.4.1.12. 翻译助手 38.4.2. 助手的路径 38.4.3. 编写自定义的助手类 39. Zend_XmlRpc 39.1. 介绍 39.2. Zend_XmlRpc_Client 39.2.1. 介绍 39.2.2. 带参数 39.2.2.1. 以PHP本地变量的形式传递参数 39.2.2.2. 以Zend_XmlRpc_Value 对象的形式传递参数 39.2.2.3. 将一个XML字符串解析为XML-RPC参数 39.2.3. 参数类型提示 39.2.4. 获取响应 39.3. Zend_XmlRpc_Server 39.3.1. Introduction 39.3.2. Basic Usage 39.3.3. Server Structure 39.3.4. Conventions 39.3.5. Utilizing Namespaces 39.3.6. Custom Request Objects 39.3.7. Custom Responses 39.3.8. Handling Exceptions via Faults 39.3.9. Caching Server Definitions Between Requests 39.3.10. Usage Examples 39.3.10.1. Basic Usage 39.3.10.2. Attaching a class 39.3.10.3. Attaching several classes using namespaces 39.3.10.4. Specifying exceptions to use as valid fault responses 39.3.10.5. Utilizing a custom request object 39.3.10.6. Utilizing a custom response object 39.3.10.7. Cache server definitions between requests A. 系统需求 A.1. PHP 版本需求 A.2. PHP 扩展 A.3. Zend Framework 组件 B. Zend Framework PHP 编码标准 B.1. 绪论 B.1.1. 适用范围 B.1.2. 目标 B.2. PHP File 文件格式 B.2.1. 常规 B.2.2. 缩进 B.2.3. 行的最大长度 B.2.4. 行结束标志 B.3. 命名约定 B.3.1. 类 B.3.2. 接口 B.3.3. 文件名 B.3.4. 函数和方法 B.3.5. 变量 B.3.6. 常量 B.4. 编码风格 B.4.1. PHP 代码划分(Demarcation) B.4.2. 字符串 B.4.2.1. 字符串文字 B.4.2.2. 包含单引号(')的字符串文字 B.4.2.3. 变量替换 B.4.2.4. 字符串连接 B.4.3. 数组 B.4.3.1. 数字索引数组 Numerically Indexed Arrays B.4.3.2. 关联数组 B.4.4. 类 B.4.4.1. 类的声明 B.4.4.2. 类成员变量 B.4.5. 函数和方法 B.4.5.1. 函数和方方声明 B.4.5.2. 函数和方法的用法 B.4.6. 控制语句 B.4.6.1. If / Else / Elseif B.4.6.2. Switch B.4.7. 注释文档 B.4.7.1. 格式 B.4.7.2. 文件 B.4.7.3. 类 B.4.7.4. 函数 C. 版权信息 索引 表格清单 2.1. 一个CMS范例的访问控制 3.1. 配置选项 4.1. 核心前端选项 4.2. 函数前端选项 4.3. Class frontend options 4.4. File frontend options 4.5. Page frontend options 4.6. 文件后端选项 4.7. Sqlite 后端选项 4.8. Memcached 后端选项 5.1. Zend_Config_Ini 构造器参数 8.1. 选择货币描述的常量 8.2. 选择货币位置的常量 9.1. Date Parts 9.2. Basic Operations 9.3. Date Comparison Methods 9.4. Date Output Methods 9.5. Date Output Methods 9.6. Miscellaneous Methods 9.7. Operations involving Zend_Date::HOUR 9.8. Day Constants 9.9. Week Constants 9.10. Month Constants 9.11. Year Constants 9.12. Time Constants 9.13. Timezone Constants 9.14. Date Format Constants (formats include timezone) 9.15. Date and Time Formats (format varies by locale) 9.16. Constants for ISO 8601 date output 9.17. Constants for PHP date output 9.18. Types of supported horizons for sunset and sunrise 17.1. Zend_Http_Client_Adapter_Socket configuration parameters 17.2. Zend_Http_Client configuration parameters 21.1. Details for getTranslationList($type = null, $locale = null, $value = null) 21.2. Details for getTranslation($value = null, $type = null, $locale = null) 21.3. Differences between ZF 1.0 and ZF 1.5 21.4. Format tokens for self generated number formats 21.5. List of supported numeral systems 21.6. Key values for getDate() with option 'fix_date' 21.7. Return values 21.8. Format definition 21.9. Example formats 21.10. List of all supported languages 21.11. List of all supported regions 23.1. Mail Read Feature Overview 23.2. Mail Folder Names 24.1. List of measurement types 30.1. Zend_Search_Lucene_Field 类型 32.1. Zend_Service_Amazon_Item Properties 32.2. Zend_Service_Amazon_Image Properties 32.3. Zend_Service_Amazon_OfferSet Properties 32.4. Properties 32.5. Zend_Service_Amazon_SimilarProduct Properties 32.6. Zend_Service_Amazon_Accessories Properties 32.7. Zend_Service_Amazon_CustomerReview Properties 32.8. Zend_Service_Amazon_EditorialReview Properties 32.9. Zend_Service_Amazon_Listmania Properties 32.10. Methods for retrieving public data 32.11. Methods of the Zend_Service_Delicious_SimplePost class 32.12. Zend_Service_Flickr_ResultSet 属性 32.13. Zend_Service_Flickr_Result 属性 32.14. Zend_Service_Flickr_Image 属性 32.15. Zend_Service_Yahoo_ResultSet 32.16. Zend_Service_Yahoo_LocalResultSet 属性 32.17. Zend_Service_Yahoo_Result Properties 32.18. Zend_Service_Yahoo_WebResult 属性 32.19. Zend_Service_Yahoo_ImageResult 属性 32.20. Zend_Service_Yahoo_LocalResult 属性 32.21. Zend_Service_Yahoo_NewsResult 属性 32.22. Zend_Service_Yahoo_Image Properties 34.1. Zend_Translate适配器 34.2. Options for Translation Adapters 39.1. PHP本地变量类型转化为XML-RPC类型 39.2. Zend_XmlRpc_Value 对象声明的XML-RPC类型 A.1. Zend Framework 使用的 PHP 扩展 A.2. Zend Framework 组件以及其使用到的 PHP 扩展 范例清单 2.1. 角色之间的多重继承 3.1. 修改 Session 名字空间 3.2. 使用定制存储类 3.3. 基本用法 4.1. 调用 Zend_Cache::factory()取得一个前端 4.2. Caching a database query result 4.3. 用Zend_Cache 输出前端缓存输出 5.1. 使用 Zend_Config 本身 5.2. Using Zend_Config with a PHP Configuration File 5.3. 使用 Zend_Config_Ini 5.4. 使用Zend_Config_Xml 6.1. 使用短语法 6.2. 使用长语法 6.3. 捕捉 Getopt 异常 6.4. 使用 getOption() 6.5. 使用 __get() 和 __isset() 魔术方法 6.6. 使用 getRemainingArgs() 6.7. 使用 addRules() 6.8. 使用 setHelp() 6.9. 使用 setAliases() 6.10. 使用 addArguments() 和 setArguments() 6.11. 使用 setOption() 6.12. 使用 setOptions() 7.1. 如何处理不存在的动作 7.2. 用动作、控制器和模块名来添加一个任务 7.3. 使用请求对象添加一个任务 7.4. AutoCompletion with Dojo Using Zend MVC 7.5. 允许动作响应 Ajax 的请求 7.6. 设定选项 7.7. 使用默认设定 7.8. 使用goto()的_forward()API 7.9. 通过gotoRoute()使用路由组装(route assembly) 7.10. 基本用法 7.11. 禁用自动解析 7.12. 选择另外的视图脚本 7.13. 修改注册的视图Modifying the registered view 7.14. 修改路径规则 7.15. 一个动作中解析多个视图脚本 7.16. Standard usage 7.17. Setting a different error handler 7.18. Using accessors 8.1. 从实际地方创建 Zend_Currency 的实例 8.2. 创建 Zend_Currency 实例的其它例子 8.3. 为货币创建输出 8.4. 修改货币的显示格式 8.5. 从货币中获取信息 8.6. 设置新地方 8.7. 缓存货币 9.1. Setting a default timezone 9.2. Creating the current date 9.3. get() - output a date 9.4. set() - set a date 9.5. add() - adding dates 9.6. compare() - compare dates 9.7. equals() - identify a date or date part 9.8. User-specified input date format 9.9. Operating on Parts of Dates 9.10. Date creation by instance 9.11. Static date creation 9.12. Quick creation of dates from database date values 9.13. Convenient creation of dates from database date values 9.14. Date creation by array 9.15. Example usage for self-defined ISO formats 9.16. Example usage for self-defined formats with PHP specifier 9.17. Checking dates 9.18. Getting all available cities 9.19. Getting the location for a city 9.20. Calculating sun informations 9.21. Working with timezones 9.22. Multiple timezones 10.1. Creating a SQL statement object with query() 10.2. Using a SQL statement constructor 10.3. Executing a statement with positional parameters 10.4. Executing a statement with named parameters 10.5. Using fetch() in a loop 10.6. Using fetchAll() 10.7. Setting the fetch mode 10.8. Using fetchColumn() 10.9. Using fetchObject() 10.10. Fetching a Dependent Rowset 10.11. Fetching a Dependent Rowset By a Specific Rule 10.12. Fetching a Dependent Rowset using a Zend_Db_Table_Select 10.13. Fetching Dependent Rowsets using the Magic Method 10.14. Fetching the Parent Row 10.15. Fetching a Parent Row By a Specific Rule 10.16. Fetching the Parent Row using the Magic Method 10.17. Fetching a Rowset with the Many-to-many Method 10.18. Fetching a Rowset with the Many-to-many Method By a Specific Rule 10.19. Fetching Rowsets using the Magic Many-to-many Method 10.20. Example of a Cascading Delete 10.21. Example Declaration of Cascading Operations 11.1. dump()方法使用示例 12.1. 捕捉一个异常的例子 13.1. 用Zend_Feed来处理RSS Feed数据 13.2. Atom Feed的基本用法 13.3. 读取Atom Feed的单个条目 13.4. 用条目对象直接访问Atom Feed的单个条目 13.5. 修改一个已存在的条目 13.6. 用自定义的命名空间创建一个Atom条目元素 13.7. 用自定义的命名空间继承Atom条目类 14.1. Transforming CamelCaseText to another format 14.2. Setting Multiple Rules at Once 14.3. Using Zend_Config with Zend_Filter_Inflector 15.1. 定制标签 15.2. 为所有元素设置前缀路径 15.3. 为所有元素设置装饰器(Decorators) 15.4. 为所有元素设置过滤器 15.5. 为所有的显示组设置装饰器前缀路径 15.6. 为所有显示组设置装饰器 15.7. 注册表单示例 17.1. 执行一个基本的 GET 请求 17.2. 创建一个基本的Zend_Http_Client 17.3. 发送多条header信息 17.4. 发送请求到多个域名 17.5. 用Zend_Http_Client发送POST 数据 17.6. Forcing RFC 2616 Strict Redirections on 301 and 302 Responses 17.7. Setting Cookies Using setCookie() 17.8. Enabling Cookie Stickiness 17.9. Setting A Single Custom Request Header 17.10. Setting Multiple Custom Request Headers 17.11. Using setFileUpload to Upload Files 17.12. Sending Raw POST Data 17.13. Setting HTTP Authentication User and Password 17.14. Performing consecutive requests with one client 17.15. Changing the HTTPS transport layer 17.16. Using Zend_Http_Client behind a proxy server 17.17. Testing Against a Single HTTP Response Stub 17.18. Testing Against Multiple HTTP Response Stubs 17.19. Creating your own connection adapter 17.20. Instantiating a Zend_Http_Cookie object 17.21. Stringifying a Zend_Http_Cookie object 17.22. Using getter methods with Zend_Http_Cookie 17.23. Matching cookies 17.24. 处理HTTP应答 19.1. 传递选项给构造器或startMvc() 19.2. 使用setOption() 和 setConfig() 19.3. 使用访问器 19.4. 使用Zend_Layout访问器来修改变形器(inflector) 19.5. Zend_Layout 变形器的直接修改 19.6. 定制变形器(inflectors) 20.1. loadFile() 方法范例 20.2. Example of loadClass() method 20.3. isReadable()示例: 20.4. 注册 autoloader callback 方法范例 20.5. 从继承类注册 autoload callback 方法范例 21.1. Choosing a specific locale 21.2. Automatically selecting a locale 21.3. Using automatic locales 21.4. Handling locale exceptions 21.5. Setting a default locale 21.6. Dates default to correct locale of web users 21.7. Overriding default locale selection 21.8. Performance optimization when using a default locale 21.9. Dates default to correct locale of web users 21.10. Using STANDARD definitions for setOptions() 21.11. clone 21.12. Check for equal locales 21.13. Get default locales 21.14. setLocale 21.15. getLanguage and getRegion 21.16. getTranslationList 21.17. getTranslationList 21.18. Converting country name in one language to another 21.19. All available translations 21.20. All Languages written in their native language 21.21. getQuestion() 21.22. getLocaleList() 21.23. Number normalization 21.24. Number normalization with precision 21.25. Number localization 21.26. Number localization with precision 21.27. Using a self defined number format 21.28. Number testing 21.29. Floating point value normalization 21.30. Floating point value localization 21.31. Floating point value testing 21.32. Integer value normalization 21.33. Integer value localization 21.34. Integer value testing 21.35. Converting numerals from Eastern Arabic scripts to European/Latin scripts 21.36. Converting numerals from Latin script to Eastern Arabic script 21.37. Getting 4 letter CLDR script code using a native-language name of the script 21.38. Normalizing a date 21.39. Normalizing a date by locale 21.40. Normalizing a date with time 21.41. Normalizing a userdefined date 21.42. Automatic correction of input dates 21.43. Date testing 21.44. Normalize an unknown time 21.45. Testing a time 23.1. 使用Zend_Mail发送简单邮件 23.2. 传递另外的参数给 Zend_Mail_Transport_Sendmail 传送器 23.3. 通过 SMTP 发送邮件 23.4. 通过一个SMTP连接发送多个邮件 23.5. 手工控制传送器连接 23.6. 使用不同的Transport对象 23.7. 发送HTML邮件 23.8. 带附件的邮件 23.9. 更改MIME分界线 23.10. 外加邮件头信息 23.11. 在 Zend_Mail_Transport_Smtp 中使用身份验证 23.12. Enabling a secure connection within Zend_Mail_Transport_Smtp 24.1. Converting measurements 24.2. The meter measurement 24.3. Creation using integer and floating values 24.4. Creation using strings 24.5. Arbitrary text input containing measurements 24.6. Localized string 24.7. Automatic output 24.8. Output a value 24.9. Outputting units 24.10. Convert 24.11. Adding units 24.12. Subtract 24.13. Different measurements 24.14. Identical measurements 24.15. Difference 24.16. Changing a value 24.17. Changing the type 25.1. 使用 Zend_Memory 组件 27.1. 生成新的或加载 PDF 文档 27.2. 请求 PDF 文档的指定版本 27.3. Save PDF document. 27.4. PDF 文档页面管理 27.5. Cloning existing page. 27.6. Draw a string on the page. 27.7. Draw a UTF-8-encoded string on the page. 27.8. Create a standard font. 27.9. Create a TrueType font. 27.10. Create a TrueType font, but do not embed it in the PDF document. 27.11. Do not throw an exception for fonts that cannot be embeded. 27.12. Do not compress an embedded font. 27.13. Combining font embedding options. 27.14. Extracting fonts from a loaded document. 27.15. Extracting font from a loaded document by specifying font name. 27.16. Image drawing. 27.17. Zend_Pdf module usage demo. 28.1. set() 使用示例: 28.2. get() 方法示例: 28.3. 迭代一个registry对象: 28.4. 创建一个registry对象 28.5. Example of initializing the static registry 28.6. array 方式访问示例: 28.7. 对象形式的访问: 28.8. isRegistered() 示例: 28.9. isset() 示例: 28.10. 指定静态注册表的类名: 28.11. _unsetInstance() 示例: 29.1. A basic REST request 29.2. Response Status 29.3. Using Technorati's Rest Service 29.4. Example Technorati Response 29.5. Setting Request Arguments 29.6. Basic Zend_Rest_Server Usage - Classes 29.7. Basic Zend_Rest_Server Usage - Functions 29.8. Returning Custom Status 29.9. Return Custom XML 30.1. 自定义文本分析程序 32.1. isSpam() Usage 32.2. submitSpam() Usage 32.3. submitHam() Usage 32.4. Search Amazon Using the Traditional API 32.5. Search Amazon Using the Query API 32.6. Choosing an Amazon Web Service Country 32.7. Looking up a Specific Amazon Item by ASIN 32.8. Performing Amazon Item Searches 32.9. Using the ResponseGroup Option 32.10. Search Amazon Using the Alternative Query API 32.11. Retrieving User Profile Information 32.12. Retrieving a User's Weekly Artist Chart 32.13. Retrieving Related Artists 32.14. Get all posts 32.15. Accessing post lists 32.16. Filtering a Post List with Specific Tags 32.17. Filtering a Post List by URL 32.18. Post editing 32.19. Method call chaining 32.20. Deleting posts 32.21. Adding a post 32.22. Tags 32.23. Bundles 32.24. Retrieving public data 32.25. Changing the HTTP client of Zend_Rest_Client 32.26. Configuring your HTTP client to keep connections alive 32.27. 简单的 Flickr 照片搜索 32.28. 用email地址来查找Flickr用户 32.29. 获得 Flickr 图像详细资料 32.30. Querying Links 32.31. Modifying Links 32.32. Working With Tags 32.33. Working With Notes 32.34. Retrieving Watchlists 32.35. 用Yahoo!来搜索网页 32.36. 用Yahoo!来查找图片 32.37. 用Yahoo!查找本地商务和服务信息 32.38. 搜索Yahoo! 新闻 33.1. 页面浏览计数 33.2. 新方法: 使用命名空间避免冲突 33.3. 老方法: PHP会话访问 33.4. 会话迭代 33.5. 访问会话数据 33.6. 开启全局会话 33.7. 锁住会话命名空间 33.8. 过期的例子 33.9. 带有生命期的控制器命名空间会话 33.10. 限制命名空间访问单一实例 33.11. 修改带有会话命名空间的数组数据 33.12. 在会话存储之前构造数组 33.13. 方案:重新分配一个被修改的数组 33.14. 方案:存储包括引用的数组 33.15. PHPUnit Testing Code Dependent on Zend_Session 33.16. 使用Zend_Config配置Zend_Session 33.17. 会话固定 34.1. Example of single-language PHP code 34.2. Example of multi-lingual PHP code 34.3. Example TMX file 34.4. Example CSV file 34.5. Example CSV file two 34.6. Using translation options 34.7. Handling languages with adapters 34.8. How automatically language detection works 34.9. Scanning a directory structure for sources 34.10. Directory scanning for languages 34.11. Filename scanning for languages 34.12. Checking if a text is translatable 34.13. Handling languages with adapters 35.1. 使用Zend_Uri::factory()创建一个新的URI 35.2. 使用Zend_Uri::factory()操作一个现有的URI 35.3. 使用Zend_Uri::check()进行URI 验证 35.4. 从Zend_Uri_* 对象取得模式 35.5. 从一个Zend_Uri_* 对象取得整个URI 35.6. 验证一个 Zend_Uri_* 对象 36.1. 创建简单校验类 36.2. 编写有独立条件的校验类 36.3. 带有独立条件、多重失败原因的校验 37.1. compareVersion()方法示例: 38.1. 动作视图助手的基本用法 38.2. Partials 的基本用法 38.3. 使用 PartialLoop 来解析可迭代的(Iterable)的模型 38.4. 在其它模块中解析 Partials 38.5. 占位符的基本用法 38.6. 用占位符来聚合内容 38.7. 使用占位符(Placeholders)来抓取内容 38.8. Doctype 助手的基本用法 38.9. 获取 Doctype 38.10. HeadLink 助手的基本用法 38.11. HeadMeta 助手基本用法 38.12. HeadScript 助手基本用法 38.13. Capturing Scripts Using the HeadScript Helper 38.14. HeadStyle 助手的基本用法 38.15. 用 HeadStyle 助手抓取样式声明 38.16. HeadTitle 助手基本用法 38.17. 已注册的实例 38.18. 在视图里 38.19. 直接用法 38.20. 单个参数 38.21. 参数列表 38.22. 参数数组 38.23. 动态修改地点 (locale) 38.24. 静态修改地点 (locale) 38.25. 获得当前设置的地点 39.1. 一个基本的XML-RPC请求 39.2. 用类型提示来调用一个XML-RPC服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值