【问题标题】:ZF2 Nav replace Params in viewZF2 Nav 替换视图中的参数
【发布时间】:2015-01-05 01:37:42
【问题描述】:

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

【问题讨论】:

    标签: navigation zend-framework2


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

    【讨论】:

      【解决方案2】:

      这是我的解决方案,但是一团糟……

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多