本帖最后由 七月十五 于 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里面- 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,这是唯一的入口点..也可以视为配置文件..
<?
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 编辑 ] |