2014-01-06 15 views
17

Anstatt diese Wiedergabe von jeder Folie in meinem TWIG wie dies zu tun (siehe Zeile 6):Wie Rendern TWIG-Ausgabe auf eine Variable für die spätere Verwendung (symfony2)?

{# 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 %} 

... Stattdessen würde Ich mag all diese Logik in der Steuerung zu halten, um nur zu der Lieferung Sehen Sie sich ein Array von fertigen Folien an. Wie kann ich etwas tun (siehe Zeile 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, 
       )); 
    } 

Alle es mir im Moment gibt (den Inhalt von $ content [$ i] [ 'html']) ist

{"headers":{}} 

Antwort

13

Es ist besser, wenn Sie include the template in the template, auf diese Weise halten Sie das Templating-Rendering in der Ansichtsebene und die Logik in der Controller-Schicht.

Aber gut, wenn man es wirklich will ...

können Sie 2-Dienste verwenden, das zu tun: twig die Twig_Environment oder templating.engine.twig verwendet, die in Symfony2 für Zweig ein Templat Schichtaufbau ist, kann dies leicht sein geschaltet templating.engine.php.

Wenn Sie den twig Service verwenden, können Sie the twig docs auf sehen, wie es zu benutzen:

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

Wenn Sie den templating.engine.twig Dienst finden the templating docs, wie man es verwenden, was fast genau das gleiche ist wie die Twig_Environment.

+0

Wie kann ich wissen, was den Weg zu in Bezug auf angeben? Wie "wo bin ich", wenn ich anfange, den Weg zu tippen, bin ich in www? in meinem App-Ordner? bin ich in meinem sym2project/web wie gewohnt (run von app.php?)? –

+0

@MattiasSvensson können Sie die Konstante '__DIR__' verwenden, die das Verzeichnis der PHP-Datei ist, die diese Konstante verwendet. Oder Sie können einen Vorlagen-Resolver verwenden (nicht sicher, wie dieser Dienst aufgerufen wird), um das bekannte 'Bundle: Controller: view'-Format in einen absoluten Pfad zu konvertieren –

+0

Ich habe versucht, __DIR__. '/../../ArchiveBundle/Resources/views/ aber es wirft mich nur einen Fehler, dass es die Vorlage nicht finden kann. Ich weiß, dass es da ist. Vielleicht ist die ../ hier nicht erlaubt? Ich habe auch versucht, den vollständigen Pfad manuell anzugeben (basierend auf dem Format von DIR), das in meinem Fall '/var/www/biztv/src/BizTV/ArchiveBundle/Resources/views/ContentTemplate/28/view.html.twig' aber ist Ich bekomme den gleichen Fehler = ( –

20

können Sie Inhalt Form Objekt wie folgt wiedergegeben erhalten:

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

Das liegt daran, dass $this->render() gibt ein Response Objekt. Verwenden Sie anstelle von $this->render()$this->renderView().

8

Innerhalb einer Zweig-Vorlage, können Sie den Wert eines gedruckten Variable wie folgt festgelegt:

{% set rendered %} 
    {{ var_to_print }} 
{% endset %} 
Verwandte Themen