标题: ZF路由分发时控制器与动作奇怪问题,求助!
kylingood
版主
Rank: 7Rank: 7Rank: 7



UID 104
精华 1
积分 10
帖子 45
翻译 0
原创 0
阅读权限 100
注册 2007-6-22
状态 离线
发表于 2008-1-23 13:07  资料  短消息  加为好友 
ZF路由分发时控制器与动作奇怪问题,求助!

各位高人..本人在开始用ZF做一个项目...我分二个模块...第一个是前台(default).另一个是后台(admin).
    我在前台页面有一个链接到后台的动作...比如说..我在aaa.php这个页面里有这么一个动作..当我点链接的时候.他可以进入到后台(admin)的(bbb.php)页面....(也就是证明了路由分发到了这个控制器并产生了index这个动作).可是当我点击bbb.php页面上的链接(这里的链接是admin这个模块里,存在的控制器上的都存在的动作)时候.就会显示出aaa.php 的页面....不知道是怎么一回事..下面贴我的index.php文件出来..哎...好晕...希望有高手帮小弟一把...

下面是index.php文件..不知道是不是这里的问题:

PHP代码如下:

<?php
 error_reporting
(E_ALL|E_STRICT);
 
//date_default_timezone_get('Asia/Shanghai');
 
date_default_timezone_set('Asia/Shanghai');
 
define('ROOT','../shop/');//定义网站根目录
 
define('DIR_STYLE',ROOT.'public/styles/');//定义样式目录
 
set_include_path'.'PATH_SEPARATOR .
      
'./library/'PATH_SEPARATOR .
      
'./application/modules/default/models/'PATH_SEPARATOR .
      
get_include_path());
 require_once 
'Smarty/Smarty.class.php';
 require_once 
'Zend/Loader.php';
 
Zend_Loader::registerAutoload(); //自动加载类文件
 
$registry Zend_Registry::getInstance();  //实例化注册对象
 /*网站主文件SMARTY配置文件*/
 
$smarty=new Smarty();
 
$smarty->left_delimiter="<{";
 
$smarty->right_delimiter="}>";
 
$smarty->compile_dir="./application/modules/default/views/templates_c";
 
$smarty->template_dir="./application/modules/default/views/templates";
 
$registry['smarty']=$smarty;
 
 
/*后台管理员SMARTY配置文件*/
 
$smart=new Smarty();
 
$smart->left_delimiter="<{";
 
$smart->right_delimiter="}>";
 
$smart->compile_dir="./application/modules/admin/views/templates_c";
 
$smart->template_dir="./application/modules/admin/views/templates";
 
$registry['smart']=$smart;
 
 
//读取配置文件
 
require_once 'Zend/Config/Ini.php';
 
$config=new Zend_Config_Ini('./application/config/config.ini','general');
 
$registry['config']=$config;
 
 
//连接到数据库
 
$db=Zend_Db::factory($config->db->type,$config->db->config->toArray());
 
Zend_Db_Table::setDefaultAdapter($db);
 
$registry['db']=$db;
 
 
$auth=Zend_Auth::getInstance();//实例化用户认证类
 
$acl=new ShopAcl();//实例化用户权限类
 
 //首先通过getInstance()获取前端控制器实例,然后通过setControllerDirectory() 注册传入的路径,最后分发.
 
$frontController Zend_Controller_Front::getInstance();
 
//取到控制器目录的当前位置
 
$frontController->addModuleDirectory('./application/modules')
     ->
setBaseUrl('/shop')//设置基地址
     
->setParam('useDefaultControllerAlways',true)//缺省或者错误控制器时使用默认控制器
     
->setParam('noViewRenderer',true)//禁止自动动视图渲染
     
->setParam('noErrorHandler',true)//禁止自动错误处理
     
->throwExceptions(true)
     ->
registerPlugin(new ShopAuth($auth,$acl))
     ->
dispatch();
 



[ 本帖最后由 kylingood 于 2008-1-23 13:11 编辑 ]

顶部
jasonqi
PHPEye Developer
Rank: 8Rank: 8



UID 275
精华 0
积分 0
帖子 74
翻译 0
原创 0
阅读权限 1
注册 2007-8-11
状态 离线
发表于 2008-1-24 02:40  资料  短消息  加为好友 
能否多提供点资料?

顶部
kylingood
版主
Rank: 7Rank: 7Rank: 7



UID 104
精华 1
积分 10
帖子 45
翻译 0
原创 0
阅读权限 100
注册 2007-6-22
状态 离线
发表于 2008-1-24 08:36  资料  短消息  加为好友 


QUOTE:
原帖由 jasonqi 于 2008-1-24 02:40 发表
能否多提供点资料?

可以.下面是我的项目目录:

--------shop
             ----application
                    -----config
                    -----modules
                              -----default
                                     ------controllers
                                             ---IndexController.php
                                     ------models
                                     ------views

                              -----admin
                                     ------controllers
                                             ---IndexController.php
                                             ---ProductController.php
                                     ------models
                                     ------views

             ----public
             ----library
             ----index.php
我的问题在于我前台模块是default...网站先通过default模块里的控制器IndexController.php访问aaa.php页面.在aaa.php页面中有一个链接动作到模块admin中..也就是通过admin模块中的IndexController.php来显示出bbb.php 页面.这样可以访问到bbb.php页面.但是在bbb.php页面里,我要用ProductController.php控制器中的productshow动作来显示商品列表时..我点击这个链接的时候就会返回到aaa.php页面...奇怪的就是这样...
下面是default 模块中的 IndexController.php:

PHP代码如下:

