Php 如何扩展Zend导航菜单视图帮助器?

Php 如何扩展Zend导航菜单视图帮助器?,php,zend-framework,zend-view,zend-navigation,Php,Zend Framework,Zend View,Zend Navigation,我需要更改Zend\u View\u Helper\u Navigation\u菜单的输出。我找到了需要修改的两个函数,我知道如何进行所需的更改。我不知道的是如何让导航对象使用我的视图辅助对象而不是Zend 表示我的类扩展的代码段: // file /library/My/View/Helper/Navigation/Menu.php class My_View_Helper_Navigation_Menu extends Zend_View_Helper_Navigation_Menu {

我需要更改
Zend\u View\u Helper\u Navigation\u菜单
的输出。我找到了需要修改的两个函数,我知道如何进行所需的更改。我不知道的是如何让导航对象使用我的视图辅助对象而不是Zend

表示我的类扩展的代码段:

// file /library/My/View/Helper/Navigation/Menu.php
class My_View_Helper_Navigation_Menu extends Zend_View_Helper_Navigation_Menu
{
    protected function _renderDeepestMenu(Zend_Navigation_Container $container,
                                          $ulClass,
                                          $indent,
                                          $minDepth,
                                          $maxDepth)
    {
        // modified code here
    }

    protected function _renderMenu(Zend_Navigation_Container $container,
                                   $ulClass,
                                   $indent,
                                   $minDepth,
                                   $maxDepth,
                                   $onlyActive)
    {
        // modified code here
    }
}

编辑以澄清

我想更改
  • 元素的类,并删除
    EOL
    和缩进。在菜单视图脚本中没有这样做的选项,这就是我必须扩展它的原因

    在我的引导中初始化导航对象:

    $navTable = new Default_Model_Site_DbTable_Navigation();
    $view = $this->getResource('view');
    $view->navigation(new Zend_Navigation($navTable->getNavigation()));
    
    在我的布局中呈现菜单:

    echo $this->navigation()->menu();
    

    解决方案

    我通过如下方式重命名了它,但我不清楚为什么不能重载/覆盖
    \u菜单
    类和
    菜单()
    函数

  • 将类名更改为
    My\u View\u Helper\u Navigation\u MyMenu
  • myMenu
    函数添加到类(
    returnparent::menu($container);
  • 调用
    echo$this->navigation()->myMenu()
  • 类线框:

    // file /library/My/View/Helper/Navigation/MyMenu.php
    class My_View_Helper_Navigation_MyMenu extends Zend_View_Helper_Navigation_Menu
    {
        public function myMenu(Zend_Navigation_Container $container = null)
        {
            return parent::menu($container);
        }
    
        protected function _renderDeepestMenu(Zend_Navigation_Container $container,
                                              $ulClass,
                                              $indent,
                                              $minDepth,
                                              $maxDepth)
        {
            // modified code here
        }
    
        protected function _renderMenu(Zend_Navigation_Container $container,
                                       $ulClass,
                                       $indent,
                                       $minDepth,
                                       $maxDepth,
                                       $onlyActive)
        {
            // modified code here
        }
    }
    

    你编辑了你的帖子吗?我的答案现在似乎与你的问题完全无关


    如果你说你需要改变什么,这会更容易。目前你的问题有点令人困惑

    我假设您希望在创建导航后编辑视图。如果您能够在创建它之前完成它,那么它就更容易了。下面这一点有点让人困惑,因为您通常会先更改选项

    // Get the helper navigation
    $navigation = $viewRenderer->
                           view->
                           getHelper( 'navigation' )
                          ->menu()
                          ->renderMenu(
                        $YOUR_NAVIGATION_OBJECT,                                
                        array(  'minDepth' => null,
                            'maxDepth' => null,
                            'onlyActiveBranch' => false,
                            'renderParents'    => false,
                            // More options here
    
    
                        )                           
    
    );
    
    请原谅这个凹痕,很难将其对齐

    请注意,我在上面使用了$YOUR\u NAVIGATION\u对象。只有在页面上使用多个导航时,才能使用该选项。否则,只能使用Render()而不是RenderMenu()

    发件人:

    编辑

    对不起,我没有看到你的解决方案,这正是我发布的


    但是为什么这不是菜单类的真正扩展呢?

    对于任何可能需要答案的人,我找到了一个更好的方法,可能是预期的方法

    您需要做的唯一一件事是创建自己的自定义视图辅助对象,扩展“Zend\u view\u helper\u Navigation\u HelperStract”,并将导航视图辅助对象的默认代理设置为您自己的

    例如

    (我正在更改菜单控制器操作中的默认代理,因为它已添加到操作堆栈)

    这样做之后,就可以在视图中使用它了

    <?= $this->navigation()->render(); ?>
    
    
    

    注意:您仍然需要重命名view helper类,但Zend中的view helper就是这样工作的(名称不应该冲突)。

    我编辑了我的帖子,以解决您对我的问题感到困惑的问题。我已经缩小了需要改变的范围。我原来的问题仍然是:“如何扩展Zend导航菜单视图帮助器?”我明白了。可以我会看一看,但我不知道这个问题的答案。我不明白为什么我不能像在Zend框架中的其他情况一样重复使用
    menu()
    函数和
    …\u menu
    类名。我必须使用不同的名称。我将接受您的解决方案作为答案,但我不介意您解释为什么在扩展视图帮助程序时我必须使用不同的名称。我不确定,但我认为这是由于Zend\u view\u helper\u Navigation->\uu call()/findHelper()方法导致的,该方法首先在Zend库中查找帮助程序。因此,要重用menu方法,可以调用parent::menu(…)。我试图更新到Zend Framework 1.12,但导航失败。我还没来得及重温,但也许你的解决方案能让我解决这个问题。谢谢
    class Admin_View_Helper_NavigationMenu extends
                                         Zend_View_Helper_Navigation_HelperAbstract {
    
        public function render(\Zend_Navigation_Container $container = null) {
            return "Hello world!!";
        }
    
    }
    
    $this->view->navigation()->setDefaultProxy("navigationMenu");
    
    <?= $this->navigation()->render(); ?>