2009-10-04 112 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(){} 
.... 
}