web-dev-qa-db-fra.com

Comment rendre TWIG en sortie dans une variable pour une utilisation ultérieure (symfony2)?

Au lieu de faire ce rendu de chaque diapositive dans mon TWIG comme ceci (voir ligne 6):

{# loop out the slides #}
{% for c in contents %}
    {% set i=i+1 %} {# increase slide number #}
    <div id="slide{{ i }}" class="slide" style="z-index:{{ i }};">
        {# the slide itself, rendered by it's own template #}
        {% include 'BizTVArchiveBundle:ContentTemplate:'~c.template~'/view.html.twig' with {'contents': c, 'ordernumber': i} %} 
    </div>
{% endfor %}

... Au lieu de cela, je voudrais garder toute cette logique dans le contrôleur, pour simplement fournir à la vue un tableau de diapositives prêtes. Comment puis-je faire quelque chose comme ça (voir ligne 9):

    //do stuff...
    foreach ($container->getContent() as $c) {
                $content[$i]['title'] = $c->getTitle();
                $content[$i]['sort'] = $c->getSortOrder();
                $content[$i]['data'] = $c->getData();
                $content[$i]['template'] = $c->getTemplate()->getId();
                $content[$i]['duration'] = $this->extract_seconds($c); 

                $content[$i]['html'] = $this->render('BizTVArchiveBundle:ContentTemplate:'.$content[$i]['template'].'/view.html.twig', array(
                    'contents'=> $content[$i],
                    'ordernumber' => 99,
                ));
    }

Tout ce que cela me donne pour le moment (le contenu de $ content [$ i] ['html']) est

{"headers":{}}
19
Matt Welander

Il est préférable que vous incluez le modèle dans le modèle , de cette façon, vous conservez le rendu des modèles dans la couche de vue et la logique dans la couche de contrôleur.

Mais bon, si tu le veux vraiment ...

Pour ce faire, vous pouvez utiliser 2 services: twig utilise le Twig_Environment ou templating.engine.twig qui est une couche de modèles construite dans Symfony2 pour Twig, cela peut être facilement commuté ot templating.engine.php.

Si vous utilisez le service twig, vous pouvez voir le twig docs sur la façon de l'utiliser:

$template = $this->get('twig')->render('/full/path/to/Resources/views/'.$content[$i]['template'].'/view.html.twig', array(...));

Si vous utilisez le templating.engine.twig service, voir les modèles de documentation sur la façon de l'utiliser, qui est presque exactement le même que le Twig_Environment.

15
Wouter J

Vous pouvez obtenir un objet rendu sous forme de contenu comme ceci:

$this->render('BizTVArchiveBundle:ContentTemplate:Some.html.twig', array())->getContent();
23
Liutas

Dans un modèle twig, vous pouvez définir la valeur d'une variable imprimée comme ceci:

{% set rendered %}
  {{ var_to_print }}
{% endset %}
12
joachim

En effet, $this->render() renvoie un objet Response. Au lieu de $this->render(), utilisez $this->renderView().

4
Strnm