布局被渲染两次

问题描述:

我的布局显示两次似乎有问题。我想知道这是否是由我的前端控制器插件(参见下文)中的某些东西引起的,该插件仅将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自动将视图分配给布局。

+0

谢谢安和。我想知道它是否可能是_forward实际上,但我真的需要使用它,因为我必须在动作之间传递表单值,似乎无法让它与$ this - > _ helper-> redirector一起工作。 我不得不创建一个新的视图对象,因为主应用程序使用Zend_View/Smarty混合,我不想改变我所有的模板,因为它们是纯Zend_View。 – somekindofusernamegoeshere 2009-09-25 14:15:08

+0

为什么你需要将表单数据传递给另一个动作?该行为是否在同一个控制器中。如果是这样,你不能调用$ this-> otherAction();或者使用动作链接,但这可能会呈现另一个视图,除非您关闭任何一个动作的呈现 – andho 2009-09-25 14:24:09

这通常是由我的经验中的ErrorController引起的。我通常清除响应,以确保没有嵌套:

public function errorAction() { 

     $this->getResponse()->clearBody(); 

//handle error ........ 

} 

如果调用从一个Ajax调用一个动作,你的布局被调用两次,你可以在动作设置

$this->_helper->layout->disableLayout(); 

在我的项目中,我也做了一个错误的ajax调用,这使得它再次渲染。希望这可以帮助