在我的网站上,我有一个带有指向不同 Controller 的链接的导航栏。 到目前为止,我一直在使用 jquery 来突出显示当前页面的链接,但不知何故事情变得更加复杂并且已经不够了。
所以我的问题是:在导航栏上突出显示当前页面链接的最佳做法是什么? - 将链接的 ID 作为参数传递到模板中? - 不需要修改每个 Controller 的响应的更自动化的东西?
最佳答案
假设您可以将当前页面与您数据库中的 ID 相匹配,并且您正在为您的网站使用基本模板。我建议你可以这样做:
base.twig.html
{% import "somemacros.twig.html" as macros %}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="IE=Edge"/>
<title>{{ title | default('') }}</title>
<!-- ************** Metas ************** -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="container">
<div id="sidebar_left">
<!-- Just to be lazy -->
{{ macros.menu(links) }}
</div>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
somemacros.twig.html
{% macro menu(links, class) %}
{% if not links is empty %}
{% for link in links %}
{% if link['selected'] is defined and link['selected'] %}
{% set is_selected = true %}
{% else %}
{% set is_selected = false %}
{% endif %}
<li{%if class != '' %} class="{{ class }}"{% endif %}>
<a href="{{ link.getRoute }}" {% if link.PageId in selected_page_ids or link.hasPublicChildren or is_selected %} class="{% if link.PageId in selected_page_ids or is_selected %}selected{% endif %} {%if link.hasPublicChildren%}dropdown{%endif%}"{% endif %}>{{ link.name }}</a>
{% if link.hasPublicChildren %}
<ul>
{{ _self.menu(link.getPublicChildren) }}
</ul>
{% endif %}
</li>
{% endfor %}
{% endif %}
{% endmacro %}
PHP 逻辑
<?php
// ...
// register twig
// find out current page / page parents if u are using submenu's
// ...
$twig->addGlobal('selected_page_ids', $page_ids); //page_ids is an array of the selected page ids
// run symfony
将当前 $page_id
的变量(在我的例子中是 $page_ids
,因为我有子菜单)作为全局变量添加到 twig
您现在可以在任何地方访问此 var,甚至在宏内部。正如您在我的菜单宏中看到的那样,我然后使用 {% if link.PageId in selected_page_ids
添加我选择的类。有宏是因为我懒
关于jquery - symfony2 Twig : best pratice for highlighting a navbar when on the right page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27295334/