1

我正在尝试扩展控制器,所以我的 IndexController 看起来像

class IndexController extends Zend_Controller_Action
{
   public function IndexAction()
   {
       //Add a few css files
       //Add a few js files
   }

   public function LoginAction()
   {
       //Login stuff
   }
}

现在当我尝试做:

require_once("IndexController.php");
class DerivedController extends IndexController
{
    public function IndexAction()
    {
         //Override index stuff, and use the dervied/index.phtml
    } 
}

打电话给derived/login

`Fatal error: Uncaught exception 'Zend_View_Exception' \
 with message 'script 'derived/login.phtml' not found in path`

所以为了解决这个问题,我说哦,没关系,我可以强制登录使用它自己的视图。然后我想,这很简单,我要做IndexController::LoginAction的就是添加:

$this->view->render('index/login.phtml');

但它仍然试图寻找derived/login.phtml.

只是为了进一步扩展这一点,我只希望DerivedController使用定义的操作,derived/<action>.phtml但其他所有内容,例如LoginAction使用<originalcontroller>/<action>.phtml

我应该以不同的方式做事吗?还是我错过了一小步?

注意如果我添加derived/login.phtml或符号链接它index/login.phtml可以工作。

4

3 回答 3

2

如果您想重用所有视图 (*.phtml) 文件,IndexController您可以覆盖 cunstructor 中的 ScriptPath 并将其指向正确的 (indexcontroller) 文件夹:

class DerivedController extends IndexController
{

    public function __construct()
    {
        $this->_view = new Zend_View(); 
        $this->_view->setScriptPath($yourpath);
    }

[...]

    public function IndexAction()
    {
         //Override inherited IndexAction from IndexController
    }

[...]

}

编辑:

尝试在 predispatch 中使用一个简单的条件:

class DerivedController extends IndexController
{

    public function preDispatch()
    {
        if (!$path = $this->getScriptPath('...')) { 
            //not found ... set scriptpath to index folder 
        }

        [...]

    }

[...]

}

这样您可以检查是否derived/<action>.phtml存在,否则将脚本路径设置为使用index/<action>.phtml.

于 2013-05-16T09:50:14.380 回答
2

一个类如何扩展一个 Action 应该是

class DerivedController extends IndexController

并不是

class DerivedController extends IndexAction
于 2013-05-16T09:36:23.640 回答
1

DerivedController应该扩展 CLASSIndexController而不是一个函数(IndexAction)。这样你就不需要任何require_once().

正确方法:

class DerivedController extends IndexController
{
    public function IndexAction()
    {
         //Override inherited IndexAction from IndexController
    } 
}
于 2013-05-16T09:36:41.153 回答