返回列表 回复 发帖

[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里面
  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
  3. php_value include_path "../library"
复制代码
接着配置apahce的conf,把主路径设置到/project/www/

第二步:

在数据库创建表:
  1. CREATE TABLE post (     
  2. id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,     
  3. title VARCHAR(50),     body TEXT,     
  4. created DATETIME DEFAULT NULL,     
  5. modified DATETIME DEFAULT NULL )

  6. INSERT INTO post (title,body,created)     VALUES ('标题1', '内容1', NOW())
  7. INSERT INTO post (title,body,created)     VALUES ('标题2', '内容2', NOW())
  8. INSERT INTO post (title,body,created)     VALUES ('标题3', '内容3', NOW())
复制代码
接着配置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文件,实现你的模板.^_^
<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中的函数实现了,代码如下:

<?

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..
<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的方法

[ 本帖最后由 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完整呈现如下..
<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>
复制代码
第六步:编辑帖子

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

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

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

期待有后继。
Stay Hungry. Stay Foolish.
强烈支持一下!
哇,支持!
PEA频道  江西人在深圳 蓝谱主机QQ: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

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