简体   繁体   中英

Print a variable that contains html and twig on a twig template

I have a variable suppose that is: $menustr; this variable contains code html and some twig parts for example:

$menustr .= '<li><a href="{{ path("'. $actual['direccion']  .'") }}" >'. $actual['nombre'] .'</a></li>';

I need that the browser take the code html and the part of twig that in this momen is the "{{ path(~~~~~) }}"

I make a return where i send the variable called "$menustr" and after use the expresion "raw" for the html code but this dont make effective the twig code.

This is te return:

return $this->render('::menu.html.twig', array('menu' => $menustr));

and here is the template content:

{{ menu | raw }}

Twig can't render strings containing twig. There is not something like an eval function in Twig 1. .

What you can do is moving the path logic to the PHP stuff. The router service can generate urls, just like the path twig function does. If you are in a controller which extends the base Controller , you can simply use generateUrl :

$menuString .= '<li><a href="'.$this->generateUrl($actual['direction'].'">'. $actual['nombre'] .'</a></li>';

return $this->render('::menu.html.twig', array(
    'menu' => $menuString,
));

Also, when using menu's in Symfony, I recommend to take a look at the KnpMenuBundle.


EDIT: 1. As pointed by @PepaMartinec there is a function which can do this and it is called template_from_string

您可以使用template_from_string函数渲染存储在变量中的Twig模板。

Check this bundle: https://github.com/LaKrue/TwigstringBundle This Bundle adds the possibility to render strings instead of files with the Symfony2 native Twig templating engine:

$vars = array('var'=>'x');
// render example string
$vars['test'] = $this->get('twigstring')->render('v {{ var }} {% if var is defined %} y {% endif %} z', $vars);
// output
v x y z

In your case i would be:

return $this->render('::menu.html.twig', array(
    'menu' => $this->get('twigstring')->render($menustr, $vars)
));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM