如何扩展Zend导航菜单视图助手?

10
我需要更改Zend_View_Helper_Navigation_Menu的输出。我已经找到了我需要修改的两个函数,并且知道如何进行所需更改。但我不知道如何使导航对象使用我的视图助手而不是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
    }
}

澄清编辑

我想更改<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
    }
}
3个回答

3
   $view->addHelperPath(
      APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
      'MyApp_View_Helper_'
      );


echo $this->navigation()->myMenu(); // name of your class

来源: 如何使用jQuery的鱼眼效果实现Zend_Navigation菜单

编辑

抱歉我没有看到您的解决方案,它与我发布的完全一样。

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


1
我不明白为什么在Zend Framework的其他情况下可以重复使用'menu()'函数和'..._Menu'类名,但在这种情况下却不能。我必须使用另一个名称。 - Sonny
我将接受您的解决方案作为答案,但如果您能解释一下为什么在扩展视图助手时必须使用不同的名称,那就更好了。 - Sonny
我不确定,但我认为这是由Zend_View_Helper_Navigation->__call() / findHelper()方法引起的,该方法首先在Zend库中查找帮助程序。因此,要重用菜单方法,您可以调用parent::menu(...)。 - Keyne Viana

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,结果我的导航出了问题。我还没有时间重新审视它,但也许你的解决方案能帮我解决这个问题。谢谢! - Sonny

0

你修改了帖子吗?看起来我的回答现在完全与你的问题无关了?


如果你说出需要改变的内容,那么就会更容易理解。目前你的问题有点令人困惑。

我假设你想在创建导航之后编辑视图。如果你能在创建之前就编辑,那就更容易了。下面这一部分有点令人困惑,因为通常你会事先更改选项。

// 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菜单视图助手?” - Sonny
我知道了。好的。我会看一下,但我不认为我知道这个问题的答案。 - Layke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接