查看: 6479|回复: 0
打印 上一主题 下一主题

Zend Framework实例教程(2)

[复制链接]
跳转到指定楼层
1#
发表于 2009-6-16 15:06:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
在继续之前,我想做最后一个关于Zend_View的提示。在controller的每个类方法内初始化$view对象需要额外输入一些内容,而我们的主要目标是让快速开发网络应用更简单。如果所有模板都放在一个目录下,是否要在每个例子中都调用setscrīptPath()也存在争议。



幸运的是,Zend类包含了一个寄存器来帮助减少工作量。你可以用register()方法把你的$view对象存储在寄存器:



<?php

Zend::register('view', $view);

?>


用registry()方法进行检索:



<?php

$view = Zend::registry('view');

?>


基于这点,本教程使用寄存器。  



Zend_InputFilter


本教程讨论的最后一个组件是Zend_InputFilter。这个类提供了一种简单而有效的输入过滤方法。你可以通过提供一组待过滤数据来进行初始化。



<?php

$filterPost = new Zend_InputFilter($_POST);

?>


这会将($_POST)设置为NULL,所以就不能直接进入了。Zend_InputFilter提供了一个简单、集中的根据特定规则过滤数据的类方法集。例如,你可以用getAlpha()来获取$_POST['name']中的字母:



<?php

/* $_POST['name'] = 'John123Doe'; */

$filterPost = new Zend_InputFilter($_POST);

/* $_POST = NULL; */

$alphaName = $filterPost->getAlpha('name');

/* $alphaName = 'JohnDoe'; */

?>


每一个类方法的参数都是对应要过滤的元素的关键词。对象(例子中的$filterPost)可以保护数据不被篡改,并能更好地控制对数据的操作及一致性。因此,当你操纵输入数据,应始终使用Zend_InputFilter。



提示:Zend_Filter提供与Zend_InputFilter方法一样的静态方法。


构建新闻管理系统


虽然预览版提供了许多组件(甚至许多已经被开发),我们已经讨论了构建一个简单程序所需要的全部组件。在这里,你会对ZF的基本结构和设计有更清楚的理解。



每个人开发的程序都会有所不同,而Zend Framework试图包容这些差异。同样,这个教程是根据我的喜好写的,请根据自己的偏好自行调整。



当我开发程序时,我会先做界面。这并不意味着我把时间都花在标签、样式表和图片上,而是我从一个用户的角度去考虑问题。因此我把程序看成是页面的集合,每一页都是一个独立的网址。这个新闻系统就是由以下网址组成的:



/
/add/news
/add/comment
/admin
/admin/approve
/view/{id}


你可以直接把这些网址和controller联系起来。IndexController列出新闻,AddController添加新闻和评论,AdminController处理一些如批准新闻之类的管理,ViewController特定新闻和对应评论的显示。



如果你的FooController.php还在,把它删除。修改IndexController.php,为业务逻辑以添加相应的action和一些注释:



<?php

Zend::loadClass('Zend_Controller_Action');

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        /* List the news. */
    }

    public function noRouteAction()
    {
        $this->_redirect('/');
    }
}

?>


接下来,创建AddController.php文件:



<?php

Zend::loadClass('Zend_Controller_Action');

class AddController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->_redirect('/');
    }

    function commentAction()
    {
        /* Add a comment. */
    }

    function newsAction()
    {
        /* Add news. */
    }

    function __call($action, $arguments)
    {
        $this->_redirect('/');
    }
}

?>


记住AddController的indexAction()方法不能调用。当访问/add时会执行这个类方法。因为用户可以手工访问这个网址,这是有可能的,所以你要把用户重定向到主页、显示错误或你认为合适的行为。



接下来,创建AdminController.php文件:



<?php

Zend::loadClass('Zend_Controller_Action');

class AdminController extends Zend_Controller_Action
{
    function indexAction()
    {
        /* Display admin interface. */
    }

    function approveAction()
    {
        /* Approve news. */
    }

    function __call($action, $arguments)
    {
        $this->_redirect('/');
    }
}

?>


最后,创建ViewController.php文件:



<?php

Zend::loadClass('Zend_Controller_Action');

class ViewController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->_redirect('/');
    }

    function __call($id, $arguments)
    {
        /* Display news and comments for $id. */
    }
}

?>


和AddController一样,index()方法不能调用,所以你可以使用你认为合适的action。ViewController和其它的有点不同,因为你不知道什么才是有效的action。为了支持像/view/23这样的网址,你要使用__call()来支持动态action。

  

数据库操作


因为Zend Framework的数据库组件还不稳定,而我希望这个演示可以做得简单一点。我使用了一个简单的类,用SQLite进行新闻条目和评论的存储和查询。



<?php

class Database
{
    private $_db;

    public function __construct($filename)
    {
        $this->_db = new SQLiteDatabase($filename);
    }

    public function addComment($name, $comment, $newsId)
    {
        $name = sqlite_escape_string($name);
        $comment = sqlite_escape_string($comment);
        $newsId = sqlite_escape_string($newsId);

        $sql = "INSERT
                INTO   comments (name, comment, newsId)
                VALUES ('$name', '$comment', '$newsId')";

        return $this->_db->query($sql);
    }

    public function addNews($title, $content)
    {
        $title = sqlite_escape_string($title);
        $content = sqlite_escape_string($content);

        $sql = "INSERT
                INTO   news (title, content)
                VALUES ('$title', '$content')";

        return $this->_db->query($sql);
    }

    public function approveNews($ids)
    {
        foreach ($ids as $id) {
            $id = sqlite_escape_string($id);

            $sql = "UPDATE news
                    SET    approval = 'T'
                    WHERE  id = '$id'";

            if (!$this->_db->query($sql)) {
                return FALSE;
            }
        }

        return TRUE;
    }

    public function getComments($newsId)
    {
        $newsId = sqlite_escape_string($newsId);

        $sql = "SELECT name, comment
                FROM   comments
                WHERE  newsId = '$newsId'";

        if ($result = $this->_db->query($sql)) {
            return $result->fetchAll();
        }

        return FALSE;
    }

    public function getNews($id = 'ALL')
    {
        $id = sqlite_escape_string($id);

        switch ($id) {
            case 'ALL':
                $sql = "SELECT id,
                               title
                        FROM   news
                        WHERE  approval = 'T'";
                break;
            case 'NEW':
                $sql = "SELECT *
                        FROM   news
                        WHERE  approval != 'T'";
                break;
            default:
                $sql = "SELECT *
                        FROM   news
                        WHERE  id = '$id'";
                break;
        }

        if ($result = $this->_db->query($sql)) {
            if ($result->numRows() != 1) {
                return $result->fetchAll();
            } else {
                return $result->fetch();
            }
        }

        return FALSE;
    }
}

?>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表