2009-09-25 4 views
1

레이아웃이 두 ​​번 표시되는 데 문제가있는 것 같습니다. 이것이 내가 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);       
        } 

      }               
    } 

}

답변

1

_forward를 사용할 때이 문제에 실행 한 또는 나는 preDispatch 플러그인 내에서 errorController로 리디렉션 할 때. 이런 일들을 확인할 수 있습니다.

또한 전 라인에 대해 조금 의심스러운 해요 :

$layout->setView($view); 

그것이 필요합니다. Zend는 레이아웃에 뷰를 자동으로 할당하지 않습니다.

+0

감사합니다. 그것이 실제로 _forward 수 있을지 궁금해하지만 정말 그것을 작업 사이에 양식 값을 전달할 필요가 및 $ this-> helper-> 리디렉터 작동하도록 얻을 수없는 것처럼 그것을 사용해야합니다. 메인 애플리케이션이 Zend_View/Smarty 하이브리드를 사용하고 순수한 Zend_View처럼 모든 템플릿을 변경하고 싶지 않기 때문에 새로운 뷰 객체를 만들어야했습니다. – somekindofusernamegoeshere

+0

양식 데이터를 다른 작업으로 전달해야하는 이유는 무엇입니까? 동일한 컨트롤러에서 동작입니다. 그렇다면 $ this-> otherAction();을 호출 할 수 없습니다. 또는 액션 체인을 사용하지만 액션 중 하나의 렌더링을 해제하지 않는 한 다른 뷰를 렌더링 할 수 있습니다. – andho

2

이것은 일반적으로 내 경험에 따른 ErrorController로 인해 발생합니다. 나는 보통 더 중첩가 없습니다 확인 응답을 취소 :

public function errorAction() { 

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

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

} 
0

당신은 Ajax 호출에서 작업을 호출하고 레이아웃 두 번 호출되는 경우 작업에

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

을 설정할 수 있습니다.

제 프로젝트에서 나는 잘못된 아약스 호출도했는데 다른 호출을 만들었습니다. 희망이 도움이