我有一个用于主导航链接的配置,第二个仅具有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
。