ZendChina | Zend中文权威资讯's Archiver

ZendChina 发表于 2007-12-29 22:21

Zend Framework 提示信息(一)

ZendChina官方:在本教程中,我们把提要加入到这个整体中,使用户能够创建账户,订阅特定的提要并显示这些提要。本教程用到了 Zend_Feed 和 Zend_Inputfilter 模块,后者用于验证电子邮件地址并为提要条目去掉 HTML 标记。您将会学到下列内容:
[list][*]如何使用 Zend_InputFilter 模块完成以下任务:[/list]             自动将数据从 POST、GET 和 SESSION 数组传送到 Zend 对象
             过滤传入的 GET 或 POST 数据
[list][*]关于 RSS 提要[*]如何使用 Zend_Feed 模块阅读 RSS 提要中的数据。[*]如何或在数据库中保存、查看以及删除提要条目,以便随后访问。[/list]
[b]系统需求[/b]
       为顺利学习,需要安装几个软件。本教程将对安装及配置进行介绍,但您务必要下载下列软件:

Apache HTTP 服务器
       理论上,可以使用任何支持 PHP 的 HTTP 服务器,但也需要利用 mod_rewrite 模块来运行 Zend 框架下的 MVC 功能,所以您很可能会使用 Apache。对于 Microsoft® Windows®,请确保下载的 Apache 版本有 PHP V5(作为一个模块)的支持(本教程仅涉及了 PHP 作为 Apache 模块的安装,如果您想把 PHP 安装成一个 CGI 程序,尚需自行摸索)。在本文写作之时,使用的是 Apache V2.0 而不是 Apache V2.2。本教程是在 Windows 中用 Apache V2.0.58 测试的。

PHP V5
       本教程需要 PHP V5.0 及更高版本的功能。但您应该用 V5.1 或更高版本,因为还要用到 PHP 数据对象(PDO),这是从 V5.1 开始出现的。本教程是使用 V5.1.4 进行测试的。

Zend 框架
       所有的工作都将在这套 PHP 类上进行。该框架尚处于发展初期,尽管这样,它仍包含大量的功能。本教程是使用 V0.1.3 进行测试的。

MySQL
       本质上讲,如果存在适配器,您就可以将任何数据库与 Zend 框架协同使用,数据库功能将以同样的方式运行。但在本文中,您的选择将受到一定的限制。本教程使用 MySQL 数据库,并用 V4.0.21 版进行测试,也可以使用更新的版本。

[b]概要[/b]
       本部分首先介绍了 RSS 提要及其提供的数据。接着介绍了本教程所需的新的数据库纲要,随后您就可以创建并初始化新表。最后,您会了解一些杂项功能,包括自动装载类、注册视图对象及退出。

[b]RSS 提要[/b]
       最受欢迎的提要阅读形式就是通过 RSS 阅读提要。RSS 有几个意思:RDF Site Summary、Rich Site Summary 或 Really Simple Syndication。它是一种 XML 格式,用来在互联网上分发大标题数据和其他信息。无需向站点发送任何特殊的参数,只需知道您想要从中获取信息的 RSS 提要的 URL,将浏览器指向该 URL 即可。

       将浏览器指向 Google News,即可查看 RSS 数据。现在您可以看到所有以 RSS XML 格式返回的信息。这里有很多信息,但在本教程中,我们仅关注摘要数据:标题和用于获取全文的 URL。

[b]新数据库模式[/b]
       在[url=http://bbs.zendchina.net/thread-92-1-1.html]Zend Framework 构建样例应用程序[/url],我们已经给出了用户表,在这里我们再添加一些表,如下所示:

feeds
       此表用于存储可用提要。它包含两个字段:feedname 和 link。

subscribedfeeds
       此表用于保存用户订阅的所有提要。订阅一条提要即为此表添加了一行,该行包含用户及订阅的这个提要的名称。它包含两个字段:username 和 feedname。

savedentries
       此表用于存储用户已保存的全部 RSS 提要条目。以便使用户能在以后再次访问。它包含四个字段:username、feedname、channelname(文章标题)和 link。

[b]创建新表[/b]
       下面为数据库创建新表。打开一个 MySQL 窗口并添加下列代码:

清单 1. 创建新表               
[quote]
use chomp;
create table feeds
    (feedname varchar(256), link varchar(512));
create table subscribedfeeds
    (username varchar(20), feedname varchar(256));
create table savedentries
    (username varchar(20), feedname varchar(256),
     channelname varchar(256), link varchar(512));
[/quote]
      新数据库表现在已经在您的数据库中了。

[b]初始化新表[/b]
      使用提要阅读器上可用提要的标题和 URL 来初始化 feeds 表。将下列代码添加到同一个 MySQL 窗口中:

清单 2. 初始化数据表                  
[quote]
insert into feeds values
('Fox Sports', 'http://feeds.feedburner.com/foxsports/rss/headlines'),
('Google News', 'http://news.google.com/?output=rss'),
('Yahoo News', 'http://rss.news.yahoo.com/rss/topstories');
insert into subscribedfeeds values ('tsa', 'Google News');
[/quote]

       现在,应用程序中有了三条可用提要:Fox Sports、Google News 和 Yahoo News。作为开始,我们也为 subscribedfeeds 表添加了一条已订阅提要。

[b]自动装载类[/b]
       Zend 框架需要我们添加 Zend::loadClass,它增加了代码的长度,但我们也许并不能记起所有需要的类。下列代码使我们不必手工装载类。
清单 3. 自动装载类
[php]   
<?php
session_start();
include 'Zend.php';
function __autoload($class)
{
    Zend::loadClass($class);
}
...[/php]

       Zend 框架检测到这个方法并为您装载必要的类。同样,在此处添加 session_start()(仅此一处),所以要将其他实例从第 2 部分的代码中移除。

[b]注册视图[/b]
       注册该视图,它能够通过向注册库中添加视图对象,从而将两行代码变成一行。向注册库中添加对象,如下所示。

清单 4. 向注册库中添加 Zend 视图对象
[php]           
...
    Zend::loadClass($class);
}
$view = new Zend_View;
$view->setScriptPath('views');
Zend::register('view', $view);
...[/php]

       在注册及登录活动中,从注册库重新检索视图对象,如下所示。

