Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119723
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2008-02-27 01:14:51

   本文的最新版本请见:
 
说明:
   
    这个例子实现的功能很简单,它分成了两个模块,每个模块都有一个控制器,每个控制器都只对应着一个Action,具体可以看目录结构.
 
内容导航:
1,目录结构

 
2,Index文件(启动文件)说明
error_reporting(E_ALL|E_STRICT);
//date_default_timezone_set('Europe/London');

//配置类库路径及模型库的路径
set_include_path( './lib'                   //类库路径
    . PATH_SEPARATOR . './app/default/models/'
    . PATH_SEPARATOR . './app/user/models/'
    . PATH_SEPARATOR . get_include_path()
);

print_r(get_include_path());
echo "
PATH_SEPARATOR".PATH_SEPARATOR;



//Zend_Loader类中有静态方法loadClass使我们能够加载其他类
include "Zend/Loader.php";
 

/*
类名将会根据下划线(作为目录分隔线)对应到相应目录下的PHP文件,比如Container_Tree会指向Container/Tree.php。
如果$dirs是一个字符串或数组, Zend_Loader::loadClass()会根据顺序查找相应目录,并加载第一个匹配的文件。如果文件不存在,则会查找inculde_path指定的目录。
如果文件不存在或者文件中相应的类不存在,那么Zend_Loader::loadClass()就会抛出一个Zend_Exception异常。
类名中只能包含字母,连接符-、下划线_和句点.
*/
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');

//类Mylib_Db是自己写的一个类,路径为“lib/Mylib/Dd.php”,具体见后面的源码
Zend_Loader::loadClass("Mylib_Db");


// 设置数据库
include "./app/config.ini.php";       //引入配置文件,源码见附录
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);    //注册变量,以后就可以使用Zend_Registry::get('config')来引用了
$db = Zend_Db::factory($config['db']['adapter'], $config['db']['ini']);   //链接数据库
Zend_Db_Table::setDefaultAdapter($db);    //注册数据库对象$db,至于为什么要注册,我也不清楚

print_r($registry->get('config'));
echo "
";

// setup controller
$frontController = Zend_Controller_Front::getInstance();  //取得控制器的实例对象
$frontController->throwExceptions(true);                  //抛出所有异常,这个对于测试非常重要
//$frontController->setBaseUrl("/webqq");

//设置控制器目录,"default"和"user"就是模块名,而对应的就是模块的控制器路径
//实现“/模块名/控制器名/Action名/”形式的路径跳转
 $frontController->setControllerDirectory(array(
      'default' => './app/default/ctrls',
      'user'    => './app/user/ctrls',
      //'news'    => '../application/news/controllers'
));

//据说加了这个就可以适用模块功能,不过好像没有什么用处,不知道是不是我理解错了
$frontController->setParam('useModules', true);

//设置路由器,通过这个就可以实现页面的跳转调用,从而找到相应的控制器,
//例如输入“/user/news/show/”,系统就可以识别user是模块名,news是控制器名,show是Action名
Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
Zend_Loader::loadClass('Zend_Controller_Dispatcher_Standard');
$frontController->setRouter(new Zend_Controller_Router_Rewrite())
    ->setDispatcher(new Zend_Controller_Dispatcher_Standard());  

print_r($frontController);
echo "
";


// run!
$frontController->dispatch();





3,Mylib_Db类
 
//实现数据库操作的一些基本配置,例如设置数据表的前缀等
class Mylib_Db extends Zend_Db_Table
{

    public function __construct() {
   
        $config = Zend_Registry::get('config');
        $this->_name = $config['db']['prefix'].$this->_name;
        parent::__construct();     //调用父类的构造方法
   
    }

}
?>


4配置文件
//$config会在idnex文件中被注册到注册表,以后就相当于全局变量
//$config['db']是数据库相关的参数
//$config['db']['ini']是数据库链接需要的基本参数
$config['db']['adapter']             = "PDO_MYSQL";

$config['db']['ini']['host']         = "localhost";
$config['db']['ini']['username']     = "webqq";
$config['db']['ini']['password']     = "111111";
$config['db']['ini']['dbname']       = 'webqq';

//说明:这是数据表的前缀,变量名最好不要改变,如果改变的话一定得相应的改变类Mylib_Db中的变量
$config['db']['prefix']              = "wqq_";
?>



5,default模块
    作为例子,这个模块只有一个功能,重要的文件只有两个:
(1)一个是控制器(Index控制器)文件
class IndexController extends Zend_Controller_Action {

private $_user = "";

function init(){
    $this->initView();                /*视图初始化,产生视图对象$this->view,这样在视图文件中就可以这样使用:例如在这里设置好$this->view->title之后,在视图文件中就可以用$this->title来获得title的值了*/
    $this->view->baseUrl = $this->_request->getBaseUrl();   /*获得url,在视图中需要加载其他文件(例如JS,CSS文件等)时要用*/
    Zend_Loader::loadClass('Default_User');     //加载model类
    $this->_user = new Default_User();
}

function indexAction(){
    $this->view->title = "webqq";
    $this->view->users = $this->_user->fetchAll();
    $this->view->render();           //更新视图
}


function noRouteAction(){
    $this->_redirect("/");
}

}

?>


(2)另一个是model文件
//model类库中的类这样命名比较好:{模块名}_{model名}。
/*
model名最好不要相同,就算不是在同一个文件夹下的model名也不要相同,因为这个命名空间({模块名}_{model名})和lib类库里面那些的命名空间不一样。在include_path中的是这样的“./app/default/models”,而这个文件夹下面就直接是model的源文件了,沿着这个路径就直接找到文件了。如果有同名的话只会加载前一个文件
*/
class Default_User extends Mylib_Db
{
    protected $_name        = 'user';   //在Mylib_Db中会自动加上表名的前缀
    protected $_primary     = 'uid';    //主键

}
?>

当然,少不了的还有一个视图文件“views/index/index.phtml”,就不详述了。



6,user模块
    和上面模块的设置基本相同,不同的只有控制器类的类名,需要加上模块名作为前缀,例如“User_IndexController”。(作为例子,这两个模块的功能完全一样)这里就不再详述了。


7,常见错误
(1)"Uncaught exception 'Zend_View_Exception' with message 'script 'index/checklogin.phtml' not found in path。。。。。"就是说找不到相应的视图文件,就算我的action是什么也没做的,在相应的视图文件夹里加上'index/checklogin.phtml'应该就没事了。

(2)“Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Index_IndexController")' in 。。。。。”找不到相应的controller文件,可能是路径错了,或者controller的类名写错了。

(3)数据库操作的乱码问题
解决办法:在获取数据库链接对象的后面(一般在启动文件中)加上“$db->query("SET NAMES gbk");”,其中gbk你可以设置为你需要的字符集,例如utf-8等。

 
阅读(1652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~