首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Symfony和KNPmenu中包含参数的嵌套菜单

在Symfony和KNPmenu中包含参数的嵌套菜单
EN

Stack Overflow用户
提问于 2014-07-01 12:41:17
回答 1查看 3.3K关注 0票数 1

我很难用Symfony2和Knpmenu来构建一个处理以下内容的菜单:

  • 面包屑
  • 动态参数路由
  • 从不同的子菜单开始呈现单独的菜单

我的Menu/Builder.php文件如下所示(额外的位(如导航条、拉-nav等)是使用引导类处理呈现的mopa_bootstrap扩展的一部分):

代码语言:javascript
复制
namespace My\AppBundle\Menu;

use Knp\Menu\FactoryInterface;

class Builder
{
    public function mainMenu(FactoryInterface $factory, array $options)
    {
        $menu = $factory->createItem(
            'root', array(
                'navbar' => true,
                'pull-right' => true,
            )
        );

        // Main Menu -> Config
        // no link here, it's just a placeholder
        $dropdown = $menu->addChild(
            'Config', array(
                'dropdown' => true,
                'caret' => true,
            )
        );

        // Menu -> Config -> User
        $dropdown2 = $dropdown ->addChild(
            'User', array(
                'route' => 'user',
            )
        );

        // Secondary Menu -> Edit (but child of Menu -> Config -> User)
        $dropdown2->addChild(
            'Edit',
            array(
                'route' => 'user_edit',
                'routeParameters' => array('name' => $options['id']),
            )
        );

这样做的目的是让主菜单只打印前两个级别,并在其他地方呈现一个单独的菜单,允许用户在编辑/删除/查看该特定元素的任何视图之间移动。

我想要达到的是,有一个单一的结构,这样就可以处理育儿结构,不仅要在菜单上有积极的签名父母,而且还要能够处理一个工作的面包屑结构。

Resources/views/base.html.twig中,我调用主菜单如下:

代码语言:javascript
复制
{{ mopa_bootstrap_menu('MyAppBundle:Builder:mainMenu', {depth: 2}) }}

理想情况下,子菜单是这样的:

代码语言:javascript
复制
{% set id = app.request.attributes.get('id') %}
{% if app.request.attributes.get('_route') starts with 'user_' %}
    {% set menu = knp_menu_get('MyAppBundle:Builder:mainMenu', ['User'], {'id': id }) %}
    {{ knp_menu_render(menu) }}
{% endif %}

然而:

  1. 当呈现主菜单时,菜单返回错误,因为没有定义$options['id']
  2. 我仍然无法呈现辅助菜单(因此,通过传递参数'User') --页面只是在该块中返回一个黑色输出

这个方法正确吗?我用的是"knplabs/knp-menu": "2.0.*@dev""symfony/symfony": "2.5.*"

EN

回答 1

Stack Overflow用户

发布于 2014-07-01 13:48:38

事实证明,使用这种方法可以有效地访问$request,并在MenuBuilder.php文件中添加条件,只有在某些条件下才能提示子子项。

最终代码如下所示:

代码语言:javascript
复制
// Menu/MenuBuilder.php

namespace My\AppBundle\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\HttpFoundation\Request;

class MenuBuilder
{
    private $factory;

    /**
     * @param FactoryInterface $factory
     */
    public function __construct(FactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public function createMainMenu(Request $request)
    {
        $menu = $this->factory->createItem(
            'root', array(
                'navbar' => true,
                'pull-right' => true,
            )
        );

    // Main Menu -> Config
    // no link here, it's just a placeholder
    $dropdown = $menu->addChild(
        'Config', array(
            'dropdown' => true,
            'caret' => true,
        )
    );

    // Menu -> Config -> User
    $dropdown2 = $dropdown ->addChild(
        'User', array(
            'route' => 'user',
        )
    );

    // Secondary Menu -> Edit (but child of Menu -> Config -> User)
    // Skip this part if we are not in the relevant page, thus to avoid errors
    if (false !== strpos($request->get('_route'), 'user_') && $request->get('id')):
    $dropdown2->addChild(
        'Edit',
        array(
            'route' => 'user_edit',
            'routeParameters' => array('id' => $request->get('id')),
        )
    );
    endif;

和服务配置文件:

代码语言:javascript
复制
// Resources/config/services.yml

services:
    my_app.menu_builder:
        class: My\AppBundle\Menu\MenuBuilder
        arguments: ["@knp_menu.factory"]

    my_app.menu.main:
        class: Knp\Menu\MenuItem
        factory_service: my_app.menu_builder
        factory_method: createMainMenu
        arguments: ["@request"]
        scope: request
        tags:
            - { name: knp_menu.menu, alias: main }

然后是Resources/views/base.html.twig模板:

代码语言:javascript
复制
// Main menu
{% set menu = knp_menu_get('main', ['Config', 'Users'], {'id': id }) %}
{{ knp_menu_render(menu) }}

// Secondary menu
{% if app.request.attributes.get('_route') starts with 'user_' %}
    {% set menu = knp_menu_get('main', ['Config', 'Users'], {'id': id }) %}
    {{ mopa_bootstrap_menu(menu, {'automenu': 'navbar'}) }}
{% endif %}

解决办法似乎是可行的,但如果你有一个更好的方法,请告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24510573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档