Navigation 视图中的ZF2 Nav replace参数

Navigation 视图中的ZF2 Nav replace参数,navigation,zend-framework2,Navigation,Zend Framework2,我正在尝试创建一个动态的可重用菜单,以便在我的应用程序上使用。我有一个非常基本的路由,其中有:id,它表示记录id。在子菜单中,我希望这个:id动态替换为用户当前正在与之交互的记录。有关完整的详细信息,请参见下文 这是我的路线 'item' => array( 'type' => 'Literal', 'options' => array( 'route' => '/Item/',

我正在尝试创建一个动态的可重用菜单,以便在我的应用程序上使用。我有一个非常基本的路由,其中有:id,它表示记录id。在子菜单中,我希望这个:id动态替换为用户当前正在与之交互的记录。有关完整的详细信息,请参见下文

这是我的路线

'item' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/Item/',
                'defaults' => array(
                    '__NAMESPACE__' => 'ReserveAnything\Item\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '[:action][/][:id]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'id'        => '[0-9]+',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
这是我的导航文件

return array(
'navigation' => array(
    'default' => array(
        'overview' => array(
            'label' => 'Edit Item',
            'route' => 'item/default',
            'action' => 'Edit',
            'params' => array(
                'id' => 0,
            )

        ),
        'extras' => array(
            'label' => 'Manage Extras',
            'route' => 'item/default',
            'action' => 'Extras',
            'params' => array(
                'id' => 0,
        ),
    ),
),
))

最后是我的观点

echo $this->navigation('navigation')->menu();
现在这个的输出是

<ul class="navigation">
<li>
    <a href="/Item/Edit/0">Edit Item</a>
</li>
<li>
    <a href="/Item/Extras/0">Manage Extras</a>
</li>

现在,如果我在Id 0上,这将是完美的,但是如果我在Id 1(/Item/Edit/1)上,它显然仍然会出现在上面的示例中。如何获取菜单以更新配置中的Id。我想这是可以做到的。我编辑记录Id 1时的理想输出是

   <ul class="navigation">
<li>
    <a href="/Item/Edit/1">Edit Item</a>
</li>
<li>
    <a href="/Item/Extras/1">Manage Extras</a>
</li>

当我想要一个允许每个登录用户更改其数据的导航项(我需要将用户id添加到路由中)时,我遇到了一个类似的问题。我解决了这个问题,在导航对象中添加了一个部分。你可以找到这方面的信息

我是这样做的:

module.config.php

(...)
'template_map' => array(
    'navigation' => __DIR__ . '/../view/module/navigation.phtml',
(...)
return array(
'navigation' => array(
    'default' => array(
        'overview' => array(
            'label'  => 'Edit Item',
            'route'  => 'item/default',
            'action' => 'Edit',
            'params' => array(
                'id' => '99',
            ),
        ),
    ),
),
);
布局

//GET THE PARTIAL
$partial = array( 'navigation', 'module' );

//APPLY THE PARTIAL TO THE MENU (THE NAV CLASS WILL USE IT TO RENDER IT)
$this->navigation( 'admin_navigation' )->menu()->setPartial( $partial );

//WRITE THE MENU
echo $this->navigation( 'admin_navigation' )->menu()
部分文件

此文件中的$this对象将包含一个Zend\View\Model\ViewModel类,该类具有一个包含所有页面的数组。你可以像我一样获得其他信息。我使用ZfcUser模块,可以通过$this->zfcUserIdentity()获取记录的用户id

//I GET THE Zend\View\Helper\Url CLASS TO CREATE THE ROUTE AS USUAL
$url = $this->getHelperPluginManager()->get( 'url' );

//LOOP ALL THE PAGES IN THE 'admin_navigation' NAVIGATION MENU
foreach ( $this->container as $page ) {

    //USE YOUR CUSTOM HTML TO CREATE THE MENU ITEM

    //WHEN I GET TO THE NAVIGATION ITEM WHERE I NEED TO ADD A PARAMETER...
    (...)
    $href = $url( $page->getRoute(), array( 'userId' => $this->zfcUserIdentity()->getId();
    (...)
}

就这些。如果您喜欢zf2导航菜单类生成的菜单代码,请从浏览器中复制该代码并调整您的部分设置。或者,您也可以使用您在问题上发布的输出,如您所愿

这是我的解决方案,但这是一个肮脏的烂摊子

module.config.php

(...)
'template_map' => array(
    'navigation' => __DIR__ . '/../view/module/navigation.phtml',
(...)
return array(
'navigation' => array(
    'default' => array(
        'overview' => array(
            'label'  => 'Edit Item',
            'route'  => 'item/default',
            'action' => 'Edit',
            'params' => array(
                'id' => '99',
            ),
        ),
    ),
),
);
page.phtml

$renderNav = $this->navigation()->menu()->render();
echo str_replace('99', $item->getId(), $renderNav);