Zend Framework 留言本实战(转)

1、环境搭建和ZF安装
        
      *[注]本节内容大部分来至 Zend  Framework 官方手册       1.1 Zend Framework下载

      Zend Framework 使用 面向对象的  PHP 5 构建,须要 PHP 5.1.4 或更高版本。 请查阅 附录  系统需求 了解更多信息。

一旦合适的 PHP 环境创建起来,下一步是拥有一个 Zend Framework 的副本,能够经过下面的官方承认的途径得到:

下载最新的稳定版本。 这个版本有 .zip 和 .tar.gz 两种格式,对于 Zend Framework 的新手来讲是不错的选择。

下载最新的每日快照(nightly snapshot)。 对于用于面对艰难险阻的人更加适用。每日快照能够体现出 Zend Framework 的 开发进度。 快照同时含有英文版本和其余可用语言的 文档。 若是但愿使用最新的 Zend Framework 进行开发,请考虑使用 SVN (Subversion)客户端。

使用 Subversion(SVN)客户端。Zend Framework 是开源软件,开发所使用的 Subversionu 仓库也是可公开访问的。若是已经在开发中使用了 SVN ,或者但愿对 框架有所贡献,再或者比发布版本更快的更新使用的框架,则能够考虑从 SVN 中得到 Zend Framework。

导出 功能能够得到在工做目录中没有 .svn  文件夹的指定版本的框架副本。

检出 对于向 Zend Framework 进行贡献是很方便的,同时工做副本能够在任什么时候候使用 提交来更新。

外部 定义 可让开发者在他们的 应用中方便的使用 SVN 同步框架版本。

Zend Framework 的 SVN 仓库 URL 地址是:  http://framework.zend.com/svn/framework/trunk

当拥有了一个可用的 Zend Framework 副本时,应用程序须要可以访问框架的类。虽然有 许多的方法来作到这个,PHP 的 include_path 必须含有 Zend Framework 库的路径。

Front Controller 和 Model-View-Controller(MVC) 的实现是 Zend Framework 最有用的功能之一。 Zend Framework MVC  入门

Zend Framework 的 组件不但可以轻松的配合,不一样的组件也能够根据需求独立使用。下面的每一章文档都会专门介绍一个组件。

      1.2 PHP 版本需求
      Zend Framework 须要 PHP 5.1.4 或更高版本。例如 Countable 这样一些 SPL 接口在 PHP 以前的版本中没有被正式使用。

      Zend Framework 提供了大量自动化测试,可使用 PHPUnit 3.0 或更高版本运行。 这个版本的 PHPUnit 一样也须要 PHP 5.1.4 或更高版本。

虽然 Zend Framework 能够在上面提到的 PHP 版本下正确工做,可是强烈建议使用 PHP 5.2.2 或更高版本。 新版本的 PHP 有许多重要的安全更新和性能提高。


      1.3 Zend Framework 组件以及其使用到的 PHP 扩展
