2013-02-21 58 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