2012-04-08 37 views
4

我使用的模板有两个不同的导航菜单。Zend Framework - 定义导航菜单的正确方法

  1. 主导航菜单。 (固定)

  2. 操作的导航菜单,包含元素如背部,保存,删除等 此导航元素改变根据被称为控制器。虽然它可能存在一些控制器和一些它不

我正在利用布局,和我已经把所有的模板代码在我default.phtml布局文件。我面对的问题是动作导航菜单。由于这个菜单的html代码驻留在default.phtml我需要根据被调用的控制器来更改它的内容。

我不知道这是否是正确的做法。但在我的default.phtml我检查控制器的名称,并相应地显示菜单。这是我正在使用的代码。

<?php if(Zend_Controller_Front::getInstance()->getRequest()->getControllerName() == 'item'): ?> 
    <!-- Action Navigation Menu --> 
    <div class="statsRow"> 
     <div class="wrapper"> 
      <a href="#"><img src="/images/icons/dark/add.png" alt="" class="icon"><span>New item</span></a> 
      <a href="#"><img src="/images/icons/dark/cd.png" alt="" class="icon"><span>Publish/Unpublish item</span></a> 
      <a href="#"><img src="/images/icons/dark/trash.png" alt="" class="icon"><span>Delete item</span></a> 
     </div> 
    </div> 
    <div class="line"></div> 
<?php endif; ?> 

可以这样做吗?或者我有更好的方法来做到这一点?

回答

3

看来你行动导航菜单其实的行为像一个子菜单,每个动作子页面的一部分。做这样的事情的一个好方法是有两个Zend_Navigation实例,例如你可以存储在注册表中。然后,在你的控制器,你可以调用一个动作助手preDispatch()方法是这样的:

// in each controller where you want your "action navigation menu" 
public function preDispatch() 
{ 
    $this->_helper->navigation()->renderActionNavigation(); 
} 

当然,只需要这个操作的导航菜单会有这种方法的控制器。 这个动作助手将基本得到当前视图对象,创建占位符和渲染的部分如下:

// in your library/My/Controller/Action/Helper 
class My_Controller_Action_Helper_Navigation extends Zend_Controller_Action_Helper_Abstract 
{ 
    private $_view = null; 

    public function direct() 
    { 
     $this->_view = $view = Zend_Layout::getMvcInstance()->getView(); 
     $this->_view->placeholder('action-navigation'); 
     return $this; 
    } 

    public function renderActionNavigation() 
    { 
     $this->_view->render('partials/_action-navigation.phtml'); 
    } 
} 

如果你不使用库,只需把这个代码在/视图/助理/并将其重命名为Zend_View_Helper_Navigation

则部分将负责使用占位符,以使您的子菜单:

// in /view/scripts/partials/_action-navigation.phtml 
<?php $this->placeholder('action-navigation')->captureStart() ?> 
<?php $options = array('onlyActiveBranch' => true); ?> 
<?= $this->navigation()->menu()->renderMenu(Zend_Registry::get('nav.action-navigation'), $options); 
// here I assume that you've stored your Navigation container in the registry ?> 
<?php $this->placeholder('action-navigation')->captureEnd() ?> 

此外,渲染使用navigation view helper method renderMenu()一个选项onlyActiveBranch设置你的菜单true将让你到只呈现活跃分支,其中每个分支对应您的控制器

最后,在你的布局你会这样:

// in your layout file (usually named layout.phtml) 
<?= $this->placeholder('action-navigation'); ?> 

如果您选择在注册表中注册Zend_Navigation容器,这可以在引导做这样:

// in your bootstrap.php 
protected function _initNavigation() 
{ 
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
    $container = new Zend_Navigation($config); 
    Zend_Registry::set('nav.action-navigation', $container); 
} 

有关集装箱的更多信息,请致电refer to this page。另外,如果您对占位符不熟悉,请拨打here is a good practical example以了解如何使用它们。

+0

我是新来的zend框架。而你的解释似乎对我来说有点过头。我仍然掌握助手或导航的概念,以及它如何在zend中处理。你能否向我解释一下代码中发生了什么和所有事情。它属于哪里 – 2012-04-08 15:48:22

+0

刚刚编辑我的答案,并在每个片段添加评论。从Zend文档中,[Action Helpers](http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown)允许开发人员注入运行时和/将需求功能添加到扩展了'Zend_Controller_Action'的任何Action控制器中。 **动作助手**旨在最大限度地减少扩展抽象动作控制器以注入通用动作控制器功能的必要性。 – Liyali 2012-04-08 17:12:08

+0

我很感谢你的帮助。但是你认为我可以在不使用Zend_Navigation的情况下实现同样的效果吗? Zend_Navigation有什么困扰我是自定义装饰器,我仍然无法得到它。如何使用视图助手出于同样的目的? – 2012-04-10 14:06:43

1

我想没关系。我不是做在控制器和包括使用Zend_Navigation导航,那么你就可以利用ACL等

的如果控制器只设置:

$this->view->navigation()->setContainer($navigation); 

哪里$navigation是Zend_Navigation的一个实例。然后在您的布局:

<?=$this->navigation()->menu()?> 
+0

我可以使用zend_navigation来为我的菜单生成完全相同的语法吗?请给我一个例子:) – 2012-04-08 15:49:30

+0

请参阅http://stackoverflow.com/questions/1243697/getting-zend-navigation-menu-to-work-with-jquerys-fisheye/1255289#1255289 – Ashley 2012-04-08 18:46:58

+0

问题与你的方法是我需要为所有控制器和动作定义动作导航。而对于我的应用程序的动作导航存在的一些和一些它不 – 2012-04-10 16:11:01