Zend Framework 组件 PHP 扩展 (子类 / 使用方式) 
全部组件 pcre ( 依赖 ) SPL ( 依赖 ) standard ( 依赖 )  
Zend_Acl --- 
Zend_Auth ctype ( Zend_Auth_Adapter_Http / 依赖 ) hash ( Zend_Auth_Adapter_Http / 依赖 )  
Zend_Cache apc ( Zend_Cache_Backend_Apc / 依赖 ) memcache ( Zend_Cache_Backend_Apc / 依赖 ) zlib ( Zend_Cache_Backend_Apc / 依赖 )  
Zend_Config libxml ( Zend_Config_Xml / 依赖 ) SimpleXML ( Zend_Config_Xml / 依赖 )  
Zend_Console_Getopt --- 
Zend_Controller Reflection ( 依赖 ) session ( Zend_Controller_Action_Helper_Redirector / 依赖 )  
Zend_Date --- 
Zend_Db ibm_db2 ( Zend_Db_Adapter_Db2 / 依赖 ) mysqli ( Zend_Db_Adapter_Mysqli / 依赖 ) oci8 ( Zend_Db_Adapter_Oracle / 依赖 ) pdo ( All PDO Adapters / 依赖 ) pdo_mssql ( Zend_Db_Adapter_Pdo_Mssql / 依赖 ) pdo_mysql ( Zend_Db_Adapter_Pdo_Mysql / 依赖 ) pdo_oci ( Zend_Db_Adapter_Pdo_Oci / 依赖 ) pdo_pgsql ( Zend_Db_Adapter_Pdo_Pgsql / 依赖 ) pdo_sqlite ( Zend_Db_Adapter_Pdo_Sqlite / 依赖 )  
Zend_Debug --- 
Zend_Exception --- 
Zend_Feed dom ( 依赖 ) libxml ( 依赖 ) mbstring ( 依赖 ) SimpleXML ( 依赖 )  
Zend_Filter Reflection ( 依赖 )  
Zend_Filter_Input Reflection ( 依赖 )  
Zend_Gdata ctype ( Zend_Gdata_App / 依赖 ) dom ( 依赖 ) libxml ( 依赖 )  
Zend_Http ctype ( Zend_Http_Client / 依赖 ) curl ( Zend_Http_Client_Adapter_Curl / 依赖 ) mime_magic ( Zend_Http_Client / 依赖 )  
Zend_Json json ( 可选 ) Reflection ( 依赖 )  
Zend_Loader --- 
Zend_Locale bcmath ( Zend_Locale_Math / 可选 ) iconv ( Zend_Locale_Format / 依赖 )  
Zend_Log dom ( Zend_Log_Formatter_Xml / 依赖 ) libxml ( Zend_Log_Formatter_Xml / 依赖 ) Reflection ( 依赖 )  
Zend_Mail posix ( 可选 )  
Zend_Measure --- 
Zend_Memory --- 
Zend_Mime iconv ( Zend_Mime_Decode / 依赖 )  
Zend_Pdf ctype ( 依赖 ) gd ( 依赖 ) iconv ( 依赖 ) zlib ( 依赖 )  
Zend_Registry --- 
Zend_Request --- 
Zend_Rest ctype ( Zend_Rest_Client / 依赖 ) ( Zend_Rest_Server / 依赖 ) dom ( Zend_Rest_Server / 依赖 ) libxml ( Zend_Rest_Client / 依赖 ) ( Zend_Rest_Server / 依赖 ) Reflection ( Zend_Rest_Server / 依赖 ) SimpleXML ( Zend_Rest_Client / 依赖 )  
Zend_Search_Lucene ctype ( 依赖 ) bitset ( 可选 ) dom ( 依赖 ) iconv ( 依赖 ) libxml ( 依赖 )  
Zend_Server_Reflection Reflection ( 依赖 )  
Zend_Service_Akismet --- 
Zend_Service_Amazon dom ( 依赖 ) libxml ( 依赖 )  
Zend_Service_Audioscrobbler iconv ( 依赖 ) libxml ( 依赖 ) SimpleXML ( 依赖 )  
Zend_Service_Delicious dom ( 依赖 ) libxml ( 依赖 )  
Zend_Service_Flickr dom ( 依赖 ) iconv ( 依赖 ) libxml ( 依赖 )  
Zend_Service_Simpy dom ( 依赖 ) libxml ( 依赖 ) libxml ( 依赖 )  
Zend_Service_StrikeIron soap ( 依赖 )  
Zend_Service_Yahoo dom ( 依赖 ) libxml ( 依赖 )  
Zend_Session session ( 依赖 )  
Zend_Translate  xml ( Zend_Translate_Adapter_Qt / 依赖 ) ( Zend_Translate_Adapter_Tmx / 依赖 ) ( Zend_Translate_Adapter_Xliff / 依赖 )  
Zend_Uri ctype ( 依赖 )  
Zend_Validate ctype ( 依赖 ) Reflection ( 依赖 )  
Zend_Version --- 
Zend_View Reflection ( 依赖 )  
Zend_XmlRpc dom ( 依赖 ) iconv ( Zend_XmlRpc_Client / 依赖 ) libxml ( 依赖 ) Reflection ( Zend_XmlRpc_Server / 依赖 ) SimpleXML ( 依赖 )

