2012-07-07 95 views
2

我在控制器中定義變量並將其傳遞給模板,但在extend塊中不可見。最重要的控制器代碼:Twig(Symfony2)在「擴展」塊中看不到變量

 $response['html'] = $this->renderView(
      'AldenXyzBundle:Profile:edit_ajax.html.twig', array(
       'isXmlHttpRequest' => $request->isXmlHttpRequest(), 
      ) 
     ); 

和嫩枝模板

{% extends isXmlHttpRequest ? '::base-ajax.html.twig' : '::base.html.twig' %} 

{% block content %} 
... 
{% endblock %} 

,我有例外Variable "isXmlHttpRequest" does not exist in ...而模板

{% extends '::base-ajax.html.twig' %} 

{% block content %} 
{{ dump(isXmlHttpRequest) }} 
... 
{% endblock %} 

運作良好,並顯示正確的$isXmlHttpRequest值。

我也是在模板直接嘗試:

{% extends app.request.isXmlHttpRequest ? '::base-ajax.html.twig' : '::base.html.twig' %} 

但我得到了一個異常說app is undefined

我使用的symfony v2.0.15和樹枝v1.8.2的

+0

從Twig 0.9.7開始可以使用此功能,你能檢查你使用的是什麼版本的樹枝嗎? – AdrienBrault 2012-07-07 10:25:31

+0

在文章正文中添加了答案。 – koral 2012-07-07 10:30:29

+0

您是否嘗試使用if語句而不是條件運算符? – 2012-07-07 14:15:51

回答

0

這將工作:

{% set layout = app.request.isXmlHttpRequest ? '::base-ajax.html.twig' : '::base.html.twig' %} 
{% extends layout %} 
+0

不知道,爲什麼這個答案被接受,但如果'應用程序'不能在'extends'中工作,layout應該如何工作? – KingCrunch 2013-03-29 21:56:58

+0

我不知道,爲什麼你在沒有測試的情況下投下我的答案? {%extends isXmlHttpRequest? ':: base-ajax.html.twig':':: base.html.twig'%}'不起作用,因爲'擴展除了一個字符串和樹枝不能正確解析。 – Besnik 2013-04-20 21:32:33

+1

工作得很好,問題是我們在extends語句中使用了條件語句。通過使用一個變量並在twg之前設置它只是讀取extends函數中的變量的值,而不是嘗試執行函數來獲取值。 – Chausser 2013-04-26 22:49:41

0

我面臨像KORAL同樣的問題,雖然貝斯尼克爲條件給出的解決方案聲明不適合我。我花了一段時間才發現原因是我使用了條件擴展{% extend ? : %}加上表單主題{% form_theme form _self %}的組合。

因此,在執行給定的解決方案後,我仍然收到一個異常,說var app(或者在我的情況下,var vars)未定義。但是,對於誰也面臨同樣問題的人:有一個解決方案:

創建枝杈功能,您可以在其中添加所有你的邏輯和物流,並在您的樹枝模板中使用它:

{% extends parent_template() %} 

關於這個問題有一個極好的post。在討論這個問題的symfony論壇中也可以看到post