首页 | PHP资讯 | 技术专栏 | 资源共享 | PHP培训 | PHP职场 | 图书 | PHP ON WIN | PHP圈子
返回列表 回复 发帖

[ZendFramework] [实例]ZF版blog的demo实例教程

[ZendFramework] [实例]ZF版blog的demo实例教程

本帖最后由 七月十五 于 2009-5-16 15:20 编辑

这个实例是模仿cakephp的blog的demo来做的..= =..并不能成为真正的blog..
就算作zf版blog教程吧.^_^

第一步:

首先去这个网址下载zf.http://framework.zend.com/download

在apache中建立一个project目录,把zf中的library目录放入project目录..另外需要新建几个目录,新建一个index.php文件和.htaccess文件在www目录里面,结构如下:

/project/app/controllers/
/project/app/models/
/project/app/views/
/project/www/.htaccess
/project/www/index.php
/project/library/

然后需要配置apache的rewrite模块,具体方法自己google了,把下面的字符复制进.htaccess里面[code]
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
php_value include_path "../library"
[/code]接着配置apahce的conf,把主路径设置到/project/www/

第二步:

在数据库创建表:[code]
CREATE TABLE post (     
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,     
title VARCHAR(50),     body TEXT,     
created DATETIME DEFAULT NULL,     
modified DATETIME DEFAULT NULL )

INSERT INTO post (title,body,created)     VALUES ('标题1', '内容1', NOW())
INSERT INTO post (title,body,created)     VALUES ('标题2', '内容2', NOW())
INSERT INTO post (title,body,created)     VALUES ('标题3', '内容3', NOW())
[/code]接着配置apache的pdo.请看haohappy的大作Zend_Db连接MySQL(附完整代码),看如何配置pdo就可以了..其他不用理会,我跟他方式稍微有点不同


接着需要写一下/project/www/目录下的index.php,这是唯一的入口点..也可以视为配置文件..


<?
include 'Zend.php';
require '../app/models/db.php';//加载db类

//include Zend.php后,就可以用loadClass函数指定类名,自动加载需要ZF的类
function __autoload($class)
{
    Zend::loadClass($class);
}
//初始化db,并放入对象寄存器
$db = new data();
Zend::register('db', $db);

$view = new Zend_View;
//设置路径
$view->setScriptPath('../app/views');
//放入对象寄存器
Zend::register('view', $view);

$controller = Zend_Controller_Front::getInstance();
//设置路径
$controller->setControllerDirectory('../app/controllers');
//调用dispath()抽取出controller名称和action名称,自动找到适合controller等处理.
$controller->dispatch();
?>



  上面的注释应该讲解的比较清楚了..Zend::register()可能是比较迷惑的,我比较喜欢叫做对象寄存器,因为这个函数的功能就象计算机的寄存器一样暂时存放数据,要拿的时候随时可以获得.
  
  你可能已经发现,我们自定义了一个db类,好的,我们来创建一个db类,先来到/project/app/models/目录下,创建一个db.php文件,打入如下代码

<?
class data{
        private $db;
        private $params;
        
        //初始化db,并用db工厂产生一个db对象.
        function __construct()
        {

        $this->params = array ('host' => '127.0.0.1',
                 'username' => 'root',
                 'password' => '111111',
                 'dbname'   => 'blog');
        $this->db = Zend_Db::factory('pdoMysql', $this->params);
        
        }
      
  }
  ?>


第三步:显示数据
来到/project/app/controllers/下,创建一个IndexController.php文件,这里需要注意一下类名和方法名,框架都有一些约定的写法.IndexController表示名为index的controller,indexAction表示名为index的action.还不清楚,不要紧..下面还有controller类要写,对比一下就知道什么意思了

代码如下:


class IndexController extends Zend_Controller_Action
{
      private $view;
      private $post;
               
    function __construct() {
    //从对象寄存器中取出对象               
    $this->view = Zend::registry('view');
    $this->post = Zend::registry('db');
         
    }
      
    public function indexAction()
    {
        
        //把数据库查询的结构放入视图的info变量(info这个变量自定义)
        $this->view->info = $this->post->findAll();
        //调用View代码"index.php"来显示数据,必须要echo,不然不显示模板.
        echo $this->view->render('index.php');
    }
    //没有action的情况
    public function noRouteAction()
    {
        $this->_redirect('/');
    }

}


   
  index的controller和action都是默认值..所以要实现了它.这里的Zend::registry('view')跟上面的www目录中的index.php里面的Zend::register('view', $view);对应,一个存一个取对象.

  回到/project/app/models/目录的db.php写一个函数

<?
class data{
        private $db;
        private $params;
        
        //初始化db,并用db工厂产生一个db对象.
        function __construct() {
        $this->params = array ('host' => '127.0.0.1',
                 'username' => 'root',
                 'password' => '111111',
                 'dbname'   => 'blog');
        $this->db = Zend_Db::factory('pdoMysql', $this->params);
      
  }
  