清单 5. 从 Zend 注册库重新检索视图对象
[php]                    
    public function registerAction()
    {   
        $view = Zend::registry('view');
        $view->userFunction = 'Create';
        $view->action = '/user/create';
        $view->button = 'Register';
        echo $view->render('register.php');
    }
    public function loginAction()
    {
        $view = Zend::registry('view');
        $view->title = 'Login';
        echo $view->render('login.php');
    }
[/php]

[b]InputFilter 类[/b]
       Zend_InputFilter 类提供的功能是惊人的,这些功能也是每位 Zend 框架用户都要用到的。本部分论及了其提供的具体功能,第 2 部分末尾已经提到过,我们将在代码中使用它们。

[b]提供的功能[/b]
       除非您能够过滤并验证此数据,否则可使用 Zend_InputFilter 类,装载 $_GET, $_POST 和 $_SESSION 等数组,然后用类似的方式访问它们。例如,向 Zend 对象中装载 GET 数组的方法如下:$filterGet = new Zend_InputFilter($_GET);。

       有很多种方法可用于访问和测试数据,但下列方法更为常用:

getAlpha
      只返回字母字符

getAlnum
      只返回字母/数字字符

getDigits
      只返回数字

getRaw
       返回原始数据(未经过过滤及测试)

testAlnum
       如只包含字母字符及数字,返回其值,否则返回 FALSE

testAlpha
       如只包含字母字符,返回其值,否则返回 FALSE

testCcnum
       若是有效信用卡号码,返回其值,否则返回 FALSE

testDate
       若是有效日期,返回其值,否则返回 FALSE

testEmail
       若是有效的电子邮件地址(目前还未在 Zend 框架下实现),返回其值,否则返回 FALSE

testName
       若是有效的人名,返回其值,否则返回 FALSE

testRegex
       若同正则表达式相匹配,返回其值(我们会用此方法测试有效的电子邮件地址),否则返回 FALSE

testPhone
       若是有效的电话号码,返回其值,否则返回 FALSE

testUri
       若是有效的 URL,返回其值,否则返回 FALSE

testZip
       若是有效的邮政编码,返回其值,否则返回 FALSE

noTags
       返回过滤掉所有 HTML 标记的值

       还有一些其他的方法,您可以查看框架内的代码,以查看 Zend 发布版中的其他方法:zend/library/Zend/InputFilter.php。

[b]通过 GET、POST 和 SESSION 存储数据[/b]
       让我们使用针对 GET、POST 和 SESSION 数组的输入过滤器,您将在代码中多次使用该过滤器。按照如下方法操作。

清单 6. 将每一个数组装载到 Zend 对象中并使用 Zend 注册库注册
[php]                 
...
    Zend::loadClass($class);
}
$filterGet = new Zend_InputFilter($_GET);
$filterPost = new Zend_InputFilter($_POST);
$filterSession = new Zend_InputFilter($_SESSION);
Zend::register('fGet', $filterGet);
Zend::register('fPost', $filterPost);
Zend::register('fSession', $filterSession);
...[/php]

       请注意,一旦使用 Zend_InputFilter 装载了一个数组,该数组将被设置为 NULL,同时被强制复制一份。下一步,我们将把 Zend_InputFilter 类的该用法结合到当前的代码中来使用。

[b]重温 IndexController[/b]
       我们在此类中使用输入过滤器检索当前用户的用户名,来验证该用户是否当前已登录,如果未登录则将用户转到登录页面或 viewFeeds 页面。修改 IndexController.php 文件,如下所示。

