web-dev-qa-db-fra.com

Comment charger une fonction de contrôleur et la rendre dans une balise twig en utilisant Symfony2?

J'utilise Symfony2 et Twig. J'ai une fonction (ci-dessous) dans mon contrôleur qui renvoie un texte spécifique. Est-il possible d'appeler cette fonction directement à partir de mon modèle et de changer le {{text}} de mon modèle en celui que la fonction retourne, éventuellement via Ajax?

Voici ma fonction:

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

Une autre fonction de contrôleur appelle la fonction ci-dessus et rend mon modèle:

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

Dans mon modèle, j'utilise:

{{ text }}

pour afficher la valeur.

20
Mike

Vous pouvez utiliser ajax si vous avez des données dynamiques, mais d'après ce que je peux voir dans vos brèves informations, vous pouvez toujours exécuter cette fonction de contrôleur directement depuis votre vue:

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

Plus d'informations à ce sujet disponibles sur: http://symfony.com/doc/2.0/quick_tour/the_view.html , sous Embedding other Controllers

23
Stelian

Dans Symfony 2.2, cela a été changé.

La signature et les arguments de la balise de rendu ont changé.

Avant:

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

Après:

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

ou

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

Remarque: La fonction est la méthode préférée.

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

36
Dan Blows

Pour mémoire, dans les nouvelles versions, vous devez utiliser l'URL absolue:

{{ render url('my_route_id', {'param': value}) }}
9
Mateo Tibaquira

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

7
iamtankist

Dans Silex, je l'ai résolu comme ceci:

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

Si vous n'avez pas le nom de l'itinéraire, l'URL peut être utilisée:

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

Si vous utilisez une URL, nous devons toujours concaténer la baseUrl.

4
Raptor

Symfony 2.6+

en brindille:

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

manette:

/**
 * 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,
    ]);
}
2
ivan.proskuryakov