如何在ZF2中设置2个导航



我有一个用于主导航链接的配置,第二个仅具有1个链接。主要导航工作正常,但是当我尝试在模块中设置A second 导航栏时:

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

我在视图中呈现错误时会出现错误:

致命错误:zend avaigation exception domainexception:zend avaigation page page mvc :: gethref不能执行为no zend mvc mvc router router routEstackAckinterface ins/home/home/cawa/cawa/www/sp-app/www/sp-app/www/sp-app/www/sp-app/www/sp-app/www/sp-app/www/sp-app/sp-app/供应商/zendframework/zendframework/library/zend/Zend/helper/navigation/avptracthelper.php在行471

问题是缺少的路由器(或更确切地说,ZendMvcRouterRouteStackInterface)。路由堆栈是路线的集合,可以使用路由名称将其转换为URL。基本上,它接受路由名称并为您创建URL:

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

这也发生在ZendNavigation的MVC页面内。该页面具有route参数,当有一个路由器可用时,该页面会组装其自己的URL(或以ZendNavigation项为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);
    }
  }
}

您看到的是递归功能,将路由器注入每个页面。乏味!因此,有一个工厂可以为您做这件事。有四个简单的步骤可以实现这一目标。

第一步

将导航配置放在模块配置中。就像您有default导航一样,您可以创建第二个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)和第二页(route-2)。

步骤两个

工厂将将其转换为导航对象结构,您需要首先创建一个类。在您的myModule/navigation/service目录中创建文件SecondaryNavigationFactory.php

namespace MyModuleNavigationService;
use ZendNavigationServiceDefaultNavigationFactory;
class SecondaryNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'secondary';
    }
}

请参阅我将名称secondary放在此处,该名称与您的导航密钥相同。

步骤三

您必须将此工厂注册到服务经理。然后,工厂可以做它的工作,并将配置文件转换为ZendNavigation对象。您可以在模块中进行此操作。config.php:

'service_manager' => array(
    'factories' => array(
        'secondary_navigation' => 'MyModuleNavigationServiceSecondaryNavigationFactory'
    ),
)

看到我在此处制作了服务secondary_navigation,然后在其中返回ZendNavigation实例。如果您现在这样做$sm->get('secondary_navigation'),您会看到那是ZendNavigationNavigation对象。

步骤四

告诉视图助手使用此导航,而不是默认的导航。导航视图助手接受"导航"参数,您可以在其中说明所需的导航。在这种情况下,服务经理具有服务secondary_navigation,这是我们需要的服务。

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

现在您将拥有此视图助手中使用的导航secondary

相关内容

  • 没有找到相关文章

最新更新