如何显示不同URL的不同菜单-Symfony 2


How to show different menus for different urls - Symfony 2

我正在使用Symfony2开发一个项目的前端。我有一些简单的东西,但这会花费我很多时间。

layout.html.twig位于/FrontBundle/Resources/views,具有以下行

 {% include 'SitewebFrontBundle::sidemenu.html.twig' %}
 {% block sidemenu %}{% endblock %}

sidemenu.html.twig也位于/FrontBundle/Resources/views中。

侧菜单根据所查看的页面有不同的内容。网址是:

address.com/menu1/...
address.com/menu2/...
address.com/menu3/...

我想做的是在sidemenu.html.twig上创建一个语句,遵循如下逻辑:

if {{ app.request.requesturi }} has /menu1/
   show menu1 
else if {{ app.request.requesturi }} has /menu2/
   show menu2
else
   show menu3

关于如何做到这一点,有什么想法吗?

您还可以使用KnpMenuBundle。然后创建将所有菜单合并到一个根目录下。例如:制作一个类似的菜单

Menu
    menu1
       foo
    menu2
    ...

然后进行一个分支扩展,将request注入其中,并找到必须显示的分支(菜单):

//in your extension class:
findBranch(){
    $path = $this->request->getPathInfo();
    $path = trim($path, '/');
    $parts = explode('/', $path);
    $branch = $parts[0];
    return $branch;
}

然后在模板中使用扩展找到活动分支,并使用内置方法

进行渲染

通过传递的参数生成sidemenut.html.twig

# sidemenu.html.twig
{% if requestUri is not defined %}
    {% set requestUri = 'menu3' %}
{% endif %}
# render your routes here like so:
<a href="{{ path('route-name-1', {menu: requestUri}) }}">Route 1</a>
# ...

现在包括参数为的sidemenu.html.twig

# this will result in the requestUri variable to be menu1:
{% include 'SitewebFrontBundle::sidemenu.html.twig' with {includeUri: 'menu1'} %}
# use the request uri as a parameter:
{% include 'SitewebFrontBundle::sidemenu.html.twig' with {includeUri: app.request.requesturi} %}
# this will fallback to 'menu3':
{% include 'SitewebFrontBundle::sidemenu.html.twig' %}

欲了解更多问题,请查看:

  • 关于包含模板的文档
  • 关于包含与渲染的评估

为什么不能将所有菜单放在一个分支中,并将它们包含在一个变量中,以确定应该使用什么菜单?或者,您可以从控制器向模板发送所需的名称。因为将这样的逻辑放入trick通常是个坏主意