trauma
trauma

Reputation: 322

Symfony2 Why template rendered like string?

I use service for Menu render and other menu features. But when I render menu, instead html menu I receive menu like string. Why it happens?

I have service.

services:
    ad_backend.menu:
        class: AdBackendBundle\Services\MenuService
        arguments: [@doctrine.orm.entity_manager, @twig]

namespace AdBackendBundle\Services;


use Doctrine\ORM\EntityManager;

class MenuService
{
    private $em;
    private $twig;

    public function __construct(EntityManager $em, \Twig_Environment $twig)
    {
        $this->em = $em;
        $this->twig = $twig;
    }

    public function getMenuList()
    {
        return $this->em->getRepository('AdBackendBundle:AdMenu')->findAll();
    }

    public function renderMenuById($id)
    {
        $links = $this->em->getRepository('AdBackendBundle:AdMenu')->getLinksByMenuId($id);

        return $this->twig->render('AdBackendBundle:Menu:menu-template.html.twig', array(
            'links' => $links
        ));
    }

    public function renderMenuByName($name)
    {
        $links = $this->em->getRepository('AdBackendBundle:AdMenu')->getLinksByMenuName($name);

        return $this->twig->render('AdBackendBundle:Menu:menu-template.html.twig', array(
            'links' => $links
        ));
    }
}

menu-template.html.twig

<div id="menu-">
    {{ _self.renderMenu(links) }}
</div>

{% macro renderMenu(links) %}
    {% if links|length %}
        <ul>
            {% for link in links %}
                <li>
                    {% if link.route %}
                        <a href="{#{{ path(link.route) }}#}">{{ link.title }}</a>
                    {% elseif link.url %}
                        <a href="{{ link.url }}">{{ link.title }}</a>
                    {% endif %}
                    {% if link.children|length %}
                        {{ _self.renderMenu(link.children) }}
                    {% endif %}
                </li>
            {% endfor %}
        </ul>
    {% endif %}
{% endmacro %}

Basic page template for Backend:

{% extends "::base.html.twig" %}

{% block sidebar_left %}
    {{ menu.renderMenuByName('backend') }}
{% endblock %}

enter image description here

Upvotes: 2

Views: 78

Answers (1)

Rapha&#235;l Mali&#233;
Rapha&#235;l Mali&#233;

Reputation: 4002

All strings are html escasped by default, you need to use raw to prevent that:

{{ menu.renderMenuByName('backend')|raw }}

Upvotes: 3

Related Questions