布局被渲染两次
问题描述:
我的布局显示两次似乎有问题。我想知道这是否是由我的前端控制器插件(参见下文)中的某些东西引起的,该插件仅将Zend Layout仅用于特定模块,而不用于主应用程序。任何答案将不胜感激。由于布局被渲染两次
class My_Controller_Plugin_AdoptLayout extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$moduleName = $request->getModuleName();
if ($moduleName == 'some-module') {
if (!Zend_Layout::isEnabled()) {
$view = new Zend_View(array('encoding' => 'UTF-8'));
$view->addScriptPath(ROOT_DIR . '/modules/some-module/views/scripts/');
$view->doctype('XHTML1_STRICT');
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
Zend_Layout::startMvc();
$layout = Zend_Layout::getMvcInstance();
$layout->setLayout('default');
$layout->setLayoutPath(APPLICATION_PATH . '/modules/some-module/views/scripts/layouts/');
$layout->setView($view);
}
}
}
}
答
我一直在使用的时候_forward遇到这个问题,或者当我一个preDispatch插件中重定向到errorController。你可以检查这些东西。
而且我有点怀疑,该行:
$layout->setView($view);
是否有必要。不会Zend自动将视图分配给布局。
答
这通常是由我的经验中的ErrorController引起的。我通常清除响应,以确保没有嵌套:
public function errorAction() {
$this->getResponse()->clearBody();
//handle error ........
}
答
如果调用从一个Ajax调用一个动作,你的布局被调用两次,你可以在动作设置
$this->_helper->layout->disableLayout();
。
在我的项目中,我也做了一个错误的ajax调用,这使得它再次渲染。希望这可以帮助
谢谢安和。我想知道它是否可能是_forward实际上,但我真的需要使用它,因为我必须在动作之间传递表单值,似乎无法让它与$ this - > _ helper-> redirector一起工作。 我不得不创建一个新的视图对象,因为主应用程序使用Zend_View/Smarty混合,我不想改变我所有的模板,因为它们是纯Zend_View。 – somekindofusernamegoeshere 2009-09-25 14:15:08
为什么你需要将表单数据传递给另一个动作?该行为是否在同一个控制器中。如果是这样,你不能调用$ this-> otherAction();或者使用动作链接,但这可能会呈现另一个视图,除非您关闭任何一个动作的呈现 – andho 2009-09-25 14:24:09