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.
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
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
Pour mémoire, dans les nouvelles versions, vous devez utiliser l'URL absolue:
{{ render url('my_route_id', {'param': value}) }}
{{render (controller ("AcmeDemoBundle: Demo: topArticles", {'num': 10}))}}
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.
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,
]);
}