2013-01-04 11 views
10

Ich versuche zu verstehen, wie Twig eine Vorlage über AJAX laden kann. Von ihrer Website, ist es klar, wie eine Vorlage zu laden (http://twig.sensiolabs.org/doc/api.html)Wie funktioniert AJAX Anrufe mit TWIG

echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here')); 

Aber wie würde diese Arbeit für eine Ajax-Aufruf? Wie würdest du Twig sagen, dass du etwas "rendern" willst, das nur ein Teil von index.html ist ... und nicht die gesamte Seite neu laden? Ich habe Twigs einziges Ajax-Beispiel angeschaut (http://twig.sensiolabs.org/doc/recipes.html), aber das erklärt nicht, wie Twig weiß, welchen Teil der Seite Sie ändern möchten. Angenommen, Ihr Ajax-Aufruf führt zu Aktualisierungen der Seiteninhalte. Ich brauche nur ein einfaches Beispiel, etwas mehr als das, was auf Twigs Rezept Seite ist.

+0

Er weiß nicht. Wenn Sie einen Chunk der Seite aktualisieren möchten, rendern Sie nur den Chunk, der aktualisiert werden muss. Dies wird manchmal als "teilweise" bezeichnet. – Charles

+0

Haben Sie ein Beispiel, auf das Sie mich hinweisen könnten? – user1082428

+0

Code, Nr. Verfahren, ja. Segmentieren Sie Ihre Hauptvorlage in Dinge, die [eingeschlossen] werden können (http://twig.sensiolabs.org/doc/tags/include.html). Sie können sie unabhängig für Ajax-Anfragen rendern und sie einfach auf der Hauptseite einfügen. In der Theorie. Es ist eine Weile her, seit ich mit Twig zuletzt gearbeitet habe, weshalb ich das hier nicht als Antwort veröffentliche. – Charles

Antwort

8

Es gibt mehrere Möglichkeiten, das zu erreichen:

1) Trennen Sie index.html in mehrere Dateien wie index.html und content.html. Dann verwenden Sie include Funktion in index.html, um content.html einzuschließen.

Beispiel:

if(isAjaxRequest()) //try to find the right function here 
    echo $twig->render('content.html', array('the' => 'variables', 'go' => 'here')) 
else 
    echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here')); 

Edit: Wenn Sie Ihre Ajax-Request zum Beispiel mit jQuery tun:

$.get('yoururl', function(data) { 
    $('#divtoremplace').html(data); 
}); 

2) Verwenden Sie die request.ajax boolean in Ihrer index.html

{% if request.ajax == false %} 
<p>My header, not reloaded with ajax</p> 
{% endif %} 

<p>My content, reloaded with ajax</p> 

{% if request.ajax == false %} 
<p>Other content, not reloaded with ajax</p> 
{% endif %} 

Nicht sicher über die zweite, aber dies sollte den Trick gemäß der Dokumentation tun. Der beste Weg ist die erste Lösung, trennen Sie Ihren Code.

+0

Ich versuchte mit request.ajax und Twig warf einen Fehler, dass es nicht existiert, also muss ich das auf der Serverseite erzeugen, richtig? Es ist keine globale Variable. – user1082428

+1

Ich bekomme es endlich, und mein eigenes Beispiel funktioniert jetzt. Danke allen! – user1082428

+1

Wie würden Sie isAjaxRequest() oder eine Variable an Twig-Vorlage übergeben? –

9

Direkt in der Vorlage:

{% if app.request.isXmlHttpRequest() %} 
    // code if ajax request 
{% else %} 
    // code if not ajax request 
{% endif %}