4

我正在使用一个模板,其中有两个不同的导航菜单。

  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; ?>

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

4

2 回答 2

3

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

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

当然,只有需要这个 Action 导航菜单的控制器才有这个方法。这个 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

然后部分将负责使用占位符呈现您的子菜单:

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

此外,使用导航视图辅助方法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);
}

有关容器的更多信息,请参阅此页面。此外,如果您不熟悉占位符,这里有一个关于如何使用它们的很好的实际示例。

于 2012-04-08T14:40:15.400 回答
1

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

如果控制器刚刚设置:

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

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

<?=$this->navigation()->menu()?>
于 2012-04-08T14:08:22.760 回答