【问题标题】:How do I extend the Zend Navigation Menu View Helper?如何扩展 Zend Navigation Menu View Helper?
【发布时间】:2011-01-22 19:25:52
【问题描述】:

我需要更改Zend_View_Helper_Navigation_Menu 的输出。我找到了需要修改的两个函数,并且我知道如何进行所需的更改。我不知道的是如何让 Navigation 对象使用我的视图助手而不是 Zend 。

代表我的类扩展的代码 sn-p:

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

修改以澄清

我想更改 <li> 元素的类并删除 EOL 和缩进。菜单视图脚本没有执行此操作的选项,这就是我必须扩展它的原因。

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

$navTable = new Default_Model_Site_DbTable_Navigation();
$view = $this->getResource('view');
$view->navigation(new Zend_Navigation($navTable->getNavigation()));

在我的布局中呈现菜单:

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

解决方案

我通过如下重命名它来工作,但我不清楚为什么我不能重载/覆盖 _Menu 类和 menu() 函数。

  1. 将类名改为My_View_Helper_Navigation_MyMenu
  2. myMenu 函数添加到类(return parent::menu($container);
  3. 在布局中调用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
    }
}

【问题讨论】:

    标签: php zend-framework zend-view zend-navigation


    【解决方案1】:

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

    您唯一需要做的就是创建自己的自定义视图助手,扩展“Zend_View_Helper_Navigation_HelperAbstract”并将导航视图助手的默认代理设置为您自己的。

    例如

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

    注意:您仍然需要重命名视图助手类,但这就是 Zend 中视图助手的工作方式(名称不应该发生冲突)。

    【讨论】:

    • 我尝试更新到 Zend Framework 1.12,但我的导航坏了。我没有时间重新审视它,但也许你的解决方案可以让我解决这个问题。谢谢!
    【解决方案2】:
       $view->addHelperPath(
          APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
          'MyApp_View_Helper_'
          );
    
    
    echo $this->navigation()->myMenu(); // name of your class
    

    发件人:Getting Zend_Navigation menu to work with jQuery's Fisheye

    编辑

    抱歉,我没有看到您的解决方案,这正是我发布的内容。

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

    【讨论】:

    • 我不明白为什么我不能像在 Zend 框架中的其他情况下那样重用 menu() 函数和 ..._Menu 类名。我必须使用不同的名称。
    • 我会接受你的解决方案作为答案,但如果你解释了为什么我在扩展视图助手时必须使用不同的名称,我不介意。
    • 我不确定,但我认为这是由于 Zend_View_Helper_Navigation->__call() / findHelper() 方法首先在 Zend 库中查找帮助程序。因此,要重用菜单方法,您可以调用 parent::menu(...)。
    【解决方案3】:

    您是否编辑了您的帖子?现在看来我的回答与您的问题完全无关?


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

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

    // 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_NAVIGATION_OBJECT。仅当您在页面上使用多个导航时才使用它。否则,您只需使用 Render() 而不是 RenderMenu()。

    【讨论】:

    • 我编辑了我的帖子,以解决您对我的问题令人困惑的担忧。我已经缩小了我需要改变的范围。我最初的问题仍然存在:“如何扩展 Zend Navigation Menu View Helper?”
    • 我明白了。好的。我会看看,但我想我不知道这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多