5

この問題についてお聞きしたいです。Zend\Navigation\Navigation で動的メニューを作成するには何が必要ですか?

ZF1では、次のように作成しました:

$container = new Zend_Navigation();
$pages = array(
array(
    'label'  => 'Save',
    'action' => 'save',
),
array(
    'label'  => 'Delete',
    'action' => 'delete',
),
);
// add two pages
$container->addPages($pages);

そして、ビューで:

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

しかし、ZF2 のページは構成から取得しています。ここで \config\autoload\nav.global.php を作成し、ここでページ配列を作成します。しかし、メソッドでページ配列を実行し、それをナビゲーションヘルパーに送信する必要がありますが、方法がわかりません ((

私は自分のコントローラーでこれをやろうとしました:

use Zend\Navigation\Navigation;
$pages =array(
        // All navigation-related configuration is collected in the 'navigation' key
        'navigation' => array(
            // The DefaultNavigationFactory we configured in (1) uses 'default' as the sitemap key
            'default' => array(
                // And finally, here is where we define our page hierarchy
                'account' => array(
                    'label' => 'faq',
                    'route' => 'faq',
                    'pages' => array(
                        'news' => array(
                            'label' => 'news',
                            'route' => 'news',
                            ),
                            'manual' => array(
                            'label' => 'manual',
                            'route' => 'manual',
                            ),               
                    ),
                ),
            ),
        ),
    );
$Menu = new Navigation($pages);

そして、これを視野に入れます:

$this->Menu()->menu();

でもミスが多い…

あなたは私の問題を理解していると思います。助けてください。私の英語でごめんなさい。

4

5 に答える 5

2

背景によっては、この回答を別の質問で読むかもしれませんが、 Zend\Navigation. 要点は、MVC ページと Zend Framework 2 の MVC ページには、URL を組み立てて、URL がアクティブかどうかを確認する方法が必要だということです。

すべての MVC ページにはルート名があります。ルート スタックはリクエストをルーティングし、ルート マッチを取得します。このルート一致をナビゲーションに挿入する必要があります。これにより、すべてのページが一致したルートに対して独自のルートをチェックできるようになります。

URL アセンブリについても同様です。ルート名を URL に変換する場合は、ルート スタック (「ルーター」) が必要です。アプリケーションにもルーターを挿入すると、組み立てることができます。

要するに:

use Zend\Navigation\Service\ConstructedNavigationFactory;

class MyController extends AbstractActionController
{

  public function indexAction()
  {
    $config = array(
      // your config here
    );

    $factory    = new ConstructedNavigationFactory($config);
    $navigation = $factory->createService($this->getServiceLocator());

    return new ViewModel(array(
        'navigation' => $navigation;
    ));
  }
}

上記の回答と同様に、あなたの見解では:

<?php echo $this->navigation($navigation)->menu()?>
于 2012-11-06T08:56:43.843 に答える
1

私の以前の答えは正しくありません。次のコードは機能します。1ページ分。コントローラーで、アクションを編集します。

$page = new \Zend\Navigation\Page\Mvc(array(
    'route' => 'application/default',
    'controller' => 'album',
    'action'     => 'edit',
    'use_route_match' => true,
));

$r = $this->getEvent()->getRouter();
$rm = $this->getEvent()->getRouteMatch();
$page->setRouter($r);
$page->setRouteMatch($rm);

echo $page->isActive() ? 'true' : 'false'; // true
echo $page->getHref(); // /test_app/public/application/album/edit/id1
于 2013-06-23T17:18:34.347 に答える
0

そうする必要があります

コントローラーで

$pages = new \Zend\Navigation\Page\Mvc(array(
        'pages'=>
            array(
                'album' => array(
                    'label' => 'Album3',
                    'controller' => 'album',
                    'action' => 'edit',
                    'params' => array('id'=>2),
                    'route' => 'album/default',
                )
            )
));

$navigation = new \Zend\Navigation\Navigation();
$serviceLocator = $this->getServiceLocator()->get('Application');
$routeMatch  = $serviceLocator->getMvcEvent()->getRouteMatch();
$router      = $serviceLocator->getMvcEvent()->getRouter();
$pages->setRouteMatch($routeMatch);
$pages->setDefaultRouter($router);

$navigation->addPage($pages);

ビューで

<?php echo $this->navigation($this->navigation)->menu() ?>
于 2012-10-10T04:33:48.253 に答える
0

Eremiteの答えは本当に間違っていません。ここに記載されているすべての推奨事項をテストしましたが、実際には、デフォルト ルートに複数の child_routes がデフォルトとしてマークされている場合、メニューはアクティブ フラグを正しくマークしません。そのため、一致したルートをパラメーターとして渡す必要があります。しかし、おそらく私は何か間違ったことをしています。

乾杯

于 2013-05-16T15:14:03.693 に答える