436 1234
发新话题
打印

Zend 框架学习之模型-视图-控制器及添加数据库篇

显示配置文件表单

显示该表单要先确保视图对象具有合适的属性。


清单 25. 设置合适的属性
复制内容到剪贴板
代码:
<?php
require_once 'Zend/Db.php';

Zend::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class UserController extends Zend_Controller_Action
{
...
   
    function registerAction()
    {
        $view = new Zend_View();
        $view->setScriptPath('views');
        $view->userFunction = 'Create';
        $view->action = '/user/create';
        $view->button = 'Register';
        echo $view->render('register.php');
    }

    function createAction()
{
        $params = array(
            'host' => 'localhost',
            'username' => 'chompuser',
            'password' => 'chomppassword',
            'dbname' => 'chomp'
        );

        $DB = Zend_Db::factory('pdoMysql', $params);


        $row = array(
            'FirstName' => $_POST['fName'],
            'LastName' => $_POST['lName'],
            'EmailAddress' => $_POST['email'],
            'Username' => $_POST['user'],
            'Password' => $_POST['pass']
        );

        $table = 'users';
        $rowsAffected = $DB->insert($table, $row);   

        $this->_redirect('/');     

    }

    function displayProfileAction()
    {
        session_start();
        if (isset($_SESSION['username']))
        {
            $params = array(
                'host' => 'localhost',
                'username' => 'chompuser',
                'password' => 'chomppassword',
                'dbname' => 'chomp'
            );

            $DB = Zend_Db::factory('pdoMysql', $params);
            $select = $DB->select();
            $select->from('users', '*');
            $select->where('Username = ?', $_SESSION['username']);

            $rowsFound = $DB->fetchAll($select);

            $firstname = $rowsFound[0]["firstname"];
            $lastname = $rowsFound[0]["lastname"];
            $email = $rowsFound[0]["emailaddress"];
            $username = $rowsFound[0]["username"];
            $password = $rowsFound[0]["password"];

            $view = new Zend_View();
            $view->setScriptPath('views');
            $view->userFunction = 'Update';
            $view->action = '/user/update';
            $view->button = 'Update';
            $view->firstname = $firstname;
            $view->lastname = $lastname;
            $view->email = $email;
            $view->username = $username;

            echo $view->render('register.php');
       }
       else
       {
           $this->_redirect('/');
       }

    }

    function updateAction()
    {
        echo 'This is the updateAction.';
    }

    function __call($action, $arguments)
    {
        echo "Action = " . $action . "<br />";
        echo "Arguments = " . $arguments;
    }

}
?>
当我们使用注册表单的视图时,我们仅需要设置标题、行为和按钮名称。余下的信息如姓、电子邮件地址等保留空白的,这正是我们想要的。

另一方面 displayProfileAction 需要多做一点工作。首先,创建一个 $select 对象,指定 source 和 where 子句。对于 where 子句,我们使用一个 ? 作为占位符并提供填入该占位符的数据,以此来指定该子句本身。然后,我们可以使用 select 语句从数据库中提取数据并将检索到的数据赋值给变量。随后,将变量赋给视图属性并呈现该视图,将浏览器转到 http://localhost/user/displayProfile看看。

TOP

更新数据

用户提交该表单时,浏览器会将这些信息发送给 updateAction。


清单 26. 更新用户信息
复制内容到剪贴板
代码:
...
            echo $view->render('register.php');
       }
       else
       {
           $this->_redirect('/');
       }

    }

    function updateAction()
    {
        session_start();
        if (isset($_POST))
        {
            $params = array(
                'host' => 'localhost',
                'username' => 'chompuser',
                'password' => 'chomppassword',
                'dbname' => 'chomp'
            );
  
            $DB = Zend_Db::factory('pdoMysql', $params);
            $table = 'users';

            $record = array (
                        'firstname' => $_POST['fName'],
                        'lastname' => $_POST['lName'],
                        'emailaddress' => $_POST['email'],
                        'username' => $_POST['user'],
                        'password' => $_POST['pass']
                      );

            $row = $DB->quoteInto('Username =?',
                                  $_SESSION['username']);

            $rowsAffected = $DB->update($table, $record, $row);
         
            echo 'User record updated.';
        }
        else
        {
            $this->_redirect('/');
        }

    }

    function __call($action, $arguments)
    {
        echo "Action = " . $action . "<br />";
        echo "Arguments = " . $arguments;
    }

}
?>
第一步,激活会话,这样我们就可以保证仅为已登录的用户更改信息。第二步,检验以确保表单已被提交,如果属实,将连接到数据库。

我们的目标是用新信息更新数据库中的具体记录。要实现这一目标,需要提供三条信息:表名称;以数组形式表现的新记录;以及 where 子句,该子句用以标识我们想要更新的一条或几条记录。