清单 7. 修改 IndexController 类
[php]                  
<?php
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $filterSession = Zend::registry('fSession');
        $username = $filterSession->getRaw('username');
        if(!isset($username))
            $this->_redirect('user/login');
        else{
            $db = Zend::registry('db');
            $select = $db->select();
            $select->from('subscribedfeeds, feeds', '*');
            $select->where('subscribedfeeds.Username = ?', $username);
            $select->where('feeds.feedname=subscribedfeeds.feedname');
            $results = $db->fetchAll($select);
            $view = Zend::registry('view');
            $view->username = $username;
            $view->feeds = $results;
            echo $view->render('viewFeeds.php');
        }
    }
    public function noRouteAction()
    {
        $this->_redirect('/');
    }
}
?>[php]

       从注册库中检索 filterSession 对象及用户名,如清单 7 所示。如果用户已登录,我们从数据库中检索该用户当前订阅的提要。这些都会在 viewFeeds 视图中展示,稍后我们会在教程中提到。

[b]重温 createAction[/b]
       我们重温一下 createAction,它可以验证由注册表单通过 POST 提供的信息。修改 createAction 方法,如下所示。

清单 8. 修改 createAction 方法
[php]                 
    function createAction()
    {
        $filterPost = Zend::registry('fPost');
        $username = $filterPost->testAlnum('username');
        $password = $filterPost->getRaw('password');
        $password2 = $filterPost->getRaw('password2');
        $email = $filterPost->testRegex('email',
"^[a-z0-9]+[a-z0-9_-]*(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(
[a-z]+){2,}$^");
        $lName = $filterPost->testName('lName');
        $fName = $filterPost->testName('fName');
        if($username != '' &&
           $email != '' &&
           $lName != '' &&
           $fName != '' &&
           $password != '' &&
           $password2 != '' &&
           $password == $password2){
            $db = Zend::registry('db');
            $row = array(
                         'FirstName' => $fName,
                         'LastName' => $lName,
                         'EmailAddress' => $email,
                         'Username' => $username,
                         'Password' => $password
                         );           
...
    }[/php]

       以上代码使用 Zend_InputFilter 类验证了电子邮件、用户名、名和姓的输入,而不是直接访问。

[b]重温 displayProfileAction[/b]
       在 displayProfileAction 方法中,将使用 Zend_InputFilter 类来检索用户名。修改该方法,如下所示。

清单 9. 修改 displayProfileAction 类
[php]                    
    function displayProfileAction()
    {
        $filterSession = Zend::registry('fSession');
        $username = $filterSession->getRaw('username');
        if ($username != ''){
            $db = Zend::registry('db');
...
            $view->email = $email;
            $view->username = $username;
...
    }[/php]

[b]重温 updateAction[/b]
       此方法同 createAction 方法类似,所以不再赘述。修改 updateAction 方法,如下所示。

清单 10. 修改 updateAction 方法
[php]                    
    function updateAction()
    {
        $filterPost = Zend::registry('fPost');
        $password = $filterPost->getRaw('password');
        $password2 = $filterPost->getRaw('password2');
        $email = $filterPost->testRegex('email',
"^[a-z0-9]+[a-z0-9_-]*(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.(
[a-z]+){2,}$^");        $lName = $filterPost->testName('lName');
        $fName = $filterPost->testName('fName');
        $filterSession = Zend::registry('fSession');
        $username = $filterSession->testAlnum('username');
        if($email != '' &&
           $lName != '' &&
           $fName != '' &&
           $password != '' &&
           $password2 != '' &&
           $password == $password2){
            $db = Zend::registry('db');
            $table = 'users';
            $row = array(
                         'FirstName' => $fName,
                         'LastName' => $lName,
                         'EmailAddress' => $email,
                         'Username' => $username,
                         'Password' => $password
                         );
            $where = $db->quoteInto('Username = ?', $username);
...
    }[/php]

[b]重温 authenticateAction[/b]
       用户登录时,authenticateAction 方法将被调用,它从 POST 数组中检索用户名及密码。为取代这种方式,而从注册库的 fPost 对象中检索,修改 authenticateAction 方法,如下所示。

清单 11. 修改 authenticateAction 方法
[php]                  
    public function authenticateAction()
    {
        $filterPost = Zend::registry('fPost');
        $username = $filterPost->getRaw('username');
        $password = $filterPost->getRaw('password');
        $db = Zend::registry('db');
        $select = $db->select();
        $select->from('users', '*');
        $select->where('Username = ?', $username);
        $select->where('Password = ?', $password);
        $sql = $select->__toString();
        $rowsFound = $db->fetchAll($select);
...
    }[/php]

[color=#ff0000]ZendChina官方资讯,转载请以链接形式注名来源:[/color][url=http://www.zendchina.net/][color=#ff0000]ZendChina[/color][/url][color=#ff0000] - [/color][url=http://bbs.zendchina.net/thread-93-1-1.html][color=#ff0000]Zend Framework 提示信息(一)[/color][/url]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.