2011-11-27 12 views
18

Estoy usando Symfony2 y Twig. Tengo una función (a continuación) en mi controlador que devuelve un texto específico. ¿Es posible llamar a esa función directamente desde mi plantilla y cambiar el {{text}} en mi plantilla a lo que devuelve la función, posiblemente a través de Ajax?¿Cómo cargar una función de controlador y representarla en una etiqueta de rama utilizando Symfony2?

Aquí es mi función:

public function generateCode($url) { 
    $url = $_SERVER['SERVER_NAME'] . '/embed/' . $url; 
    $return = '<iframe>'.$url.'</iframe>'; 
    return $return; 
} 

Otra función del controlador llama a la función anterior y hace que mi plantilla:

public function getCodeAction($url) { 
    $text = $this->generateCode($url); 
    return $this->render('MyMyBundle:User:code.html.twig', array('text' => $text)); 
} 

En mi plantilla que estoy usando:

{{ text }} 

para mostrar el valor.

Respuesta

22

Usted puede usar Ajax si tiene datos dinámicos, pero por lo que puedo ver desde su breve información, siempre se puede ejecutar esa función del controlador directamente desde su punto de vista:

{% render "MyMyBundle:User:generateCode" with { 'url': 'your url here' } %} 

Más información sobre este disponible at: http://symfony.com/doc/2.0/quick_tour/the_view.html, en Incrustar otros controladores

+0

Gracias. Funcionó, solo tuve que jugar un poco con el método de renderizado, ahora incluso Ajax funciona sin problemas. ¡Gracias! – Mike

+3

@Mike ¿Qué quieres decir con jugar? – k0pernikus

36

En Symfony 2.2, esto se ha modificado.

La firma y los argumentos de la etiqueta de renderización han cambiado.

Antes:

{% render 'BlogBundle:Post:list' with { 'limit': 2 }, { 'alt': BlogBundle:Post:error' } %}

Después:

{% render controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error' } %}

o

{{ render(controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error'}) }}

Nota: La función es la forma preferida.

Ver https://github.com/symfony/symfony/blob/2.2/UPGRADE-2.2.md

+13

para evitar confusiones: '{{render (controller (...}}' es la función –

9

Para el registro, en las nuevas versiones es necesario utilizar la URL absoluta:

{{ render url('my_route_id', {'param': value}) }} 
+1

Esta respuesta debe marcarse como correcta – Chris

+1

No es correcta. {{}} No {%%} – RichieHH

7

{{render (controlador ("AcmeDemoBundle: Demo: topArticles", {' num ': 10}))}}

4

En Silex me lo resolvió así:

{{ render(url('route_name', {'param': value})) }} 

Si usted no tiene el nombre de la ruta, URL se puede utilizar:

{{ render(app.request.baseUrl ~ '/some-path/' ~ value) }} 

Si se utiliza el URL que debe siempre concat la baseUrl.

1

Symfony 2.6+

en ramita:

{{ render(controller('AppBundle:PropertySearch:featuredProperties', {'limit': 15})) }} 

controlador:

/** 
* featuredPropertiesAction 
* 
* @param Request $request 
* @param int $limit 
* 
* @return Response 
*/ 
public function featuredPropertiesAction(Request $request, $limit) 
{ 
    $search = $this->resultsHelper->featuredSearch($limit); 

    return $this->render('HASearchBundle::featured_properties.html.twig', [ 
     'search' => $search, 
    ]); 
} 
Cuestiones relacionadas