<?php
class IndexController extends Zend_Controller_Action
{
        public 
$smarty;
        public function     
init(){
            
$this->smarty=Zend_Registry::get('smarty');
            
$this->smarty->assign('pathcss',$this->_request->getBasePath());
            
$this->smarty->assign('adminpath',$this->_request->getBaseUrl());
        }
        public function     
indexAction(){
            
$this->smarty->display('index.phtml');(这里就是上面说的aaa.php页面)
        }
                
}
?>


下面二个文件是admin模块中的 IndexController.php和ProductController.php:

PHP代码如下:

<?php

    
class Admin_IndexController extends Zend_Controller_Action{
        
        public 
$smart;

        public function    
init(){
            
//$this->registry = Zend_Registry::getInstance();
            
$this->smart=Zend_Registry::get('smart');
            
$this->smart->assign('admincss',$this->_request->getBasePath());
            
$this->smart->assign('adminpath',$this->_request->getBaseUrl());
        }
        
        public function 
indexAction(){
        
            
$this->smart->display('top.phtml');
            
$this->smart->display('main.phtml');(这里是上面说的bbb.php)
        }
        
        public function    
__call($method,    $args)
        {
            if (
'Action' ==    substr($method,    -6)) {
                
$controller    $this->getRequest()->getControllerName();
                
$url '/' $controller '/index';
                return 
$this->_redirect($url);
            }

            throw new 
Exception('Invalid method');
        }    
    }





PHP代码如下:

<?php

    
class Admin_ProductController extends Zend_Controller_Action{
        
        public 
$smart;

        public function    
init(){
            
$this->smart=Zend_Registry::get('smart');
            
$this->smart->assign('admincss',$this->_request->getBasePath());
            
$this->smart->assign('adminpath',$this->_request->getBaseUrl());
        }

        public function 
productshowAction(){
            
$this->smart->display('top.phtml');
            
$this->smart->display('productshow.phtml');
        }




顶部
jasonqi
PHPEye Developer
Rank: 8Rank: 8



UID 275
精华 0
积分 0
帖子 74
翻译 0
原创 0
阅读权限 1
注册 2007-8-11
状态 离线
发表于 2008-1-24 15:35  资料  短消息  加为好友 


PHP代码如下:
/**
     * Specify a directory as containing modules
     *
     * Iterates through the directory, adding any subdirectories as modules;
     * the subdirectory within each module named after {@link $_moduleControllerDirectoryName}
     * will be used as the controller directory path.
     *
     * @param  string $path
     * @return Zend_Controller_Front
     */
    
public function addModuleDirectory($path)
    {
        
$dir = new DirectoryIterator($path);
        foreach (
$dir as $file) {
            if (
$file->isDot() || !$file->isDir()) {
                continue;
            }

            
$module    $file->getFilename();

            
// Don't use SCCS directories as modules
            
if (preg_match('/^[^a-z]/i'$module) || ('CVS' == $module)) {
                continue;
            }

            
$moduleDir $file->getPathname() . DIRECTORY_SEPARATOR $this->getModuleControllerDirectoryName();
            
$this->addControllerDirectory($moduleDir$module);
        }

        return 
$this;
    }



上面是addModuleDirectory函数的源代码,看看它是不是把你赋给 $path 变量的值 ('./application/modules')处理对了。

我猜问题在这里,但没有验证,希望有经验的同学看一哈。

顶部
kylingood
版主
Rank: 7Rank: 7Rank: 7



UID 104
精华 1
积分 10
帖子 45
翻译 0
原创 0
阅读权限 100
注册 2007-6-22
状态 离线
发表于 2008-1-24 17:16  资料  短消息  加为好友 
这一层是处理对了..可是到了admin模块里面就会回到原来的页面.....
不知道我哪里写的有问题....

顶部
jasonqi
PHPEye Developer
Rank: 8Rank: 8



UID 275
精华 0
积分 0
帖子 74
翻译 0
原创 0
阅读权限 1
注册 2007-8-11
状态 离线
发表于 2008-1-25 00:00  资料  短消息  加为好友 


QUOTE:
原帖由 kylingood 于 2008-1-24 17:16 发表
这一层是处理对了..可是到了admin模块里面就会回到原来的页面.....
不知道我哪里写的有问题....

你是不是说已经执行到这里了?(我的意思是你通过无论什么调试器,你已经看到程序已经跑到这里了)

PHP代码如下:
public function indexAction(){
        
            
$this->smart->display('top.phtml');
            
$this->smart->display('main.phtml');(这里是上面说的bbb.php)
        }



如果这样,那和ZF的控制器就没有关系了,看看你的smarty是不是有问题。

顶部
kylingood
版主
Rank: 7Rank: 7Rank: 7



UID 104
精华 1
积分 10
帖子 45
翻译 0
原创 0
阅读权限 100
注册 2007-6-22
状态 离线
发表于 2008-1-25 09:17  资料  短消息  加为好友 
是的...可以执行这个页面....控制器可以分到这个页面来...可能是smarty问题...但是不知道怎样改才好....我的smarty配置在上面index.php上,,因为要分开模板页..所以配置了二个smarty,也不知道这样做对不对......

顶部
玉面修罗
新手上路
Rank: 1



UID 290
精华 0
积分 0
帖子 14
翻译 0
原创 0
阅读权限 10
注册 2007-8-17
状态 离线
发表于 2008-1-27 17:43  资料  短消息  加为好友 
怀疑你的URL路由信息。。
把你生成的链接地址都发上来。
严重怀疑URL路由信息错误导致呼叫了不存在的action导致了__call调用,然后显示了首页信息。

顶部
 


PHPEye开源社区


当前时区 GMT+8, 现在时间是 2008-11-21 20:29

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.096985 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - PHPEye开源社区 - Archiver