0

我正在尝试创建一个动态可重用菜单以在我的应用程序上使用。我有一个非常基本的路线,其中有 :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>

4

2 回答 2

1

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

我这样做:

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

于 2013-09-18T17:37:20.763 回答
0

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

模块.config.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);
于 2015-01-04T17:37:42.670 回答