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
相關文章
相關標籤/搜索