【问题标题】:Zend_Navigation rendering submenu with partialZend_Navigation 用局部渲染子菜单
【发布时间】:2024-05-20 16:00:02
【问题描述】:

我已经发布了对我的问题的修改。在处理它时,我注意到这个问题很容易简化。 我需要我的子菜单的自定义格式,所以我必须使用部分。但是问题就来了。

以下代码显示了错误级别 (0):

            echo $this->navigation()->menu()
                ->setMinDepth(1)
                ->setMaxDepth(1)
                ->setRenderParents(false)
                ->setOnlyActiveBranch(true)
                ->renderPartial(null, array('partials/menu.phtml', 'default'));

以下代码显示了正确的菜单级别 (1)

            echo $this->navigation()->menu()
                ->setMinDepth(1)
                ->setMaxDepth(1)
                ->setRenderParents(false)
                ->setOnlyActiveBranch(true)
                ->render();

有什么想法吗?伙计们请。我将不胜感激!

编辑

我的部分/menu.phtml:

    foreach ($this->container as $page) 
{
    $active = $page->isActive();
    echo '<div class="item">';
        echo '<a class="'. ($active ? 'active' : '') .'" href="' . $this->baseUrl($page->getHref()) . '">' . $page->getLabel() . '</a>';
    echo '</div>';
}

编辑 2

我对 Zend_Navigation 的理解是,先准备容器,再通过部分。

            $nav = $this->navigation()->menu()->setOnlyActiveBranch(true)->getContainer();
        echo $this->navigation()->menu()->renderPartial($nav, array('/partials/menu.phtml', 'default'));

在容器中设置set{Min/Max}Depth, parentRendering的意义何在?

【问题讨论】:

  • 你的部分实际上是做什么的?菜单助手的所有这些选项实际上并没有传递给部分,你只是得到导航容器。
  • Partial 完成所有的格式化。我不能使用 UL 标记,需要自定义 html 标记。我认为 partial 只是更改 minDepth、maxDepth、renderParents 等渲染的步骤。有什么想法可以组合它吗?我发布了部分示例。

标签: zend-framework zend-navigation


【解决方案1】:

我使用这个代码:

<?=$this->navigation()->menu()->renderPartial(null, 'shared/menu.phtml')?>

您应该将true 传递给$page-&gt;isActive(true) 方法,这样它也可以深入发挥作用。

在你的部分

foreach ($this->container as $page) {
  $active = $page->isActive(true);
  if (count($page->getPages())) {
    foreach ($page->getPages() as $subPage) {
      $active = $subPage->isActive(true);
      echo '<div class="item">';
        echo '<a class="'. ($active ? 'active' : '') .'" href="' . $this->baseUrl($subPage->getHref()) . '">' . $subPage->getLabel() . '</a>';
      echo '</div>';      
    }
  }
}

在第二个 foreach 之前,您可以添加一个检查是否以及何时显示子菜单。

我的 2 美分。

编辑

试试这个:

$partial = array('partials/menu.phtml', 'default');
echo $this->navigation()->menu()
  ->setMinDepth(1)
  ->setMaxDepth(1)
  ->setRenderParents(false)
  ->setOnlyActiveBranch(true)
  ->setPartial($partial)
  ->render();

【讨论】:

  • 还是不太懂你。你会扩展你的意思是过滤子菜单的可能性吗?我不知道该怎么做。花了2天时间。请看看我的第二次编辑。
  • 我将它与我的部分一起使用,但它不起作用。它显示零级别,就像设置深度没有影响一样。
  • 上面的代码不起作用。下面,我给你来自 Zend 库的 render()。你的代码和我的完全一样。 public function render(Zend_Navigation_Container $container = null) { if ($partial = $this-&gt;getPartial()) { return $this-&gt;renderPartial($container, $partial); } else { return $this-&gt;renderMenu($container); } }
【解决方案2】:

在寻找同一问题的答案时遇到了这个问题。查看 Zend_View_Helper_Navigation_Menu 的代码后,看起来没有任何视图助手选项被传递到视图部分,尽管我不明白为什么它们不能......(在 ZF 1.12 中看看Zend_View_Helper_Navigation_Menu 的第 736 行,唯一传递的是容器本身,选项数组可以很容易地与它一起传递,或者容器预过滤,可能值得向 ZF 提交功能请求)

这些选项纯粹是过滤 Zend_Navigation_Container 以使用默认的renderMenu 方法进行渲染的一种方式。正如您所说,您似乎可以通过首先过滤容器然后将其作为renderPartial 方法的第一个参数传递来完成同样的事情

【讨论】:

    【解决方案3】:

    在您的主视图中

    在导航配置中找到子菜单的容器。然后使用所述部分回显此容器。

    $pages = $this->navigation()->findOneBy('label', 'Label of your submenu');
    echo $this->navigation()->menu()->renderPartial($pages,module/partials/menu.phtml');
    

    在部分(module/partials/menu.phtml)中

    自定义。此示例遍历您选择的容器的*页面。

    foreach ($this->container as $page) {
     echo $this->navigation()->menu()->htmlify($page) . PHP_EOL;
    }
    

    【讨论】: