2013-01-04 48 views
10

我想了解Twig如何通過AJAX加載模板。 從他們的網站,它是清楚如何加載模板(http://twig.sensiolabs.org/doc/api.html)AJAX調用如何與TWIG工作

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

但如何將這項工作的AJAX調用?你如何告訴Twig你想'渲染'只是index.html的一部分......而不是重新加載整個頁面?我查看了Twig的唯一Ajax示例(http://twig.sensiolabs.org/doc/recipes.html),但這並不能解釋Twig如何知道要更改的頁面的哪一部分。假設您的Ajax調用導致頁面內容更新。我只需要一個簡單的例子,比Twig的配方頁面上的更多。

+0

它不知道。如果你想更新頁面的塊,那麼只渲染需要更新的塊。這有時被稱爲「部分」。 – Charles

+0

你有沒有可以指點我的例子? – user1082428

+0

Code,no。程序,是的。將主要模板分割成[可包含]的內容(http://twig.sensiolabs.org/doc/tags/include.html)。您可以獨立渲染它們以獲取ajax請求,並將它們內聯包含在主頁面上。理論上。自從我最後與Twig一起工作了一段時間以後,這就是爲什麼我不會發布這個答案。 – Charles

回答

8

有幾種方法來實現這一目標:

1)分離您的index.html在幾個文件中像index.html,然後content.html。 然後使用index.html中的include函數來包含content.html。

例子:

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')); 

編輯: 如果你使用jQuery做你的Ajax請求,例如:

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

2)使用request.ajax布爾在您的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 %} 

不確定關於第二個,但是這應該對文檔起作用。最好的方法是第一個解決方案,分開你的代碼。

+0

我嘗試使用request.ajax和Twig拋出一個錯誤,它不存在,所以我必須在服務器端生成該錯誤,對嗎?它不是一個枝條全局變量。 – user1082428

+1

我終於明白了,我自己的榜樣現在可以工作。謝謝大家! – user1082428

+1

你會如何將isAjaxRequest()或變量傳遞給Twig模板? –

9

直接在模板:

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