2013-02-21 67 views
0

我有一個佈局文件,如下所示:使用控制器插件來擴展Zend框架的現有佈局

<?php echo $this->doctype(); ?> 
<html> 
    <head> 
     <?php echo $this->headTitle(); ?> 
     <?php echo $this->headLink(); ?> 
    </head> 
    <body> 
     <?php echo $this->layout()->content; ?> 
    </body> 
</html> 

我這是寫在另一個模板

<p> 
    <div> 
     menu code goes here 
    </div> 
    <p> 
     <?php echo $this->actionContent; ?> 
    </p> 
</p> 

我想要的菜單系統操作方法的輸出應該放置在$ this-> actionContent中,所有這些都應該轉到佈局。

然後我寫了一個控制器插件如下:

class ZFExt_Controller_Plugin_Addmenu extends Zend_Controller_Plugin_Abstract 
{ 
    public function postDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $view = Zend_Controller_Front::getInstance() 
         ->getParam('bootstrap') 
         ->getResource('view'); 

     if (false !== $request->getParam('menu')) 
     { 
      $response = $this->getResponse(); 
      $content = $response->getBody(true); 
      $view->menuContent = $content['default']; 
      $updatedContent = $view->render('menu.phtml'); 
      $response->setBody($updatedContent); 
     } 
    } 
} 

在控制器類

class IndexController extends Zend_Controller_Action { 


    public function indexAction() { 

    } 

    public function viewAction() 
    { 
      $this->getRequest()->setParam('menu', false); 
    } 
} 

故取其動作不想要的菜單出現,我們可以傳遞參數「菜單」,值爲'假'。

我的問題是:這是正確的方法嗎?

+0

您可以使用Zend的導航做 – Shaolin 2013-02-21 18:06:08

回答

1

首先,我可能不會從一個動作渲染菜單。我傾向於將操作視爲對應於HTTP請求,爲等待的客戶端構建完整頁面/響應,而不僅僅是頁面片段。我要麼創建一個單獨的類/組件句柄菜單,要麼只使用Zend_Navigation

除此之外,如果我理解正確的話,你只是想每個動作可以啓用/禁用佈局的菜單部分,對不對?

那麼,如何簡單地設置在啓用/禁用佈局菜單視圖的開關。

佈局是這樣的:

<?php echo $this->doctype(); ?> 
<html> 
    <head> 
     <?php echo $this->headTitle(); ?> 
     <?php echo $this->headLink(); ?> 
    </head> 
    <body> 
     <?php if ($this->renderMenu): ?> 
      // render menu here 
     <?php endif; ?> 
     <?php echo $this->layout()->content; ?> 
    </body> 
</html> 

然後在你的動作,如果要禁用菜單呈現,您可以設置:

$this->view->renderMenu = false; 

大概也值得設置爲默認值$view->renderMenu標誌位於請求調度週期的某個點 - 可能位於引導程序,控制器插件或控制器init()中。

+0

我其實是試圖找出是否有什麼辦法可以延長的佈局模板,以便我們能夠避免在模板中的代碼段儘可能地。我沒有在網上找到任何東西,這就是爲什麼我嘗試了我自己版本的擴展模板。那麼我可以假設在zend中沒有擴展模板的東西嗎? – kaushik 2013-02-22 10:18:04

+0

我見過有關多級佈局的東西。 IIRC,另一個插件攔截佈局渲染,像這樣的聲音。也許更容易的是使用支持模板繼承的Twig這樣的模板系統。 – 2013-02-22 15:08:26