ZF2 导航替换视图中的参数



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

这是我的路线

'item' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/Item/',
                'defaults' => array(
                    '__NAMESPACE__' => 'ReserveAnythingItemController',
                    '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 添加到路由中)。我解决了向导航对象添加部分的问题。您可以在此处找到相关信息。

我是这样做的:

模块配置.php

(...)
'template_map' => array(
    'navigation' => __DIR__ . '/../view/module/navigation.phtml',
(...)

布局

//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 ZendViewHelperUrl 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 导航菜单类生成的菜单代码,请从浏览器中复制它并调整您的部分。或者,您可以根据需要使用您在问题中发布的输出。

这是我的解决方案,但这是一个肮脏的混乱......

模块配置.php

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

页面.phtml

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

最新更新