ZF2 Nav在视图中替换Params

时间:2013-09-18 01:22:57

标签: navigation zend-framework2

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

2 个答案:

答案 0 :(得分:1)

当我想要一个允许每个登录用户更改其数据的导航项时,我遇到了类似的问题(我需要添加到用户ID的路​​径)。我解决了它为导航对象添加一个局部。您可以找到有关here的信息。

我是这样做的:

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

答案 1 :(得分:0)

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

<强> module.config.php

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);