最后一条是我们最不熟悉的:即使用 quoteInto() 函数。本质上,我们仅仅通过将问号替换为会话变量构建了该语句,但 quoteInto() 函数适当地添加了引号,必要的话,甚至转义了文本中的一些引号。最后我们将三个对象交给 update() 函数,该函数将返回更新的行数。

如果从表单提交以外的地方调用此行为,用户只会被重定向到主页。

TOP

使用注册库

到目前为止,我们已经介绍了如何完成所有的工作,但还有一个特征是需要了解的,它会使一切更简单,那就是 Zend_Registry。

什么是 Zend_Registry?

Zend_Registry 是一个存储空间,它用于存储您在应用程序中重复用到的所有对象。例如,如果您有一个需要在多个地方使用的视图,将它存储在这里,这样只需改变单个视图实例,而无需在复制过程中找到所有的视图。

注册库只能存储对象,它用字符串值名称的形式存储,稍后您可以通过该名称检索这些对象。您也许不会从注册库中移除对象,但无论如何您应该明白该对象只是您当前请求中的内容。注册库不是一个持久存储对象的手段,而仅仅是避免将对象存储在会话变量中的一种方式。

在本例中,将数据库连接存储在注册库中,这样就不必在每次访问数据库时重建该连接了。

TOP

注册对象

由于所有的请求都要通过 index.php 文件,因而该文件成为创建数据库连接和注册的最合适的地方。


清单 27. 创建数据库连接
复制内容到剪贴板
代码:
<?php

include 'Zend.php';
include 'Zend/Db.php';
Zend::loadClass('Zend_Controller_Front');

$params = array(
            'host' => 'localhost',
            'username' => 'chompuser',
            'password' => 'chomppassword',
            'dbname' => 'chomp'
            );
$DB = Zend_Db::factory('pdoMysql', $params);
Zend::register('DB', $DB);

$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('controllers');
$controller->dispatch();

?>
在这里,我们仅像往常一样创建了一个数据库连接,使用 register() 函数将其添加到注册簿,并用 DB 为其命名。现在,如果需要改变用户名、密码或其他信息,我们只需在这里进行更改即可。您可能想把这个信息存储在一个仅仅包含它的不易受损的文件中。

访问注册对象

数据连接一经注册,即可轻松访问。此刻,UserController 是使用数据库的惟一文件。


清单 28. 访问注册库
复制内容到剪贴板
代码:
<?php
require_once 'Zend/Db.php';

Zend::loadClass('Zend_Controller_Action');
Zend::loadClass('Zend_View');

class UserController extends Zend_Controller_Action
{

...
   
    function authenticateAction()
    {
        $DB = Zend::registry('DB');

        $select = $DB->select();
        $select->from('users', '*');
        $select->where('Username = ?', $_POST['username']);
        $select->where('Password = ?', $_POST['password']);
        $sql = $select->__toString();

        $rowsFound = $DB->fetchAll($select);
        if (isset($rowsFound[0]['username']))
        {
           session_start();
           $_SESSION['RSS_SESSION'] = session_id();
           $_SESSION['firstname'] = $rowsFound[0]['firstname'];
           $_SESSION['username'] = $rowsFound[0]['username'];

           echo "Login successful. Please <a href='/'>continue</a>.";
        }
        else
        {
           echo "Login information incorrect. \
           Please <a href='/user/login'>try again</a>.";
        }

    }

    function logoutAction()
    {
        echo 'This is the logoutAction.';
    }
   
    function registerAction()
    {
        $view = new Zend_View();
        $view->setScriptPath('views');
        echo $view->render('register.php');
    }

    function createAction()
    {
        $DB = Zend::registry('DB');

        $row = array(
            'FirstName' => $_POST['fName'],
            'LastName' => $_POST['lName'],
            'EmailAddress' => $_POST['email'],
            'Username' => $_POST['user'],
...
请注意,我们所做的是调用注册库来替代数据库连接信息,该调用用以寻找在字符串 DB 下注册的对象。一旦找到了这个对象,就可以像以前一样使用它了。

TOP

结束语

Zend 框架设计的目的是在 PHP 应用程序的开发过程中,为执行通用行为提供一种简单的方式。它对 MVC 模式的依赖让我们需要费点精力来习惯它,一旦您习惯了 Zend 框架,就会发现它带来了众多可能,它将您的代码用这样一种方式组织起来,即将代码分割到控制器(由实体组织的)和行为中去,这使得编程变得没那么复杂。而行为能够调用动态生成的视图。

Zend 框架也提供组件来让您的编程工作变得更加简单,包括数据库管理类,它可以简化向数据库中添加数据及从中检索数据的过程。

在本教程中,我们建立了 Chomp 在线提要阅读器的基本框架,定位了 MVC 模式并创建了一个用户注册和登录系统。在第 3 部分中,我们将为应用程序添加真实的提要。

TOP

下载贴相关源码
描述名字大小下载方法
Part 2 source codeos-php-zend2.source.zip3.3KBHTTP

TOP

 436 1234
发新话题