2013-07-19 78 views
2

說我有一個基本模板這樣的擴展模塊:嫩枝:渲染Symfony2的控制器,這在父模板

// Default/index.html.twig 
{% block javascripts %} 
    <script>//some script</script> 
{% endblock %} 

<div> 
    {{ render(controller(MyControllerBundle:Default:header)) }} 
</div> 
{{ text }} 
<div> 
    {{ render(controller(MyControllerBundle:Default:footer)) }} 
</div> 

這使得有這些模板控制器:

// Default/header.html.twig 
Header content 
{% block javascripts %} 
    <script>//some additional scripts from the header</script> 
{% endblock %} 

// Default/footer.html.twig 
Footer content 
{% block javascripts %} 
    <script>//some additional scripts from the footer</script> 
{% endblock %} 

是否有可能以某種方式使用來自父te中呈現的子控制器的javascripts塊mplate? 我想讓所有的javascripts在一個地方累積。

自下而上渲染延伸是沒有選擇這裏,因爲模板組成,它通過不同的控制器呈現 多個塊。

這是可能以某種方式?還是有更好的方法呢?

+0

你真的需要控制,以使它們? –

+0

我想這將是最好的方法,因爲包含的模板中有一些buisness邏輯,並且因爲其中有些我認爲它們不能擴展基本模板,是嗎?你還有其他建議嗎? – acme

回答

0

@Pazi在評論中說:你需要一個控制器嗎?它看起來很簡單,僅僅包含模板本身,而不使用控制器。

您可以使用include標籤包括子模板。

{% include 'MyControllerBundle:Default:header.html.twig' %} 

爲了從呈現的子控制器重用JavaScript塊,您可以創建一個包含javascripts塊的基本模板。然後在頁眉和頁腳中擴展該基本模板文件。或者僅僅在其中包含基本模板也應該起作用。

+0

控制器中有一些業務邏輯不能用於父模板,所以我想除了在這裏使用控制器之外別無它法。 – acme

+0

哦......在這種情況下,只包含頁眉和頁腳模板不是一個選項。但其餘的答案可能仍然有幫助?這是否適合你? – UrGuardian4ngel

2

任何事情都是可能的,但從設計角度來看它可能不是一個好主意。

render標籤是真正有用的,當它歸結爲尺度,它作爲一種方式來隔離的要求。每個render調用都被認爲是一個子請求,並且緩存策略可以應用於它。 我強烈建議您閱讀這個documentation about HTTP caching,尤其是關於Edge Side Includes (or ESI)的部分。

當您使用render標籤,認爲它是要在多個頁面,並最終緩存包含的模塊。

因爲子請求被隔離緩存你不應該與主請求交互(取決於你嵌入渲染標籤的地方,主人要求會有所不同,這意味着你可能會得到一些意想不到的結果)。

首先,我想創建一個佈局模板,每一個其他網頁extends。佈局模板將聲明所有基本塊(javascript,css,footer,header,<head><body> - 如果需要,可以在更多模板中進行抽象)。

如果您的頁腳或頁眉有邏輯將它們拆分爲Twig函數(或過濾器),並處理Twig中的邏輯但保持輕量級(如果它太複雜或意大利麪條意味着有另一種方式)。

避免每頁有多個Javascript或CSS文件。如果某些頁面上顯示了一些css或javascript,但並非全部顯示,則將它們合併爲一個文件可能是一個好主意(客戶端的DNS調用較少,一旦緩存,加載頁面速度會更快) 。 如果你有一個administrator.js類文件,那麼你可以將它作爲一個單獨的文件包含,但如果大多數請求來自管理員,那麼你可能希望將其包含在所有其他文件中。

如果您不知道可以將資產(js或css)合併到一個文件中:更多信息請參閱Symfony documentation

我沒有回答你的「如何」問題,因爲我強烈建議你不要實施這樣的系統,但我相信我已經分享了很好的指導方針來做出明智的決定。

+0

托馬斯,非常感謝你解釋渲染函數背後的背景。我明白,另一種方法會更好。這裏的問題是,我有一些使用PHP作爲模板引擎的遺留代碼,現在我想將其轉換爲Twig。舊的PHP模板使用自定義函數,它基本上和Twigs渲染方法的功能相同。 – acme

1

延伸時/在嫩枝渲染等內容,你可以調用父塊:http://twig.sensiolabs.org/doc/functions/parent.html

這意味着你可以保留默認值,因爲它是和頁眉/頁腳中定義

{% block javascripts %} 
    {{ parent() }} 
    {# other scripts #} 
{% endblock javascripts %} 

我會建議你有不同的頁腳名稱 - 這樣你可以在頁眉之外加入腳本。

此外,它可能是最好的保持在一個地方的腳本 - 這樣你可以使用assetic重寫後來下了線:http://symfony.com/doc/current/cookbook/assetic/asset_management.html#including-javascript-files