我正在尝试扩展控制器,所以我的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
或符号链接,则可以正常工作。
答案 0 :(得分:2)
一个类如何扩展一个Action它应该是
class DerivedController extends IndexController
而不是
class DerivedController extends IndexAction
答案 1 :(得分:2)
如果要重用IndexController
中的所有视图(* .phtml)文件,可以覆盖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
。
答案 2 :(得分:1)
DerivedController
应该扩展CLASS IndexController
而不是一个函数(IndexAction)。这样您就不需要任何require_once()
。
正确的方式:
class DerivedController extends IndexController
{
public function IndexAction()
{
//Override inherited IndexAction from IndexController
}
}