Как отключить HTML-экранирование меток в KnpMenuBundle

Я хочу сделать метку HTML следующим:

$menu->addChild('Dashboard', array(
    'route' => 'dashboard', 
    'label' => '<i class="fa-icon-bar-chart"></i><span class="hidden-tablet"> Dashboard</span></a>',
    'extra' => array('safe_label' => true)
    )
);

И я передаю правильный вариант при рендеринге:

{{ knp_menu_render('WshCmsHtmlBundle:Builder:mainMenu', {'allow_safe_labels': true} ) }}

Но мой ярлык все еще сбежал. Что я делаю не так?

Ответ 1

Хорошо, ответ:

Вы настраиваете дополнительные элементы в элементе меню не клавишей "extra", а клавишей "дополнительные". Поэтому, когда вы настраиваете элемент следующим образом:

$menu->addChild('Dashboard', array(
    'route' => 'dashboard', 
    'label' => '<i class="fa-icon-bar-chart"></i><span class="hidden-tablet"> Dashboard</span></a>',
    'extras' => array('safe_label' => true)
)
);

он отлично работает!

Ответ 2

Для этого есть два шага.

1. MenuBuilder

Вы должны установить safe_label в true в extras. Обратите внимание, что теперь вы можете написать HTML в своей метке.

$menu->addChild('Home<i><b></b></i>', array(
    'route' => 'homepage',
    'extras' => array(
        'safe_label' => true
    ),
));

2. Twig

Вы должны отфильтровать вывод knp_menu_render(), чтобы он печатал raw HTML (см. документация).

{{ knp_menu_render('main', {'allow_safe_labels': true}) | raw }}

Предупреждение

Помните, что это может быть опасно. В документации :

Используйте его с осторожностью, поскольку он может создавать некоторые отверстия XSS в приложении, если метка исходит от пользователя.

Ответ 3

Я использовал метод FyodorX для добавления сильного тега. Он работает как шарм, но я должен сказать, что необработанный фильтр не нужен

Ответ 4

Попробуйте использовать необработанный фильтр

{{ knp_menu_render('WshCmsHtmlBundle:Builder:mainMenu', {'allow_safe_labels': true} )|raw }}