11

メインのナビゲーションリンクと 1 つのリンクだけの 2 番目の構成があります。メイン ナビゲーションは正常に動作していますが、次のようにモジュールで2 番目のナビゲーション バーを設定しようとすると、次のようになります。

$config = $e->getApplication()->getServiceManager()->get('config');
$navigation = new \Zend\Navigation\Navigation($config['navigation_footer']);
$e->getApplication()->getServiceManager()
    ->setService('new_navigation', $navigation);`

ビューでレンダリングするとエラーが発生します。

致命的なエラー: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref は実行できません。Zend\Mvc\Router\RouteStackInterface インスタンスが /home/cawa/www/sp-app/vendor/zendframework に構成されていないためです。 /zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php 行 471

4

1 に答える 1

43

問題はルーターがないことです(より正確には、Zend\Mvc\Router\RouteStackInterface)。ルートスタックはルートのコレクションであり、ルート名を使用してそれをURLに変換できます。基本的に、ルート名を受け入れ、URLを作成します。

$url = $routeStack->assemble('my/route');

これは、のMVCページ内でも発生しZend\Navigationます。ページにはrouteパラメーターがあり、使用可能なルーターがある場合、ページはそれ自体のURL(またはZend\Navigation用語ではhref)をアセンブルします。ルーターを指定しないと、ルートをアセンブルできないため、例外がスローされます。

ナビゲーションのすべてのページにルーターを挿入する必要があります。

$navigation = new Navigation($config);
$router     = $serviceLocator->get('router');

function injectRouter($navigation, $router) {
  foreach ($navigation->getPages() as $page) {
    if ($page instanceof MvcPage) {
      $page->setRouter($router);
    }

    if ($page->hasPages()) {
      injectRouter($page, $router);
    }
  }
}

ご覧のとおり、これは再帰関数であり、ルーターをすべてのページに挿入します。面倒!したがって、これを行うための工場があります。これを実現するには、4つの簡単な手順があります。

第一歩

最初に、ナビゲーション構成をモジュール構成に入れます。ナビゲーションがあるのと同じようにdefault、2番目のナビゲーションを作成できますsecondary

'navigation' => array(
    'secondary' => array(
        'page-1' => array(
            'label' => 'First page',
            'route' => 'route-1'
        ),
        'page-2' => array(
            'label' => 'Second page',
            'route' => 'route-2'
        ),
    ),
),

route-1最初のページ( )と2番目のページ()へのルートがありますroute-2

ステップ2

ファクトリはこれをナビゲーションオブジェクト構造に変換します。最初にそのためのクラスを作成する必要があります。SecondaryNavigationFactory.phpMyModule / Navigation/Serviceディレクトリにファイルを作成します。

namespace MyModule\Navigation\Service;

use Zend\Navigation\Service\DefaultNavigationFactory;

class SecondaryNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'secondary';
    }
}

ここに名前を付けsecondaryました。これはナビゲーションキーと同じです。

ステップ3

このファクトリをサービスマネージャに登録する必要があります。その後、ファクトリはその作業を実行し、構成ファイルをZend\Navigationオブジェクトに変換できます。module.config.phpでこれを行うことができます:

'service_manager' => array(
    'factories' => array(
        'secondary_navigation' => 'MyModule\Navigation\Service\SecondaryNavigationFactory'
    ),
)

secondary_navigationここでサービスを作成したところを参照してください。ファクトリはZend\Navigationインスタンスを返します。ここ$sm->get('secondary_navigation')で実行すると、それがオブジェクトであることがわかりZend\Navigation\Navigationます。

ステップ4

ビューヘルパーに、デフォルトのナビゲーションではなく、このナビゲーションを使用するように指示します。ナビゲーションビューヘルパーは、必要なナビゲーションを指定できる「navigation」パラメーターを受け入れます。この場合、サービスマネージャーにはサービスがsecondary_navigationあり、それが必要なサービスです。

<?= $this->navigation('secondary_navigation')->menu() ?>

secondaryこれで、このビューヘルパーでナビゲーションを使用できるようになります。

于 2012-10-19T11:57:54.210 に答える