1

我在 Symfony2 项目中使用 KNP Menu Bundle 并将我的菜单创建为服务。

我的问题是路线标签引号和其他特殊字符无法正确显示。

举个例子:

Test Text & Stuff将显示为Test Text & Stuff,我无法弄清楚如何处理它。

我正在创建如下路线:

$menu->addChild('seller', array(
    'route' => 'routename',
    'routeParameters' => $array,
    'label' => $sellername
))->setLinkAttribute('class', 'dark-color active-hover');

我试图用这个命令来摆脱它:

  1. html_entity_decode()
  2. htmlspecialchars_decode()
  3. htmlspecialchars()
  4. htmlentities()

但他们都没有工作。如果浏览器能够正确翻译它们,这没什么大不了的,但是浏览器没有这样做:

                 Test Text & Stuff                     

我的文字前后有很多空白,我不知道它是从哪里来的。我修剪了 twig$sellername并将修剪命令添加到knp_menu.html.twig.

有什么建议我可以如何处理这种情况?

编辑:

我现在发现的是,如果我手动从文本中删除空格,则文本将正确显示。我试图用 javascript 修剪空格,但我现在还没有成功。

编辑:

这是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 %}
4

1 回答 1

3

生的有什么作用?

默认情况下,当在 Twig 中显示某些内容时(使用{{ }}),Twig 会对其进行转义以确保其安全。我们不希望任何邪恶的 HTML 出现在我们的页面中。

有时我们想要显示的东西已经是 HTML,所以我们不想再次转义它。这就是raw过滤器的用武之地!它告诉 twig 它刚刚“过滤”的东西已经被转义了,我们想以它的原始形式使用它(例如不再转义它)。

如何使用原始数据

block('label')将渲染一个名为“label”的块。此渲染将在 html-safe 中完成,这意味着它已被转义。

通过在另一个模板中显示它(通过做{{ block('label') }}),它将再次被转义。如果你不想要这个,你应该使用raw过滤器:{{ block('label')|raw }}

过滤器raw必须最后使用,否则无效。因此,如果要修剪渲染,请先执行此操作:{{ block('label')|trim|raw }}

PS:即使做一些更精细的事情,你仍然必须使用raw最后一个整体。例如:{{ ('<span>' ~ block('label')|trim ~ '</span>')|raw }}

文档

在文档中阅读有关原始过滤器转义器扩展的更多信息

于 2015-07-02T20:49:38.433 回答