我正在使用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通常是个坏主意