  function findAll()
  {
      $result = $this->db->query('SELECT * FROM post');
      //返回所有的结果放入数组
      $row =$result->fetchAll();
      
      return $row;
  }

}
?>



   回到IndexController.php文件,就知道了$this->post->findAll();是调用db类中的函数而已.

然后就来到/project/app/views/目录下了,创建一个index.php文件,实现你的模板.^_^

[PHP]
<html>
<head>
</head>
<body>
<h1>浏览帖子</h1>
<table>
    <tr>
        <th>Id</th>
        <th>标题 </th>
        <th>发帖时间 </th>
    </tr>

    <?php foreach ($this->info as $post) { ?>
    <tr>
        <td><?php echo $this->escape($post['id']); ?></td>
        <td>
            <a href="/view/<?php echo $this->escape($post['id']); ?>">
            <?php echo $this->escape($post['title']); ?>
            </a>        
            
        </td>
        <td><?php echo $this->escape($post['created']); ?></td>
        
    </tr>
    <?php } ?>

</table>
</body>
</html>

[/PHP]

  $this->info来自controller的$this->view对象.$this->escape()是对变量进行过滤,可以不用,不过最好还是加上..

  要浏览怎么做呢?URL的格式:http://localhost/controller/action
  这里你可以用http://localhost/index/index访问..第一个index是controller名,第二个index是action名.
  
  也许你已经发现了.点击标题链接会出错..^_^.那是因为还没有实现那个功能呢.^_^

  我们需要点击一下标题就看里面的文章,从上面模板已经得知,我们用/view/id的方式传值,那么需要ViewController类和一个能接收id的方法..不过还是先把db中的函数实现了,代码如下:


<?
class data{
        private $db;
        private $params;
        
        //初始化db,并用db工厂产生一个db对象.
        function __construct() {
        $this->params = array ('host' => '127.0.0.1',
                 'username' => 'root',
                 'password' => '111111',
                 'dbname'   => 'blog');
        $this->db = Zend_Db::factory('pdoMysql', $this->params);
      
  }
  
  function findAll()
  {
            $result = $this->db->query('SELECT * FROM post');
      //返回所有的结果放入数组
      $row =$result->fetchAll();
      
      return $row;
  }
  function getBody($id)
  {
     //返回第一行记录,可以查查zf文档
     $result =$this->db->fetchRow("SELECT * FROM post WHERE id ='$id'");

      return $result;
  }
}
?>



  好了,需要的函数已经实现了,那么下一步实现controller了,还是在controllers目录中创建一个ViewController.php文件.代码如下:


<?

class ViewController extends Zend_Controller_Action
{
     private $view;
     private $body;
               
     function __construct() {
     //从对象寄存器中取出对象
               
    $this->view = Zend::registry('view');
    $this->body = Zend::registry('db');
    }
    //别忘了实现indexAction方法
   function indexAction()
    {
        $this->_redirect('/');
    }
        
    function __call($id,$args)
    {
    //过滤一下
    $id = Zend_Filter::getDigits($id);

    $this->view->data = $this->body->getBody($id);
    echo $this->view->render('view.php');

  }
}
?>


   这里用__call魔法函数接收$id,往下看,又碰到一个新东西,Zend_Filter::getDigits()用来过滤的,非数字都被过滤掉..

下面来看看view方面了..还是老规矩,在views下创建一个view.php..

[PHP]
<html>
<head>
</head>
<body>

<h1><?php echo $this->escape($this->data['title']);?></h1>

<p><small>Created: <?php echo $this->escape($this->data['created']);?></small></p>

<p><?php echo $this->escape($this->data['body']);?></p>
</body>
</html>
[/PHP]

  这样显示部分就全部完成了.自己浏览一下,浏览方法..上面已经说了..其实直接用http://localhost也可以,因为实现了IndexController..另外还实现了一个noRouteAction的方法

[ 本帖最后由 mikale 于 2006-6-14 13:42 编辑 ]
第四步:添加帖子

首先在db类中添加一个函数


<?
  function save($title,$content)
  {
      $this->db->query("INSERT INTO post (title,body,created) VALUES ('$title', '$content', NOW())");
         
  }
?>


  创建一个AddController.php文件.代码如下


<?
class AddController extends Zend_Controller_Action
{
     private $post;
     private $db;
     private $view;
               
     function __construct() {
     //从对象寄存器中取出对象,对post过来的数据进行过滤
    $this->post = new Zend_InputFilter($_POST);
    $this->db = Zend::registry('db');
    $this->view = Zend::registry('view');
    }
    //别忘了实现indexAction方法
   function indexAction()
    {
        $this->_redirect('/');
    }
       
    function postAction()
    {
      //进行数据过滤
      echo $this->view->render('add.php');
    }
          
    function saveAction()
    {
      //进行数据过滤
      $title = $this->post->noTags('title');
      $content = $this->post->noTags('content');
      //存入数据库
      $this->db->save($title,$content);
      //跳转到首页了.
      $this->_redirct('/');
      
    }
    //作一些错误处理,避免action错误..
    function __call($id,$args)
    {
   
      $this->_redirect('/');

    }
}
?>


   在view中创建add.php,填入如下代码:


<html>
<head>
</head>
<body>
<h1>发贴</h1>

  <form action="/add/save" method="POST">
         
  <p>标题:<br /><input type="text" name="title" /></p>
  
  <p>内容:<br /><textarea name="content"></textarea></p>
  
  <p><input type="submit" value="Add POST" /></p>
</body>

</html>


   这里就会到AddController类中的save方法中把数据保存进数据库..另外需要在views中的index.php上添加一点代码用于调用AddController类中的add方法



<html>
<head>
</head>
<body>
<h1>浏览帖子</h1>
<table>
.......
.......
.......
</table>
<br />
<br />
<a href="/add/post">添加帖子</a>       
</body>
</html>




第五步:删除帖子

在db类中添加一个函数,把db类完整呈现如下:


<?
class data{
        private $db;
        private $params;
       
        //初始化db,并用db工厂产生一个db对象.
        function __construct() {
        $this->params = array ('host' => '127.0.0.1',
                 'username' => 'root',
                 'password' => '111111',
                 'dbname'   => 'blog');
        $this->db = Zend_Db::factory('pdoMysql', $this->params);
      
  }
  
  function findAll()
  {
      $result = $this->db->query('SELECT * FROM post');
      //返回所有的结果放入数组
      $row =$result->fetchAll();
      
      return $row;
  }
  function getBody($id)
  {
    //返回第一行记录
     $result =$this->db->fetchRow("SELECT * FROM post WHERE id ='$id'");

      return $result;
  }
  
  function save($title,$content)
  {
      $this->db->query("INSERT INTO post (title,body,created) VALUES ('$title', '$content', NOW())");
         
  }
  
  function del($id)
  {
          //表名
          $table ='post';
          //where条件
          $where = $this->db->quoteInto('id = ?', "$id");
          //删除表
          $this->db->delete($table, $where);
  }
}
?>


创建一个DelController类


<?
class DelController extends Zend_Controller_Action
{
    private $db;
               
    function __construct() {
     //从对象寄存器中取出对象
    $this->db = Zend::registry('db');
    }
    //别忘了实现indexAction方法
   function indexAction()
    {
        $this->_redirect('/');
    }
   
    function __call($id,$args)
    {
     //删除帖子
      $this->db->del($id);
      
      $this->_redirect('/');

    }
}
?>


  最后我们把删除帖子的链接加载index.php上..^_^..把index.php完整呈现如下..

[PHP]
<html>
<head>
</head>
<body>
<h1>浏览帖子</h1>
<table>
    <tr>
        <th>Id</th>
        <th>标题 </th>
        <th>发帖时间 </th>
    </tr>

    <?php foreach ($this->info as $post) { ?>
    <tr>
        <td><?php echo $this->escape($post['id']); ?></td>
        <td>
                   
            <a href="/view/<?php echo $this->escape($post['id']); ?>">
            <?php echo $this->escape($post['title']); ?>
            </a>       
            
        </td>
        <td><?php echo $this->escape($post['created']); ?></td>
        
        <td><a href="/del/<?php echo $this->escape($post['id']); ?> ">删除帖子</a>        </td>
    </tr>
    <?php } ?>

</table>
<br />
<br />
<a href="/add/post">添加帖子</a>       
</body>
</html>
[/PHP]

第六步:编辑帖子

这步就留给聪明的你来做了.^_^,我在重复这步,估计有人会开始抓狂了..太罗唆了.^_^
要了解更加深入的..当然是看haohappy发起的zf中文化文档了,文档地址哪里?请看置顶贴了..

好了,不废话了.欢迎大家跟我交流和讨论.

[ 本帖最后由 mikale 于 2006-6-14 03:43 编辑 ]
严重的支持下。。
强顶。。。教程类是一定要加精的。

期待有后继。
Stay Hungry. Stay Foolish.
强烈支持一下!
我的Blog:liuming.aipx.cn
哇,支持!
PEA频道  江西人在深圳 LampQQ:23802033MSN:thunderboycn@hotmail.com
谢谢
收藏
暑假开始学
希望zend framework能快点出个稳定版:)
九阴真经,请同学们多加练习
360行,行行出Bug。
恩恩,不错
其实我就是改变社会风气,风靡万千少女,
刺激PHP市场,提高年轻人内涵,
玉树临风,风度翩翩的PHPer
强顶 放假了可以好好学习下
PHP -- 世界因你而精彩
湖南PEA策进会 QQ群: 6426356 2948003 (还等什么, 赶快加入吧)
Fatal error: Class 'Zend_InputFilter' not found in E:\app\controllers\AddController.php on line 13

当添加时出现的错误
返回列表