Zend Framework - 定义导航菜单的正确方法

时间:2012-04-08 12:05:20

标签: zend-framework zend-navigation

我使用的模板有两种不同的导航菜单。

  
      
  1. 主导航菜单。 (已修复)

  2.   
  3. 操作导航菜单,包含后退,保存,删除等元素。   此导航元素根据被调用的控制器而变化。虽然它可能存在于某些控制器而某些控制器却不存在

  4.   

我正在使用布局,并且已将所有模板代码放在我的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; ?>

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

2 个答案:

答案 0 :(得分:3)

您的操作导航菜单似乎实际上就像SubMenu,其中每个Action都是子页面的一部分。做这种事情的一个好方法是有两个Zend_Navigation实例,你可以将它们存储在注册表中。然后,在您的控制器中,您可以在preDispatch()方法中调用 Action Helper ,如下所示:

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

当然,只有需要此操作导航菜单的控制器才能使用此方法。 此Action Helper将基本上获取当前视图对象,创建占位符并呈现部分,如下所示:

// 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');
    }
}

如果您不使用库,只需将此代码放在 / views / helpers / 中,然后重命名该类Zend_View_Helper_Navigation

然后,partial将负责使用占位符渲染您的subMenu:

// 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() ?>

此外,使用设置为onlyActiveBranch选项true的{​​{3}}呈现菜单将允许您仅呈现活动分支,其中每个分支将对应您的控制器

最后,在您的布局中,您将拥有:

 // 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);
}

有关容器的更多信息,navigation view helper method renderMenu()。此外,如果您不熟悉占位符,refer to this page关于如何使用它们。

答案 1 :(得分:1)

我想没关系。我会在控制器中执行此操作并使用Zend_Navigation包含导航,然后您可以使用ACL等。

如果控制器刚刚设置:

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

其中$navigation是Zend_Navigation的一个实例。然后在你的布局中:

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