6

次のナビゲーションがあるとします。

Home
Internal
    Folders
        New Folder
    Configuration
        Categories
            New
        Tags
            New
        Options
            New
    Contact
External

このメニューを表示するために私のlayout.phtmlで使用したコード:

$internal = $this->navigation('navigation')->findOneByLabel('Internal');
echo $this->navigation('navigation')
          ->menu()
          ->setUlClass('nav nav-list')
          ->setMaxDepth(1)
          ->renderMenu($internal);

したがって、次のように表示されます。

Folders
    New Folder
Configuration
    Categories
    Tags
    Options
Contact

現時点では、すべての親と最初の子を表示する適切なメニューを取得しているため、「新しい」ナビゲーションは表示されません。

ただし、「カテゴリ」ページにいる場合は、子供も表示したいので、「カテゴリ」の下の「新規」が次のように表示されている必要があります。

Folders
    New Folder
Configuration
    Categories
        New
    Tags
    Options
Contact

これを試すために多くの方法を試し、layout.phtml でメニューに指定できるすべてのオプション (setMinDepth、setMaxDepth、renderSubMenu、setParentMenu) をチェックしましたが、成功しませんでした。それは「新規」が含まれているか、含まれていないかのどちらかであり、その中間ではありません。

ZF2 に関するドキュメントでは、部分的な作成以外に、このサブ メニューを機能させる方法について何も教えてくれません。

では、パーシャルを作成することはこれに対する唯一のオプションですか?

前もって感謝します!

4

1 に答える 1

1

少し前の小さなプロジェクトのために、私は本当に簡単な修正として何かを作りました。コードをクリーンアップして構成可能にすることを計画していますが、同じことを必要とする別のプロジェクトに到達することはありません.

TL;DR: 通常の zf2 ビュー ヘルパーは使用できませんが、表示する「トップ」レベルのページ (この場合は内部) を検索し、そのページの下にメニューを表示する必要があります。

<?php

namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;

class SubNavigation extends AbstractHelper
{
    public function __invoke($class = null)
    {
        $view = $this->getView();
        $menu = $view->navigation()->menu();

        $container = $view->navigation()->getContainer();
        $active    = $view->navigation()->setRenderInvisible(true)->findActive($container);

        if (!$active) {
            return;
        }

        $container = $active['page'];
        $depth     = $active['depth'];

        while (0 !== $depth) {
            $container = $container->getParent();
            $depth--;
        }

        $visible = $container->isVisible();
        $html    = $menu->setContainer($container->setVisible(true))
                        ->setUlClass('')
                        ->setOnlyActiveBranch(false)
                        ->setMinDepth(null)
                        ->setMaxDepth(null)
                        ->render();

        $container->setVisible($visible);

        if (strlen($html)) {
            return sprintf('<ul %s><li%s><a href="%s">%s</a>%s</li></ul>',
                    (null !== $class) ? ' class="' . $class . '"' : null,
                    ($container->isActive())? ' class="active"' : null,
                    $container->getHref(),
                    $container->getLabel(),
                    $html);
        }
    }
}

このビュー ヘルパーは、「Internal」をsprintf()呼び出しのトップ メニュー項目としてレンダリングしますが、この動作は簡単に変更できます。エコーするだけ$htmlで、実際に必要なものになります。

于 2013-04-19T21:54:51.293 に答える