热门关键字:  博客  博客入门  博客创建  新浪博客  css
当前位置 :| 首页>博客制作>综合实例>

用ZF演示制作blog实例教程

来源:PHPchina 作者:mikale 时间:2008-08-06 点击:

这个实例是模仿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里面 复制内容到剪贴板
代码:
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
php_value include_path "../library"接着配置apahce的conf,把主路径设置到/project/www/

第二步:

在数据库创建表: 复制内容到剪贴板
代码:
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())接着配置apache的pdo.请看haohappy的大作Zend_Db连接MySQL(附完整代码),看如何配置pdo就可以了..其他不用理会,我跟他方式稍微有点不同


接着需要写一下/project/www/目录下的index.php,这是唯一的入口点..也可以视为配置文件.. 复制PHP内容到剪贴板
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文件,打入如下代码 复制PHP内容到剪贴板
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类要写,对比一下就知道什么意思了

代码如下: 复制PHP内容到剪贴板
PHP代码:
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写一个函数 复制PHP内容到剪贴板
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内容到剪贴板
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>
$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中的函数实现了,代码如下: 复制PHP内容到剪贴板
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;
  }
  function getBody($id)
  {
     //返回第一行记录,可以查查zf文档
     $result =$this->db->fetchRow("SELECT * FROM post WHERE id ='$id'");

      return $result;
  }
}
?>

好了,需要的函数已经实现了,那么下一步实现controller了,还是在controllers目录中创建一个ViewController.php文件.代码如下: 复制PHP内容到剪贴板
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内容到剪贴板
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>
这样显示部分就全部完成了.自己浏览一下,浏览方法..上面已经说了..其实直接用http://localhost也可以,因为实现了IndexController..另外还实现了一个noRouteAction的方法
第四步:添加帖子

首先在db类中添加一个函数复制PHP内容到剪贴板PHP代码:

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

创建一个AddController.php文件.代码如下复制PHP内容到剪贴板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,填入如下代码:复制PHP内容到剪贴板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方法复制PHP内容到剪贴板PHP代码:
<html>
<head>
</head>
<body>
<h1>浏览帖子</h1>
<table>
.......
.......
.......
</table>
<br />
<br />
<a href="/add/post">添加帖子</a>   
</body>
</html>

第五步:删除帖子

在db类中添加一个函数,把db类完整呈现如下:复制PHP内容到剪贴板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;
  }
  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类复制PHP内容到剪贴板PHP代码:

<?
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内容到剪贴板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>
第六步:编辑帖子


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册