Zend framework Zend框架-定义导航菜单的正确方法

Zend framework Zend框架-定义导航菜单的正确方法,zend-framework,zend-navigation,Zend Framework,Zend Navigation,我使用的模板有两个不同的导航菜单 主导航菜单。(固定) 操作导航菜单,包含后退、保存、删除等元素。 此导航元素根据所调用的控制器而更改。对于某些控制器,它可能存在,而对于某些控制器,它可能不存在 我正在使用布局,我已经将所有模板代码放在我的default.phtmllayout文件中。我面临的问题是操作导航菜单的问题。由于此菜单的html代码位于default.phtml中,因此我需要根据调用的控制器更改其内容 我不确定这样做是否正确。但是在我的default.phtml中,我正在检查控制器名称

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

  • 主导航菜单。(固定)

  • 操作导航菜单,包含后退、保存、删除等元素。 此导航元素根据所调用的控制器而更改。对于某些控制器,它可能存在,而对于某些控制器,它可能不存在

  • 我正在使用布局,我已经将所有模板代码放在我的
    default.phtml
    layout文件中。我面临的问题是操作导航菜单的问题。由于此菜单的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; ?>
    
    
    

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

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

    如果控制器刚刚设置:

    $this->view->navigation()->setContainer($navigation);
    
    其中,
    $navigation
    是Zend_导航的一个实例。然后在布局中:

    <?=$this->navigation()->menu()?>
    
    
    
    看起来您的操作导航菜单实际上就像一个子菜单,其中每个操作都是子页面的一部分。这样做的一个好方法是拥有两个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');
        }
    }
    
    如果您不使用库,只需将此代码放入/views/helpers/中,然后重命名类
    Zend\u View\u Helper\u导航

    然后,partial将负责使用占位符呈现子菜单:

    // 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() ?>
    
    如果选择在注册表中注册Zend_导航容器,可以通过以下方式在引导中完成:

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

    有关容器的详细信息。另外,如果您不熟悉占位符,请了解如何使用占位符。

    我是zend framework的新手。你的解释对我来说似乎有点过头了。我仍在掌握助手或导航的概念,以及在zend中如何处理它。你能给我解释一下代码到底发生了什么吗。它属于哪里只是编辑了我的答案并在每个片段上添加了注释。从Zend文档中,允许开发人员将运行时和/或按需功能注入任何扩展
    Zend\u Controller\u Action
    的操作控制器。动作助手的目标是尽量减少扩展抽象动作控制器的必要性,以便注入通用动作控制器功能。我感谢您的帮助。但是你认为我不使用Zend_导航也能达到同样的效果吗?。Zend_Navigation让我烦恼的是定制装饰器,我仍然无法获得它。将视图帮助程序用于相同的目的如何?您始终可以覆盖Zend Navigation视图帮助程序,使其按照您想要的方式运行。但是,我建议您保留Zend_Navigation组件来呈现您的导航,它在大多数情况下使事情变得更容易。我在路径(./views/scripts/)中未找到此错误
    script'partials/_action-Navigation.phtml'
    我使用的是模块化目录结构,我将分区放在
    应用程序/layouts/partials
    目录中,但我无法使其正常工作。如何更改路径以使用与我的目录结构相关的分区?我可以使用zend_导航为我的菜单生成完全相同的语法吗?你能给我举个例子吗?:)你的方法的问题是我需要为所有控制器和动作定义动作导航。而对于我的应用程序,动作导航对于某些应用程序存在,而对于某些应用程序则不存在
    // 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);
    }