2009-10-04 187 views
2

我想让我的控制器 - 即Page_IndexController - 扩展基础控制器。Zend Framework - 扩展控制器

例如;

class Page_IndexController extends Content_IndexController { 
} 

然而,似乎磁带自动加载机没有在任何时候拿起这是一个控制器类的事实 - 我得到的错误Fatal error: Class 'Content_IndexController' not found

第一个问题:我该如何解决这个问题?

我可以通过require_once'ing通用'内容'控制器来暂时解决这个问题,但这并不理想。

下一个问题是,如果我的页面控制器具有它自己的操作视图脚本,它没有问题。但是如果我扩展一个控制器,并且我在页面控制器上调用例如'listAction',但是这个动作在Content_IndexController中实现,它仍然在页面控制器的“scripts”目录中查找列表视图脚本。

第二个问题:如果我的控制器没有自己的父级视图脚本,我该如何配置我的控制器?

回答

2

自动加载程序找不到您的控制器,因为您没有告诉它在哪里搜索。该Content_IndexController是不是在你的“库”文件夹(我认为它的内容模块内部)

我会建议你的库文件夹,无论Content_IndexControllerPage_IndexController继承是创建一个My_Controller_IndexBase类。

对视图脚本的主题做了更多的研究。您可以在init()某处更改视图的脚本路径。我很确定这可能需要在ViewRenderer中完成 - 但也可能在控制器的init/action代码中工作。

$this->view->setScriptPath(
    array(
    realpath(APPLICATION_PATH+'/../path/to/other/module/views'), 
) + $this->view->getScriptPath()); 

脚本路径根据Zend_View_Abstract

3

处理后进先出如果你的应用程序可以找到Page_IndexController你可能有一个页面模块。如果你的应用程序中没有使用模块,你必须命名你的控制器PageController和ContentController,而不是Page_IndexController,...因此解决方案是使用自动加载器注册“Content_”命名空间。

至于第二个问题。您可以扩展提供的ViewRenderer控制器动作助手,并覆盖查找视图脚本的方法,以便在需要时可以在其他位置查找。你只需要将你的viewrenderer传递给前端控制器。要将您自己的ViewRenderer传递给控制器​​,请查看Advanced Usage Examples

+0

注册名称空间不仅有利于如果你的模块在/library/Content/IndexController.php - 它似乎仍然没有把它捡起来在/application/modules/content/controllers/IndexController.php ...我在这里错过了什么? – searbe 2009-10-11 15:54:50

0

对于第二个问题:

如果你不想写自己的ViewRenderer,你可以使用$这 - >的renderScript(“父/ index.phtml”)来呈现特定的视图脚本。你可以在你的子控制器中调用它,而不是让视图自动呈现给你,或者如果你的子控制器依赖父控制器来完成脚本的渲染,你可以将它放在父控制器中。

0

我这样做。

弗里斯特我登记谁在我的index.php插件到公用文件夹的新名称:

/public/index.php 

$autoloader = Zend_Loader_Autoloader::getInstance(); 
$autoloader->registerNamespace('modelo_'); 

谢胜利,我创建一个新的文件夹,把我的控制器

/library/modelo/ 

三创建我的控制器模型并将其放入创建的文件夹中并重命名它。

class Modelo_ModeloController extends Zend_Controller_Action 
{ 

protected $_db = null; 
protected $_menu = null; 
protected $_util = null; 
protected $_path = null; 

... actions to my model 

public function inicial(){} 

} 

,我继承这个类即时通讯我的应用程序

class Sispromo_PedidoController extends Modelo_ModeloController 
{ 
public function init(){} 
.... 
}