包含 HTML 个特殊字符的 KNP 菜单包
KNP Menu Bundle with HTML Special Chars
我在我的 Symfony2 项目中使用 KNP 菜单包并将我的菜单创建为服务。
我遇到了路由标签引号和其他特殊字符无法正确显示的问题。
举个例子:
Test Text & Stuff
将显示为 Test Text & Stuff
,我不知道如何处理它。
我正在创建如下路线:
$menu->addChild('seller', array(
'route' => 'routename',
'routeParameters' => $array,
'label' => $sellername
))->setLinkAttribute('class', 'dark-color active-hover');
我试着用这个命令来摆脱它:
- html_entity_decode()
- htmlspecialchars_decode()
- htmlspecialchars()
- html实体()
但他们都没有奏效。如果浏览器能正确地翻译它们,这没什么大不了的,但浏览器没有这样做是因为:
Test Text & Stuff
我的文字前后有很多空格,我不知道它是从哪里来的。我 trim 编辑了 $sellername
并且我还将 twig 中的 trim 命令添加到 knp_menu.html.twig
.
对我如何处理这种情况有什么建议吗?
编辑:
我现在想通了,如果我手动删除文本中的空格,文本将正确显示。我尝试用 javascript 来 trim 空格,但我现在没有成功。
编辑:
这是knp_menu.html.twig模板
{% extends 'knp_menu.html.twig' %}
{% block item %}
{% import "knp_menu.html.twig" as macros %}
{% if item.displayed %}
{%- set attributes = item.attributes %}
{%- set is_dropdown = attributes.dropdown|default(false) %}
{%- set icon = attributes.icon|default(false) %}
{%- set span = attributes.span|default(false) %}
{%- set spanContent = attributes.spanContent|default(false) %}
{%- set notification = attributes.notification|default(false) %}
{%- set divider_prepend = attributes.divider_prepend|default(false) %}
{%- set divider_append = attributes.divider_append|default(false) %}
{# unset bootstrap specific attributes #}
{%- set attributes = attributes|merge({'dropdown': null, 'icon': null, 'span': null, 'spanContent': null, 'notification': null, 'divider_prepend': null, 'divider_append': null }) %}
{%- if divider_prepend %}
{{ block('dividerElement') }}
{%- endif %}
{# building the class of the item #}
{%- set classes = item.attribute('class') is not empty ? [item.attribute('class')] : [] %}
{%- if matcher.isCurrent(item) %}
{%- set classes = classes|merge([options.currentClass]) %}
{%- elseif matcher.isAncestor(item, options.depth) %}
{%- set classes = classes|merge([options.ancestorClass]) %}
{%- endif %}
{%- if item.actsLikeFirst %}
{%- set classes = classes|merge([options.firstClass]) %}
{%- endif %}
{%- if item.actsLikeLast %}
{%- set classes = classes|merge([options.lastClass]) %}
{%- endif %}
{# building the class of the children #}
{%- set childrenClasses = item.childrenAttribute('class') is not empty ? [item.childrenAttribute('class')] : [] %}
{%- set childrenClasses = childrenClasses|merge(['menu_level_' ~ item.level]) %}
{# adding classes for dropdown #}
{%- if is_dropdown %}
{%- if item.level > 1 %}
{%- set classes = classes|merge(['dropdown-submenu']) %}
{%- else %}
{%- set classes = classes|merge(['dropdown']) %}
{%- endif %}
{%- set childrenClasses = childrenClasses|merge(['dropdown-menu']) %}
{%- endif %}
{# putting classes together #}
{%- if classes is not empty %}
{%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
{%- endif %}
{%- set listAttributes = item.childrenAttributes|merge({'class': childrenClasses|join(' ') }) %}
{# displaying the item #}
<li{{ macros.attributes(attributes) }}>
{%- if is_dropdown %}
{{- block('dropdownElement') -}}
{%- elseif item.uri is not empty and (not matcher.isCurrent(item) or options.currentAsLink) %}
{{- block('linkElement') -}}
{%- else %}
{{- block('spanElement') -}}
{%- endif %}
{# render the list of children#}
{{- block('list') -}}
</li>
{%- if divider_append %}
{{ block('dividerElement') }}
{%- endif %}
{% endif %}
{% endblock %}
{% block linkElement %}
<a href="{{ item.uri }}"{{ knp_menu.attributes(item.linkAttributes) }}>
{% if item.attribute('icon') is not empty %}
<i class="{{ item.attribute('icon') }}"></i>
{% endif %}
{{ block('label')|trim }}
{% if item.attribute('notification') is not empty %}
<span class="bagde"><icon class=" {{ item.attribute('notification') }}"></icon></span>
{% endif %}
{% if item.attribute('span') is not empty %}
<span class="{{ item.attribute('span') }}">{% if item.attribute('spanContent') is not empty %}{{ item.attribute('spanContent')}}{% endif %}</span>
{% endif %}
</a>
{% endblock %}
{% block dividerElement %}
{% if item.level == 1 %}
<li class="sidebar-divider"></li>
{% else %}
<li class="divider"></li>
{% endif %}
{% endblock %}
{% block dropdownElement %}
{%- set classes = item.linkAttribute('class') is not empty ? [item.linkAttribute('class')] : [] %}
{%- set classes = classes|merge(['dropdown-toggle']) %}
{%- set attributes = item.linkAttributes %}
{%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
{%- set attributes = attributes|merge({'data-toggle': 'dropdown'}) %}
<a href="#"{{ macros.attributes(attributes) }}>
{% if item.attribute('icon') is not empty %}
<i class="{{ item.attribute('icon') }}"></i>
{% endif %}
{{ block('label')|trim }}
{% if item.level <= 1 %} <b class="caret"></b>{% endif %}</a>
{% endblock %}
{% block label %}{{ item.label|trim|trans }}{% endblock %}
raw 是做什么的?
默认情况下,当在 Twig 中显示某些内容时(使用 {{ }}
),Twig 会对其进行转义以确保其安全。我们不希望任何邪恶 HTML 出现在我们的页面中。
有时候我们要显示的东西已经是HTML了,不想再转义了。这就是 raw
过滤器的用武之地!它告诉 twig 它只是 "filtered" 的东西已经转义了,我们想以原始形式使用它(例如,不再转义)。
如何使用 raw
block('label')
将渲染一个名为 "label" 的块。此渲染将完成 html-安全,这意味着它已被转义。
通过在另一个模板中显示它(通过{{ block('label') }}
),它将再次被转义。如果你不想这样,你应该使用 raw
过滤器:{{ block('label')|raw }}
必须使用raw
过滤器last,否则无效。所以如果你想trim渲染,先做:{{ block('label')|trim|raw }}
PS:即使在做一些更复杂的事情时,你仍然必须在最后使用 raw
作为一个整体。例如:{{ ('<span>' ~ block('label')|trim ~ '</span>')|raw }}
文档
在文档中阅读有关 raw filter, and escaper extension
的更多信息
我在我的 Symfony2 项目中使用 KNP 菜单包并将我的菜单创建为服务。
我遇到了路由标签引号和其他特殊字符无法正确显示的问题。
举个例子:
Test Text & Stuff
将显示为 Test Text & Stuff
,我不知道如何处理它。
我正在创建如下路线:
$menu->addChild('seller', array(
'route' => 'routename',
'routeParameters' => $array,
'label' => $sellername
))->setLinkAttribute('class', 'dark-color active-hover');
我试着用这个命令来摆脱它:
- html_entity_decode()
- htmlspecialchars_decode()
- htmlspecialchars()
- html实体()
但他们都没有奏效。如果浏览器能正确地翻译它们,这没什么大不了的,但浏览器没有这样做是因为:
Test Text & Stuff
我的文字前后有很多空格,我不知道它是从哪里来的。我 trim 编辑了 $sellername
并且我还将 twig 中的 trim 命令添加到 knp_menu.html.twig
.
对我如何处理这种情况有什么建议吗?
编辑:
我现在想通了,如果我手动删除文本中的空格,文本将正确显示。我尝试用 javascript 来 trim 空格,但我现在没有成功。
编辑:
这是knp_menu.html.twig模板
{% extends 'knp_menu.html.twig' %}
{% block item %}
{% import "knp_menu.html.twig" as macros %}
{% if item.displayed %}
{%- set attributes = item.attributes %}
{%- set is_dropdown = attributes.dropdown|default(false) %}
{%- set icon = attributes.icon|default(false) %}
{%- set span = attributes.span|default(false) %}
{%- set spanContent = attributes.spanContent|default(false) %}
{%- set notification = attributes.notification|default(false) %}
{%- set divider_prepend = attributes.divider_prepend|default(false) %}
{%- set divider_append = attributes.divider_append|default(false) %}
{# unset bootstrap specific attributes #}
{%- set attributes = attributes|merge({'dropdown': null, 'icon': null, 'span': null, 'spanContent': null, 'notification': null, 'divider_prepend': null, 'divider_append': null }) %}
{%- if divider_prepend %}
{{ block('dividerElement') }}
{%- endif %}
{# building the class of the item #}
{%- set classes = item.attribute('class') is not empty ? [item.attribute('class')] : [] %}
{%- if matcher.isCurrent(item) %}
{%- set classes = classes|merge([options.currentClass]) %}
{%- elseif matcher.isAncestor(item, options.depth) %}
{%- set classes = classes|merge([options.ancestorClass]) %}
{%- endif %}
{%- if item.actsLikeFirst %}
{%- set classes = classes|merge([options.firstClass]) %}
{%- endif %}
{%- if item.actsLikeLast %}
{%- set classes = classes|merge([options.lastClass]) %}
{%- endif %}
{# building the class of the children #}
{%- set childrenClasses = item.childrenAttribute('class') is not empty ? [item.childrenAttribute('class')] : [] %}
{%- set childrenClasses = childrenClasses|merge(['menu_level_' ~ item.level]) %}
{# adding classes for dropdown #}
{%- if is_dropdown %}
{%- if item.level > 1 %}
{%- set classes = classes|merge(['dropdown-submenu']) %}
{%- else %}
{%- set classes = classes|merge(['dropdown']) %}
{%- endif %}
{%- set childrenClasses = childrenClasses|merge(['dropdown-menu']) %}
{%- endif %}
{# putting classes together #}
{%- if classes is not empty %}
{%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
{%- endif %}
{%- set listAttributes = item.childrenAttributes|merge({'class': childrenClasses|join(' ') }) %}
{# displaying the item #}
<li{{ macros.attributes(attributes) }}>
{%- if is_dropdown %}
{{- block('dropdownElement') -}}
{%- elseif item.uri is not empty and (not matcher.isCurrent(item) or options.currentAsLink) %}
{{- block('linkElement') -}}
{%- else %}
{{- block('spanElement') -}}
{%- endif %}
{# render the list of children#}
{{- block('list') -}}
</li>
{%- if divider_append %}
{{ block('dividerElement') }}
{%- endif %}
{% endif %}
{% endblock %}
{% block linkElement %}
<a href="{{ item.uri }}"{{ knp_menu.attributes(item.linkAttributes) }}>
{% if item.attribute('icon') is not empty %}
<i class="{{ item.attribute('icon') }}"></i>
{% endif %}
{{ block('label')|trim }}
{% if item.attribute('notification') is not empty %}
<span class="bagde"><icon class=" {{ item.attribute('notification') }}"></icon></span>
{% endif %}
{% if item.attribute('span') is not empty %}
<span class="{{ item.attribute('span') }}">{% if item.attribute('spanContent') is not empty %}{{ item.attribute('spanContent')}}{% endif %}</span>
{% endif %}
</a>
{% endblock %}
{% block dividerElement %}
{% if item.level == 1 %}
<li class="sidebar-divider"></li>
{% else %}
<li class="divider"></li>
{% endif %}
{% endblock %}
{% block dropdownElement %}
{%- set classes = item.linkAttribute('class') is not empty ? [item.linkAttribute('class')] : [] %}
{%- set classes = classes|merge(['dropdown-toggle']) %}
{%- set attributes = item.linkAttributes %}
{%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
{%- set attributes = attributes|merge({'data-toggle': 'dropdown'}) %}
<a href="#"{{ macros.attributes(attributes) }}>
{% if item.attribute('icon') is not empty %}
<i class="{{ item.attribute('icon') }}"></i>
{% endif %}
{{ block('label')|trim }}
{% if item.level <= 1 %} <b class="caret"></b>{% endif %}</a>
{% endblock %}
{% block label %}{{ item.label|trim|trans }}{% endblock %}
raw 是做什么的?
默认情况下,当在 Twig 中显示某些内容时(使用 {{ }}
),Twig 会对其进行转义以确保其安全。我们不希望任何邪恶 HTML 出现在我们的页面中。
有时候我们要显示的东西已经是HTML了,不想再转义了。这就是 raw
过滤器的用武之地!它告诉 twig 它只是 "filtered" 的东西已经转义了,我们想以原始形式使用它(例如,不再转义)。
如何使用 raw
block('label')
将渲染一个名为 "label" 的块。此渲染将完成 html-安全,这意味着它已被转义。
通过在另一个模板中显示它(通过{{ block('label') }}
),它将再次被转义。如果你不想这样,你应该使用 raw
过滤器:{{ block('label')|raw }}
必须使用raw
过滤器last,否则无效。所以如果你想trim渲染,先做:{{ block('label')|trim|raw }}
PS:即使在做一些更复杂的事情时,你仍然必须在最后使用 raw
作为一个整体。例如:{{ ('<span>' ~ block('label')|trim ~ '</span>')|raw }}
文档
在文档中阅读有关 raw filter, and escaper extension
的更多信息