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

时间:2014-10-07 21:51:42

标签: php symfony twig

我正在使用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

关于如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:0)

通过传递的参数生成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' %}

有关更多问题,请查看:

答案 1 :(得分:0)

您也可以使用KnpMenuBundle。然后在一个root.e.g下创建合并所有菜单:制作一个像

这样的菜单
Menu
    menu1
       foo
    menu2
    ...

然后创建一个twig extension,将request注入其中,找到必须显示的分支(菜单):

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

}

然后在您的模板中使用扩展名找到活动分支,并使用built-in method

进行渲染

答案 2 :(得分:0)

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