[  本帖最后由 tomsou 于 2008-4-7 17:30 编辑 ]
2、前期准备

      2.1 配置apache的mod_rewrite
      ZF中为了实现MVC模式,对整个 应用的全部请求所有经过一个启动 文件(通常是根目录下的index.php)来分配到不一样的 控制器进行处理(Zend_Controller_Front实现了Front Controller设计模式,全部的请求都经过front controller(前端控制器)并分发(dispatch)到不一样的控制器来处理,分发的过程基于请求的URL。),所以须要对操做类URL进行URL重写,如下对apache的mod_rewrite模块进行设置。
      先能够经过 php提供的phpinfo()函数查看环境配置,经过Ctrl+F查找到“Loaded Modules”,其中列出了全部apache2handler已经开启的模块,若是里面包括“mod_rewrite”,则已经支持,再也不须要继续设置。
      若是没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,经过Ctrl+F查找到“LoadModule rewrite_module”,将前面的"#"号删除便可。若是没有查找到,则到“LoadModule” 区域,在最后一行加入“LoadModule rewrite_module modules/mod_rewrite.so”(必选独占一行),而后重启apache服务器便可。

      2.2 让apache服务器支持".htaccess"
      如何让本身的本地APACHE服务器支持".htaccess"呢?其实只要简单修改一下apache的httpd.conf设置就可让APACHE支持.htaccess了。打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),用文本编辑器打开后,查找
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
改成
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
就能够了

      2.3 创建 开发目录
      假设咱们开发的目录为 C:/webroot/guestbook ,如下文件夹以 “./” 代替。咱们采用ZF官方 手册推荐的结构。
      ./application                                    应用代码文件夹,按照MVC模式创建结构
            controllers/                               MVC控制器文件夹,放置ZF的控制器层文件
            models/                                    MVC模型文件夹,放置ZF的模型层文件
            views/                                       MVC视图文件夹,放置ZF的视图层文件
                  filters/                                 视图辅助--过滤器类文件夹
                  helpers/                              视图辅助--视图辅助类文件夹
                  scripts/                               视图文件夹
      ./library                                           ZF框架代码文件夹,将ZF安装包解压后的 Zend文件夹放入其中
      ./public                                           供前端访问的文件夹,主要用于存放图片、js脚本和css样式单
            images/                                    图片文件夹
            scripts/                                     脚本文件夹
            styles/                                      样式表文件夹
      也许有一些文件夹的解释你们还不是很明白,不着急,在之后编码过程当中,会慢慢理解。

      2.4 创建 “.htaccess” 文件
      若是是在windows平台下,刚开始还真不知道怎么创建".htaccess"文件,由于这个文件实际上没有文件名,仅仅只有扩展名,经过普通方式是没法创建这个文件的,别着急,立刻告诉你三种方法:
      三种方法都是先创建一个htaccess.txt的文本文件(固然,这个文本文件的名字你能够随便取),而后有三种方式给这个文件重命名:(1)用记事本打开,点击文件--另存为,在文件名窗口输入".htaccess",注意是整个绿色部分,也就是包含英文引号,而后点击保存就好了。(2)进入cmd命令窗口,经过cd切换当刚创建htaccess.txt文件的文件夹,而后输入命令:rename htaccess.txt .htaccess ,而后点击键盘Enter键便可。(3)经过ftp链接htaccess.txt所在文件夹,经过ftp软件重命名。
      那么咱们需要创建几个“.htaccess” 文件,里面又输入什么内容呢?基本的原则是这样,根目录必须有一个,用于重定向(URl重写)全部的请求都会转到到index.php(交给前端控制器);"./application"文件夹下需要一个,用于拒绝全部针对该文件夹内容的直接访问(好比 http://localhost/application/models/User.php),这样作是由于全部访问请求必选经过前端控制器来分配访问,其次为了安全;“./library”文件夹下的“.htaccess”同前;"./public"文件夹下必选建一个,由于这个文件夹的文件所有是供前端直接访问的,所以需要撤销URl重写。如下是4个“./htaccess”文件的内容:
      ./.htaccess
            RewriteEngine on
            RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
      ./application/.htaccess
            deny from all
      ./library/.htaccess
            deny from all
      ./public
            RewriteEngine off
     实际上,apache的url重写功能也能够直接在httpd.conf文件中进行设置,这里就不具体讲了,网上相关的 教程也不少。
3、建立应用的入口文件./index.php

      实际上,这个文件不必定需要命名为index.php,关键看你在url重写的时候把访问请求定向到了哪一个文件,可是因为index.php是apache默认的欢迎 页面,建议采用index.php命名。经过URL重写,应用全部的访问请求将定向到”./index.php“,在这个文件中,将初始化一个ZF的前端 控制器,这个控制器将负责对全部的请求进行分配,即分配到指定的控制器,下面咱们来看一下一个假设请求的访问流程(假设咱们的请求是:http://localhost/register/form):

http://localhost/register/form---->[文件]./index.php---->[ZF类]Zend_Controller_Front实例---->[文件夹]./application/controllers---->[ZF控制器类]registerController---->[控制器类中 定义的处理函数]formAction---->[视图层文件]./application/views/script/register/form.phtml---->返回结果

如下是ZF官方 手册中对控制器的解释

      Zend_Controller是 Zend  Framework的MVC体系的核心部份。MVC指Model-View-Controller,是一个用于分离应用逻辑和表现逻辑的设计模式。Zend_Controller_Front实现了Front Controller设计模式,全部的请求都经过front controller(前端控制器)并分发(dispatch)到不一样的控制器来处理,分发的过程基于请求的URL。
      Zend_Controller体系具备可扩展性,能够经过继承已有的类或者本身写个新的类来实现各类接口和抽象类,也能够编写插件或者助手类(helper)来加强 系统的功能。
      在讨论控制器以前,你应该先理解Zend Framework是如何处理HTTP请求的。默认状况下,URL的第一个部份会映射到一个控制器,第二个部份则映射到控制器类中的Action(即控制器类内部的一个方法)。例如:URL http://framework.zend.com/roadmap/components,其 服务器路径为/roadmap/components,则会映射到roadmap控制器和components Action。若是不存在action,则会调用index这个action。若是控制器不存在,则会自动调用index控制器。(按照Apache的命名惯例,自动映射到DirectoryIndex文件) 
      接下来,Zend_Controller的dispatcher会根据控制器的名称找到具体的控制器类。一般它会把控制器名称加上Controller。所以,上例中roadmap控制器与类RoadmapController相对应。
      相似地,action会映射到控制器类中的一个类方法。默认情下,会被转成小写字母,而后加上Action字符串。所以,上例中components这个action与 componentsAction相对应。最终咱们访问URL调用的是RoadmapController->componentsAction()。



=DIV========================================

下面经过代码来解释index.php的建立:
<?php
// 全局处理,主要包括报错级别,时区
error_reporting(E_ALL|E_STRICT);                    //调试时能够设置为E_ALL
date_default_timezone_set('Etc/GMT-8');           //php5须要设置时区,注意GMT后面的-8符合与真实的是相反的

//php_ini的全局引用路径等的设置,这里最重要的是将咱们创建的./library/目录加入到了全局引用路径中,这样才能访问Zend框架提供的功能
set_include_path('.'.PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./application/models/'.PATH_SEPARATOR.get_include_path());

//引用ZF的类加载类,用于经过ZF更加简洁地引用须要的ZF其它类文件,固然这个文件就须要经过传统方式引用了
include "Zend/Loader.php";

// 加载ZF应用中经常使用的ZF类
Zend_Loader::loadClass('Zend_Controller_Front');          //必须引用,控制器类
Zend_Loader::loadClass('Zend_Config_Ini');                   //用于读取ini类型的配置文件
Zend_Loader::loadClass('Zend_Registry');                     //用于注册对象供整个应用空间使用,如 数据库连接对象
Zend_Loader::loadClass('Zend_Db');                             //数据库类
Zend_Loader::loadClass('Zend_Db_Table');                    //数据库扩展类,用于与表相关的操做

// 加载配置。主要是数据库相关的配置,能够分多个组,便于更改,建议使用,也能够直接在这里配置
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);


//初始化数据库对象,并注册到整个应用空间
$db = Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
$db->query('SET NAMES gbk');
Zend_Db_Table::setDefaultAdapter($db);
$registry->set('db',$db);

// 加载控制器,创建前端控制器对象,并设置控制器类路径
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setBaseUrl('/guestbook');                   //主要在应用不在根目录的时候使用
$frontController->setControllerDirectory('./application/controllers');

// 运行,这里进行了错误处理,当ZF找不到想要的控制器时输出ZF的错误信息,你也能够进行自定义的处理
try{
    $frontController->dispatch();
}catch(Zend_Controller_Dispatcher_Exception $e){
    echo $e->getMessage();die;
}
?>
4、设计数据库

      本篇主要是设计 Mysql数据库,说起了两个数据库设计中比较重要的问题,并 推荐了3篇相关的文章,但愿对你们有所帮助。
      
      4.1  字段类型
      设计数据库,字段类型的选择是很是重要的,原则是尽可能选择占用空间最小的数据类型,尽可能采用肯定长度的数据类型(如CHAR)而不用变长的数据 类型(如VARCHAR)。例如表`zf_guestbook`的字段`mana_id`,长度仅仅设为(5),实际能够更小,就是考虑到 留言本的管理员 数量颇有限,其编号不会增加到那么大,哪怕你常常删除了从新添加;又例如表`zf_guestbook`的其它两个字段
都设为CHAR类型,而不是VARCHAR类型,也是由于在本 应用中咱们能够确认其最大长度,故使用定长的数据类型(固然CHAR类型字段会占用固定的储存空间,若是你设置的过大而实际上使用的比例确很小就会形成存储空间的浪费,这就要根据具体的应用来权衡了)。

      4.2 创建索引
      一个大型应用,数据库索引的设计和优化是相当重要的,学问就大了去了,固然也有一些基本的原则,相信你们看了《Mysql索引分析和优化》以后就会有个比较感性的认识了。


      虽然本 教程的数据库应用很是简单,可是我一贯坚持按照最优的方式来设计和制做东西,因此再小也要考虑的全面些,无奈我对数据库的设计也只是 入门级别的,就不敢班门弄斧了,因此在本篇以前转载了几篇以为很好的数据库设计相关的文章,你们有时间能够仔细看下:

      Mysql索引分析和优化

      高效的MySQL数据库应用原则

      数据库设计方法、规范与技巧

      一般,在数据库、表、字段命名上我喜欢用前缀(经过下划线分隔),也建议你们这样作,这样作有不少好处,好比便于标识,造成统一的风格,数据库名称若是前缀相同在phpmyadmin管理的时候它会自动按照前缀进行分组,不一样的表前缀可使用同一个数据库支持多个相同应用,等等。

====如下是经过phpmyadmin导出的 Sql代码=========================================================


-- phpMyAdmin SQL Dump
-- version 2.10.1
--  http://www.phpmyadmin.net
-- 
--  主机: localhost
-- 生成日期: 2007 年 11 月 06 日 12:43
--  服务器版本: 5.0.41
--  PHP 版本: 5.2.2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 
-- 数据库: `zf_guestbook`
-- 
CREATE DATABASE `zf_guestbook` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-- --------------------------------------------------------

USE `zf_guestbook`;

-- 
-- 表的结构 `gb_manager`   管理员表,用于存储留言管理员的账号信息
-- 

DROP TABLE IF EXISTS `gb_manager`;
CREATE TABLE IF NOT EXISTS `gb_manager` (
`mana_id` tinyint(5) NOT NULL auto_increment,
`mana_name` char(20) collate utf8_unicode_ci NOT NULL,
`mana_pass` char(32) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`mana_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

-- 
-- 表的结构 `gb_message`     留言表,用于存储访客留言,其中 `mess_ip`是为了跟踪留言人的地区信息
-- 

DROP TABLE IF EXISTS `gb_message`;
CREATE TABLE IF NOT EXISTS `gb_message` (
`mess_id` int(11) NOT NULL auto_increment,
`mess_name` char(50) collate utf8_unicode_ci NOT NULL,
`mess_content` text collate utf8_unicode_ci NOT NULL,
`mess_addtime` int(11) NOT NULL,
`mess_ip` int(10) NOT NULL,
PRIMARY KEY (`mess_id`),
KEY `mess_addtime` (`mess_addtime`,`mess_ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 


====SQL代码结束=======================================================

      4.3 配置 文件编写
      下面咱们来写数据库链接的配置文件,咱们采用ZF推荐的方式,ini类型的配置文件,在本教程《 实战学习 Zend  Framework 之--留言本[03]--建立应用的入口文件./index.php》中讲到了在index.php中读取ini配置文件的方法,再将相关代码贴过来下:

// 加载配置。主要是数据库相关的配置,能够分多个组,便于更改,建议使用,也能够直接在这里配置
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);

      新建一个config.ini的文本文件,存放在application文件夹下(这个文件夹经过.htaccess禁止了直接http访问请求的)。内容以下:

[general]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = gbuser
db.config.password = guestbook
db.config.dbname = zf_guestbook

      固然,你也能够把数据库配置直接使用php代码写在index文件里面,可是推荐采用这种方式,这样作有几种好处,首先经过配置代替编程,更加容易更改你的数据库配置,数据库相关的信息变了只用改下这个文本文件,而不用动php代码了;其次,经过在最前面"[ ]"中指定配置组名称,能够在一个配置文件里面采用多种数据库配置,便于大型应用对数据库变换的要求。
5、显示留言列表

      在 留言本这个 应用中,咱们设计如下功能:留言列表(分页)、新增留言、删除(管理员登录后)。首先咱们来看显示留言列表这个功能。

       5.1 归纳梳理
      通过前面的学习,应该对ZF现MVC的套路有了一些了解了,那么要显示留言列表咱们的程序涉及到哪些方面,若是经过ZF提升的MVC框架来实现呢?当访问留言本应用时,咱们在首页显示留言列表,并在 页面最下方显示新增留言的表单。既然时首页,那么咱们的 控制器就命名为IndexController.php,固然是存放在/application/controllers目录下面了;紧接着是模型层,既然是显示留言,确定是gb_message表,那么咱们把模型层命名为Message.php(与代表相关联,便于识别),存放在/application/models目录下;最后是视图层,那就是咱们的 模板页面了,模板页面 推荐与控制器同名,即index.phtml,存放在/application/views/scripts/index目录下(这里须要在scripts目录下根据控制器名称创建子目录,便于经过ZF无路径调用并更好的管理模板 文件)。如今咱们来一块儿梳理下相关的文件和目录:
      /application/controllers/IndexController.php          控制器层
      /application/models/Message.php                       模型层
       /application/views/scripts/index                           视图层

      如下部分固然是编写三个文件的 源代码了,我将会把源代码详细列下,并配上详细说明,有问题的能够留言!

      5.2 代码及注释
      IndexController.php
<?php
//控制器必须继承自Zend_Controller_Action类
class IndexController extends Zend_Controller_Action
{
      //初始化函数,至关于PHP5类中的construct函数,会在类初始化时自动调用
      function init()
     {
            //初始化视图层,并获取应用根路径赋值给视图层
            $this->initView();
            $this->view->baseUrl = $this->_request->getBaseUrl();

            //加载模型类,就是 数据库操做类,放在init函数中加载的好处是不用在具体的xxxAction函数中分别加载
            Zend_Loader::loadClass('Message');
      }

      //Action方法,负责执行具体的任务
      function indexAction()
      {
            //定义每页显示的记录条数
            $psize = 10;

            //获取当前页码,若是不为正整数则从新赋值为1
            $page = (int)$this->_request->getParam('page');    //注意,这就是ZF中获取get参数的方法,下面会总结
            if($page<1){$page = 1;}
       
             //初始化Message类并获取留言分页列表数据。listMessage函数接收两个参数,分别是每页记录数和当前页码
            $message = new Message();
            $count = $message->countAll();
            $list = $message->listMessage($psize, $page);
            
            //生成分页页码连接,为了简化起见,将全部页码一古脑儿显示出来
             $pstr = "";
             $maxpage = ceil($count/$psize);
              for($i=1; $i<=$maxpage; $i++)
            {
                  if ($page==$i)
                   {
                         $pstr .= "<b>{$i}</b>";
                   }
                   else
                   {
                         $pstr .= "<a href='/index/page/{$i}>{$i}</a>";
                   }
             }
            
            //向视图层赋值并输出视图
            $this->view->title = "留言本@ZF Powered"; //将页面标题( html中的title标签)赋值给视图层
            $this->view->list = $list;
            $this->view->page = $pstr;
            $this->render();    //输出视图
      }

      //析构函数,注销再也不须要的资源,可选(PHP5会自动回收)
      function __destruct()
      {
            unset($this->view);
      }
}
?>
*****************IndexController涉及到的知识点总结*********************
(1)init函数,控制器的初始化函数,至关于类的构造函数,会在初始化是自动调用,所以最好将整个控制器公用的一些资源放在这个函数中,好比一些公用类的加载和初始化、全局的 变量等。
(2)Action函数,其实是一些形如xxxAction的函数,每个Action函数负责执行一个具体的请求(或者说任务),这个函数名称中的xxx就是由 http://localhost/xxx 中的xxx,不明白的能够看看ZF的URL解析规则,前面有讲到。
(3)ZF获取参数的方法:get参数==$this->_request->getParam('xxx');,post参数==$this->_request->getPost('xxx');,$this固然是指向当前控制器的。
(4)向视图层赋值。若是在init函数中执行了$this->initView();,则直接调用$this->view->变量名=值;就好了。实际上initView()就是创建一个新的视图 实例并赋值给控制器的变量view(固然还有其它相关的操做)。
(5)视图输出。若是严格按照ZF推荐的方式进行目录安排和命名,则显示视图只需调用$this->render();,这样ZF会自动在/application/views/scripts/目录下查找和当前控制器名称同名的目录下的和当前action同名的.phtml文件做为模板显示输出。

      Message.php
<?php
//模型类,必须继承自Zend_Db_Table
class Message extends Zend_Db_Table
{
      //默认状况下,zend_db_table类会将其类名看成数据库中表名,不是则从新 定义,详见ZF手册
      protected $_name = 'gb_message';

      //重构主键,本例中不需使用,ZF默认表的主键为id,若是不是则从新定义,便于Db类的一些便捷操做,详见ZF手册
      protected $_primary = 'mess_id';

      //构造函数,获取在入口文件中注册的数据库链接对象
      function __construct()
      {
            parent::__construct();
            $this->db = Zend_Registry::get('db');
      }

      //获取数据总量供分页使用,如下用到Db::select对象,详细请参看ZF手册
      function countAll()
      {
            $select = $this->db->select();
            $select->from($this->_name, 'mess_id');
            $count = count($this->db->fetchAll($select));
            if($count)
            {
                  return $count;
            }
            return 0;
      }

      //获取分页后数据,注意最好给参数制定默认值
      function listMessage($page=1,$count=20)
      {
            $select = $this->db->select();

            //制定表和获取 字段列表
            $select->from($this->_name,'*');
            
            //制定排序依据
            $select->order('mess_addtime DESC');

            //分页获取数据并返回
            $select->limitPage($page,$count);
            return $this->db->fetchAll($select);
      }

      //删除留言
      function delMessage($mess_id)
      {
            //使用$this->db->quoteInto来生成 sql语句防止sql注入
            $where = $this->db->quoteInto('mess_id =?',$mess_id);
            $this->db->delete($this->_name,$where);
      }
}
?>
*****************Message涉及到的知识点总结*********************
(1)ZF框架Db类表名、主键等相关命名规则和操做,比较对,在本 教程中就再也不赘述,本身去看ZF手册吧,讲的很清楚。
(2)Db::select对象,为咱们提升了一种不受数据库约束构建select的sql语句的工具,详见ZF手册9.2。
(3)ZF提升的防sql注入的方法,安全必定要注意,ZF提供了quote方法和quoteInto方法来帮助构造sql语句,详细请看下ZF手册“第 9 章 Zend_Db”。
      PS:你们不要嫌我懒,总是说“见ZF手册”,其实是由于 手册上已经讲解的很详细了,在这里就不须要赘述了,并且本教程是实例教程,偏向于实践,条条款款的东西就少写了。       index.phtml
相关文章
相关标签/搜索